Pass the Passkey: A Novel Attack Surface in Passwordless Authentication

Executive Summary

This article analyzes new attack classes against passwordless authentication, focusing on Google’s synced passkey ecosystem and the Cloud Authenticator used by desktop clients. The attacks demonstrate how malware on a compromised endpoint can misuse onboarding, recovery and device trust workflows to take over passkey-protected accounts. We show how an attacker can authenticate without user interaction, bypass user verification requirements and extract all synced passkey private keys.

After decades of breaches and billions in losses, the attack vectors that defined the era of passwords and shared secrets are finally starting to fade. Passkeys replace passwords and traditional multi-factor authentication (MFA) with public-key cryptography, decreasing entire classes of attacks that have dominated the threat landscape for years.

With no shared secret to steal, reuse or phish, many of an attacker’s most reliable tools are becoming obsolete. This represents a significant disruption for the credential theft market.

Attackers, however, persist. They evolve, and defenders must prepare for a new generation of attacks. As passkeys become widely adopted and scale to billions of accounts, defenders must prepare for new attack surfaces, some of which we disclose in our research.

This article is part 3 in our series examining passkey adoption from a security perspective. If you haven’t read the previous parts, we recommend starting here:

Part 1: The Art of the Invisible Key – Passkey Global Breakthrough

Part 2: Google Authenticator: The Hidden Mechanisms of Passwordless Authentication

Palo Alto Networks customers are better protected from this new attack vector through the following products and services:

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics Google Authenticator, Cloud, Malware

Setting the Stage

Google’s synced passkey implementation is particularly instructive due to its scale and how it creates a higher standard for private key protection in two critical ways:

  • Private keys are generated and used within a cloud-enclave isolation environment
  • Hardware-backed, client-device-bound keys control access to cloud-based cryptographic operations, attesting to the user’s presence on a trusted device

This article builds on the architectural analysis from Part 1 and Part 2 of our previous articles in this series. We now shift from how passkeys are built and deployed to how attackers can misuse them.

We present three novel attacks that enable account takeover of passkey-protected accounts. Each attack challenges a different core assumption of passkey authentication security. When a client authenticates with a passkey, the following is expected:

  • Users provide explicit consent on the device to verify user presence
  • For MFA, users must also unlock the device to verify biometric (i.e., something you are) or knowledge-based (i.e., something you know) authentication factors
  • Passkey private keys cannot be shared or copied

The Google documentation reflects these core assumptions, describing the passkey login process as a secure alternative to passwords (as shown in Figure 1).

A screenshot of Google Account Help page explaining passkeys. It highlights that passkeys are more secure than passwords as they cannot be shared, copied, or accidentally given away. Using a passkey to sign in ensures access to your device and its unlocking.
Figure 1. Google documentation describes passkeys as requiring device access, device unlock, and non-shareable credentials.

Challenging these expectations is a category of attacks we've nicknamed Pass-ta-key. This playful, layered name blends the word passkey and the phrase “pass the key,” with a light nod to the concept of plate of pasta, illustrating how tangled this key implementation can get.

These attacks each expose a different weakness in practice:

  • Pass-ta-key attack: An attacker takes over an account protected by a Google-synced passkey using malware running on the victim’s device, without requiring privilege escalation, device unlock or user interaction
  • Silver Pass-ta-key attack: An attacker deceives the Google Cloud Authenticator into believing the victim has unlocked the device with biometrics, leading to full account takeover without using the victim’s device during authentication
  • Golden Pass-ta-key attack: An attacker can extract all synced passkeys in a form that allows them to be shared or sold on the credential black market

These attacks demonstrate how malware can exploit synced passkeys, even when providers add hardware-backed protections to secure credentials within the cloud authenticator.

Disclaimer: This research involved responsible and ethical security analysis. We responsibly disclosed all presented exploits. The cloud authenticator model is used by various passkey providers across multiple browsers and platforms. This work, however, focuses on Google Password Manager in Chrome on Windows, specifically on devices equipped with a Trusted Platform Module (TPM). All presented attacks rely on malware already existing on the victim’s device during the initial stage.

Stage Zero: Reconnaissance

Before attempting any of the attacks, the attacker needs visibility into how passkeys are used within the victim’s account. On a compromised endpoint, this visibility is readily available.

Chrome locally stores synced passkey data as part of its synchronization process. On Windows, Chrome persists this data as proto-encoded WebauthnCredentialSpecifics records, which represent synced WebAuthn credentials, within its sync database:

%LocalAppData%\Google\Chrome\User Data\<Profile>\Sync Data\LevelDB

Accessing these records does not require elevated privileges. The records allow an attacker to enumerate where the victim uses passkeys, along with associated usernames, credential identifiers and the encrypted private key.

After identifying a service where the victim uses passkeys, an attacker can attempt to authenticate as the victim.

The primary challenge for attackers is bypassing the protection of the private key, which is used to sign authentication challenges. This private key is secured by a master key. While an encrypted version of this master key is stored on each client device, only the cloud authenticator can decrypt it.

Despite this security, the architecture remains vulnerable to exploitation. The following sections detail methods attackers could use to exploit system mechanisms, authenticate as the victim, and compromise passkey-secured accounts.

Device Identity Impersonation: The Pass-Ta-Key Attack

Our first attack is the most straightforward approach, which involves taking over a passkey-protected account by mimicking the behavior of Google Password Manager and Chrome during legitimate authentication. In a normal flow, Chrome sends a request to the cloud authenticator, signed using the device’s hardware-backed keys.

Unlike a legitimate user flow that requires user interaction and device unlock, this attack shows how malware can obtain the required signature silently, without user consent, biometrics, device unlock or elevated privileges.

To understand this, we focus on Chrome’s device identity key, which represents client device possession to the cloud authenticator. As previously explained (part 2: Login with Synced Passkey and Device Key Signature), generating the required assertion involves signing data sent to the cloud authenticator using one of the device’s hardware-backed keys. This is the identity key or the user verification key (UV key).

Although both keys are hardware-bound, they are not accessed in the same way. For the identity key, Chrome creates the conditions that allow it to request a signature while running as a user without elevated privileges and without triggering device unlock protections.

On Windows, Chrome calls the NcryptCreatePersistedKey function without assigning a key name, making the TPM-backed key ephemeral and preventing it from being persisted to disk. Instead of storing the private key within the TPM, Chrome calls NcryptExportKey to export the key as an NCRYPT_OPAQUE_KEY_BLOB, which instructs the TPM to encrypt the private key using a TPM-resident key. The resulting blob is stored as wrapped_identity_private_key in the passkey_enclave_state file, making it available for future use on the same physical TPM.

Malware can extract this wrapped_identity_private_key from disk or Chrome’s memory. It can then invoke cryptographic operations using standard Windows Cryptography API: Next Generation (CNG) APIs (NCryptOpenStorageProvider, NCryptImportKey, NCryptSignHash), without elevated privileges, mimicking Chrome’s own actions.

Having established that malware can generate the required signature, we now detail the full Pass-ta-key attack flow (as shown in Figure 2). This flow allows a remote attacker with unprivileged malware on the victim’s device to authenticate as the victim.

A flowchart illustrating a security process involving four entities: Relying Party, Attacker, Infected Victim, and Cloud Authenticator. The chart shows interactions like "Log in with passkey," "Noise NX handshake," and "Identity Key Signature". The process moves horizontally with lines and arrows indicating the flow of steps.
Figure 2. Pass-ta-key attack flow.

The attack flow consists of the following phases:

  1. After collecting the victim’s synced passkey records (Stage Zero: Reconnaissance), the attacker selects a targeted account and initiates a passkey login
  2. The relying party responds with a fresh authentication challenge
  3. The attacker initiates a WebSocket handshake with the Google Cloud Authenticator
  4. Using the hash of that handshake, the attacker interacts with the victim’s TPM and uses the extracted identity key to sign the handshake hash together with the assertion request
  5. The attacker sends an assertion request to the cloud authenticator, including the identity key signature
  6. From the cloud authenticator’s perspective, the request appears to be a trusted device making a valid request, so it produces a valid assertion response
  7. This assertion is then forwarded to the relying party, completing authentication and giving the attacker full control of the victim’s account

Video 1 demonstrates the attack as it would unfold in practice. (We have blurred the names of the relying parties to avoid naming.)

Video 1. Example of a successful Pass-ta-key attack.

As the video begins, the screen splits between the attacker's terminal and the victim's desktop. The video first shows the attacker establishing a command-and-control (C2) listener, passively waiting for victims to connect.

On the victim’s machine, the Trojan executes as a standard user, without elevated privileges. Once active, it collects the victim’s encrypted, synced passkeys and sends them back to the attacker’s C2 server. This provides visibility into the victim’s available passkeys.

The attacker selects a target, such as a messaging application account protected by a passkey, navigates to the application and chooses Login with passkey. The relying party then responds with a fresh authentication challenge.

Next, the attacker initiates communication with the Google Cloud Authenticator. After completing the handshake, the attacker triggers the Trojan to use the device’s identity key to sign the required data. Specifically, it uses the hash of the handshake combined with the hash of the serialized assertion request.

The attacker then attaches this signature to the request sent to the cloud authenticator. The cloud authenticator returns the requested assertion. The attacker forwards this valid assertion to the relying party and successfully logs in as the victim.

UV Flag: When MFA Depends on a Single Bit

The Pass-ta-key attack is effective when the relying party does not strictly require user verification. Many relying parties configure WebAuthn’s userVerification parameter as preferred rather than required to support diverse devices and user experiences, making them susceptible to this attack.

When a relying party explicitly requires user verification, one would expect the cloud authenticator to reject requests that are not signed using a key gated by PIN or biometric verification. Surprisingly, this is not the case.

The cloud authenticator returns a valid assertion regardless of whether the request was signed using the identity key or the UV key. The difference comes down to a single bit in the authenticator data, the User Verified (UV) flag.

When the assertion is signed using the UV key, this flag is set to 1. When it is signed using the identity key, the flag remains 0.

While the Pass-ta-key attack produces cryptographically valid assertions matching the relying party’s public key, our testing shows attacks typically fail when user verification is required because the UV flag remains unset. For example, when attempting the attack against a passkey-protected GitHub account, the attacker receives an error message, as shown in Figure 3.

A screenshot of a GitHub login screen with a circular logo above the text "Sign in to GitHub." A red error message states, "Unable to sign in with your passkey. Please sign in with your password."
Figure 3. Message from GitHub passkey login failure.

Although authentication is typically rejected when user verification is required, this behavior is not always consistently enforced across relying parties. In our testing, we identified relying parties that accepted authentication because they did not properly validate the UV flag. This allowed the attack to succeed despite the absence of user verification.

The lack of validation effectively reduces the authentication process to a single factor. By compromising only the device identity key, the attacker is able to authenticate successfully and take over the account, even though MFA is required.

We reported this issue to the affected relying parties.

Video 2 demonstrates this behavior in practice on eBay. Although eBay sets the userVerification parameter to required, the demo recording shows a successful passkey login using the described technique, without any user interaction or additional authentication factors.

We captured this recording before eBay fixed the issue. Following our report, eBay addressed this verification gap and now properly validates the UV flag.

Video 2. Pass-ta-key attack succeeds despite the absence of user verification, even when the UV is required.

Pending Attacker: The Silver Pass-Ta-Key Attack

When an account is protected by stronger authentication requirements, such as for financial or federal identity systems, the attacker must also bypass user verification. This initially appears to be a significant challenge.

The cloud authenticator requires a message signed with the UV key to set the UV flag. Client interaction controls access to this key, as the OS validates the user via the same mechanism used for device unlock. Without escalating to system privileges or physical access to the victim device, an attacker has no apparent path to obtain such access.

Attackers can bypass this challenge through the following mechanism:

  • Instead of bypassing access to the UV key, the attacker invalidates the existing key registered in the cloud authenticator and registers a newly generated key under their control
  • Once the attacker-controlled key is registered, any message signed with it is accepted by the cloud authenticator as if the user had successfully performed device unlock

Figure 4 demonstrates the attacker-side authentication flow in the Silver Pass-ta-key attack, focusing on the authentication phase after the attacker-controlled UV key is registered.

A diagram illustrating a security process involving four entities: Relying Party, Attacker, Infected Victim, and Cloud Authenticator. Each entity is in a colored box. Arrows show the flow of communication, including a "Noise NK handshake" to the Attacker, a "Fake UV Key signature" to Google Cloud Authenticator, and an "assertion response" returning to Relying Party.
Figure 4. Attacker-side authentication flow in the Silver Pass-ta-key attack.

This approach has important implications. It allows the attacker to fully automate authentication across all the victim’s accounts without human interaction, even where user verification is enforced. Furthermore, the attacker no longer needs live access to the victim’s device during authentication.

Unlike the previous attack, which required active malware on the victim’s device for each authentication, the Silver attack provides reusable access. This allows the attacker to access the victim’s passkey-protected accounts from their own environment, without requiring the victim’s device to be online or active. Ultimately, this enables account takeover across all passkeys associated with the victim without requiring elevated privileges.

Invalidating the Existing User Verification Key

To carry out this attack, the first objective is to invalidate the existing UV key associated with the target device. From the previous attack, we learned how an attacker can use unprivileged malware to sign attacker-controlled requests with the device identity key and send them to the cloud authenticator. The attacker can leverage this capability to issue a device/forget command on behalf of the victim. A simpler option is to directly delete the victim’s passkey_enclave_state file, as there are no built-in protections that prevent its removal.

Regardless of the method, the next time the user attempts to use a passkey, Chrome is forced to re-onboard the device. This occurs either because Chrome no longer has access to the device key or because the cloud authenticator no longer recognizes the device as registered.

Exploiting the Onboarding Flow

On Windows, device onboarding is only completed after the second use of a passkey on the same device. During the first use, Chrome begins onboarding with the cloud authenticator in the background while prompting the user to enter the Google Password Manager (GPM) recovery PIN.

If Chrome were to create the UV key at this point, it would also trigger a Windows Hello prompt, requiring the user to authenticate again using biometrics or a PIN. Since both steps may involve a PIN, presenting them back-to-back in the same flow can be confusing and lead to user errors. To avoid this, Chrome defers the creation of the UV key.

Instead, the device is initially registered in a uv_key_pending state. During this first interaction, the GPM recovery PIN satisfies user verification, and the actual UV key is only created and registered during the next passkey use, when the additional prompt is no longer needed.

After forcing the victim into this re-registration state, the attacker can exploit the uv_key_pending condition. In their own environment, the attacker generates an asymmetric key pair. They then send a device/add_uv_key command to the cloud authenticator, providing the attacker-controlled public key as the UV key.

The cloud authenticator does not validate the attestation of newly registered UV keys to verify whether they originate from secure hardware. As a result, the attacker-controlled key is stored alongside the legitimate device identity key:

From this point on, the attacker can use the forged UV key to request signatures for any passkey associated with the victim and obtain assertions with the UV bit set. This provides access to high-value accounts even when user verification is enforced and validated.

Stealing the Master Key: The Golden Pass-Ta-Key Attack

In this attack, the attacker effectively gains the cloud authenticator’s superpower, the ability to decrypt synced passkeys. This is particularly impactful because it undermines the intended protection mechanism.

The passkey’s private key is protected using a symmetric master key called the security domain secret (SDS). This master key is not directly accessible, it is stored on the device as an encrypted wrapped_secret. Only the cloud authenticator can decrypt this wrapped_secret using its device-specific key (wrapping_key) within its isolated environment, as noted in Figure 5.

A diagram showing a process between a client device and a cloud authenticator. Arrows indicate the flow from client device to cloud authenticator.
Figure 5. Synced passkey decryption inside the cloud authenticator.

Figure 5. Synced passkey decryption inside the cloud authenticator.

This design aims to protect synced passkeys even if the client device is compromised. As Google noted in response to one of our vulnerability reports:

The (cloud) enclave authenticator’s primary function is to make it difficult to steal passkey private data, which would be an obvious target for malware if it were locally available.

The security of this model ultimately hinges on the protection of the 32-byte SDS. If an attacker is able to obtain the SDS, they effectively gain the ability to decrypt all synced passkeys for that account. This allows them to authenticate as a fully verified user and take over every service where the victim relies on passkeys.

Leaking the SDS

This secret should never be exposed to the client device, even during device loss or account recovery. However, we unexpectedly found the SDS present in Chrome’s logs during registration with the cloud authenticator, simply by opening chrome://device-log/FIDO, as noted in Figure 6.

A screenshot showing a log entry with blurred sensitive information. It displays a JSON formatted message containing the command "keys/wrap" and the purpose labeled as "security domain secret."
Figure 6. The SDS (the passkey master key) is exposed in plaintext in the device log.

In the current Chrome implementation, every device joining or rejoining an account’s security domain retrieves the SDS from the recovery key store, Google’s Trusted Vault service. The cloud authenticator includes a mechanism that allows Chrome to facilitate the recovery flow where the key cannot be decrypted on the client device, however this mechanism is not used. Instead, Chrome recovers the SDS in an accessible form.

One possible explanation is needing to standardize the device join and recovery process across platforms. Unlike desktop environments, Google Password Manager on iOS and Android does not rely on the cloud authenticator and must obtain the master key to decrypt synced passkeys. As a result, Chrome appears to follow the same recovery model, even though the cloud authenticator could enable a more isolated approach.

Although Google removed this secret from Chrome’s logging output following our report, the SDS is still sent to the client and remains accessible in Chrome’s process memory. If the attacker forces the victim to re-register with the cloud authenticator and knows the pattern to look for, they can extract the SDS directly from memory.

The Golden Pass-ta-key attack allows full account takeover through the following steps:

  1. The attacker forces Chrome to trigger a fresh onboarding using the same mechanisms as the Silver Pass-ta-key attack
  2. The attacker monitors the system for the recreation or modification of the passkey_enclave_state
  3. Once the file is recreated/modified, the attacker dumps Chrome’s process memory and extracts the SDS, which is temporarily present in plaintext
  4. The attacker reads the WebauthnCredentialSpecifics records from Chrome’s sync database (Stage Zero: Reconnaissance)
  5. Using the extracted SDS, the attacker decrypts the encrypted fields in each record and recovers the corresponding passkey private keys
  6. The attacker uses the recovered private keys to sign the relying party’s challenge and successfully authenticates as the victim

Figure 7 shows how an attacker would use the SDS to decrypt passkeys and forge a valid authentication response.

A diagram illustrating an authentication attack involving entities like "Relying Party," "Attacker," "Infected Victim," and "Cloud Authenticator." The flow includes encrypted passkeys and a "Fake Authenticator" with steps labeled "challenge" and "assertion response." The attacker extracts a "Security Domain Secret."
Figure 7. Flow of the Golden Pass-ta-key attack.

Video 3 shows how an attacker uses the stolen SDS to log in to a high-value account (in this case, a crypto exchange).

Video 3. How an attacker uses the stolen SDS to log in to a high-value account.

The Golden Pass-ta-key attack has a significantly broader impact. Beyond the reusable access from the attacker’s environment, the SDS allows the attacker to decrypt all existing passkeys as well as any future passkeys created for the account.

While the Silver attack is mitigated by unregistering or re-enrolling the device, the Golden attack provides strong persistence. Even if a compromise is detected, remediation is limited. In Google’s current implementation, there is no way to rotate or revoke the SDS, meaning all current and future synced passkeys remain protected by the same master key.

Mitigations

Enforce Strict User Verification (UV) Validation

Relying parties should require userVerification = required and validate the UV flag in all authentication responses. Failure to enforce this check can reduce authentication to a single factor. Figure 8 below shows the authenticator data layout.

A diagram illustrating the structure of data fields, including RP ID Hash (32 bytes), Flags (1 byte), Counter (4 bytes, big-endian unit32), Attested Credential Data (variable length if present), and Extensions (variable length if present, CBOR). A red arrow highlights "Bit 2: User Verified (UV) result" in the Flags section, clarifying that "1 means the user is verified" and "0 means the user is not verified."
Figure 8. Authenticator data layout. Source: W3C, Web Authentication.

Validate Device Key Registration and Attestation

Credential managers should verify the origin and attestation of newly registered device keys, including UV and identity keys. Accepting arbitrary keys without validation allows unauthorized key registration and bypass of user verification requirements.

Harden Recovery and Device Re-Registration Flows

Credential manager recovery PIN prompts are typically associated with onboarding or account recovery, not routine passkey authentication. Unexpected or repeated prompts during normal passkey usage may indicate re-triggering of onboarding or recovery, potentially due to phishing attempts or local manipulation of passkey state.

These flows are security-sensitive because recovery operations can re-establish device trust and restore access to synced credentials. In the scenarios from our research, triggering recovery enabled registration of new verification keys or exposure of key material used to decrypt synced passkeys.

Monitoring agents should detect and restrict unnecessary re-triggering of onboarding and recovery flows, especially after deletion or modification of local passkey state files. Additional verification should be required before re-establishing device trust or recovering synced credentials.

Prevent Exposure of Sensitive Key Material on the Client

Sensitive material such as the master key should not be exposed to the client, including through memory or logs. Instead, credential managers should use designs where cryptographic operations are performed on behalf of the client, without transferring the underlying key material to the client environment.

Restrict Access to Local Passkey Data

Access to passkey-related storage, such as Chrome’s sync database and local state files (e.g., passkey_enclave_state), should be limited to the browser process and protected through platform access controls. This reduces the ability to enumerate credentials, manipulate onboarding state or access device-bound key material from a compromised endpoint.

Improve Detection of Abnormal Passkey Usage

WebAuthn defines a signature counter (signCount) mechanism intended to help relying parties detect cloned or unexpectedly reused credentials. In traditional authenticators, the counter increases with each authentication operation and can provide a signal of abnormal credential usage.

In synchronized passkey systems, authentication assertions commonly contain a constant signCount value. As a result, relying parties and credential providers have limited visibility into unauthorized use of synced credentials, including scenarios where passkeys are extracted or reused from unexpected environments.

Google noted that globally consistent signature counters are difficult to implement in synchronized passkey systems that operate across multiple devices and platforms, particularly when assertions originate from independent clients.

Credential managers that centrally coordinate authentication operations should consider implementing coordinated signature counter mechanisms that account for synchronization and multi-device consistency challenges. Such mechanisms can improve visibility and detection of unexpected credential usage or passkey reuse across environments.

Conclusion

Passkeys represent a meaningful step forward in authentication security. By eliminating shared secrets, they reduce entire classes of attacks that have historically led to widespread account compromise. This changes the economics of credential theft and forces attackers to adopt new techniques.

The attacks presented in this research do not break the underlying cryptography. Instead, they exploit gaps between design assumptions and real-world implementations. These gaps include:

  • Trust placed in client devices
  • Inconsistencies in relying party validation
  • Weaknesses in onboarding and recovery flows

When combined with malware on the endpoint, these gaps enable account takeover scenarios that bypass the guarantees passkeys are expected to provide.

A central takeaway is that endpoint compromise remains a critical part of the threat model. When authentication decisions rely on signals from the user’s device, an attacker with access to that device can manipulate those signals in ways that are difficult to detect. Hardware-backed keys, secure enclaves and cloud isolation significantly raise the bar, but they do not fully eliminate this risk.

Passkey deployments should be treated as one layer in a broader security strategy. Relying parties must enforce strict validation, including proper handling of the user verification signal. Platform providers should continue hardening onboarding and recovery flows, and organizations should invest in protections against malware and memory access on endpoints.

As adoption continues to grow, so will attacker interest in this space. Understanding these emerging attack paths is essential to ensuring passwordless authentication delivers its intended security benefits in real-world conditions.

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

Cortex Cloud Identity Security

Cortex Cloud Identity Security encompasses Cloud Infrastructure Entitlement Management (CIEM), Identity Security Posture Management (ISPM), Data Access Governance (DAG) and Identity Threat Detection and Response (ITDR). It provides clients with the necessary capabilities to improve their identity-related security requirements by providing visibility into identities, and their permissions, within cloud and container environments. This helps accurately detect misconfigurations and unwanted access to sensitive data. It also allows real-time analysis surrounding usage and access patterns.

Idira Threat Detection and Response

Idira Threat Detection and Response (TDR) enables security teams to counter identity-based attacks targeting Idira Next Generation Identity (NGI) Platform and the identities it secures. Using near real-time detection, powered by CORA AI, and leveraging Idira’s visibility across multiple contexts (like PAM, authentication, SSO, cloud, endpoints, browsers, and more), Idira ITP can apply automated, tailored non-disruptive in-session response to contain and minimize potential identity-based threats.

Idira Endpoint Privilege Manager

Idira Endpoint Privilege Manager (EPM) enables enterprises to reduce risk, satisfy compliance, and streamline operations. It helps implement least privilege via policy-driven elevation and removal of standing admin rights, and blocks risky actions, such as execution of unvetted applications and access to memory of other processes, while providing audit-ready evidence and unified identity governance. Automation and consolidation improve efficiency and support Zero Trust strategies, strengthening security without slowing the business.

Idira Privilege Access Management

Idira Privilege Access Management unifies privileged access across human, machine, and agentic identities to secure cloud access across multi-cloud environments. Building on proven PAM, it delivers centralized secrets management alongside modern controls like Just-in-Time access and Zero Standing Privileges. This enforces consistent least-privilege security across on-premises, cloud, and SaaS targets.

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Additional Resources

The Xcode Assassin Returns: A Deep Dive Into the Latest XCSSET Version

Executive Summary

After months of dormancy, the attackers behind the XCSSET malware released version 40 (v40), targeting the macOS ecosystem. This version’s advanced architecture hides its core logic in memory space, reducing its digital footprint.

V40 further enhances its detection evasion capabilities by combining polymorphic payload generation with fileless persistence and dynamic in-memory execution, while weakening a number of security mechanisms on the affected machine.

Since early April 2026, the malware has spread through supply chain attacks by hiding itself in the Xcode projects of dozens of legitimate applications with thousands of active users. Xcode is Apple’s integrated development environment (IDE) for building apps for its various operating systems.

XCSSET’s author enhanced the threat’s ability to spread through open-source projects on GitHub and upgraded its worming capabilities. It can now infect all existing Xcode projects on a compromised system for maximum impact.

The author used a multi-layered cipher shift to conceal the threat’s internal functions. In response, our researchers leveraged advanced AI and pattern-matching algorithms to de-obfuscate the malware's logic.

This article:

  • Explores XCSSET’s updated stealth practices
  • Examines the new operational modules
  • Reveals findings regarding the attackers' rotating command-and-control (C2) infrastructure
  • Provides mitigation strategies to detect and prevent this threat

Palo Alto Networks customers are better protected from the threats discussed above through the following products and services:

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics Supply Chain, Backdoor, macOS

Background

XCSSET is a modular macOS malware family that primarily targets software developers within the Apple ecosystem, spreading through Xcode projects. Threats in this family download task-specific modules from a C2 server, giving it capabilities including:

  • Browser hijacking
  • Credential theft
  • Clipboard monitoring
  • Data exfiltration

XCSSET’s initial discovery was by Trend Micro in 2020. Security researchers at Microsoft analyzed and documented two subsequent versions in March and September 2025. These updates indicate that the attackers were enhancing their codebase.

In mid-April 2026, we started tracking a new version of XCSSET. We saw a secondary wave of attacks in early May 2026 that introduced an expanded suite of operational modules.

In this new version, we observed a heightened volume of attacks targeting developers across South Asia, which is consistent with Trend Micro's initial 2020 reporting,

While the threat actor has named this latest iteration XCSSET v40, the security community has historically identified only a handful of intermediary versions, none of which featured formal version labels.

Infection Chain Analysis

In this section, we provide a high-level overview of XCSSET v40’s infection chain. The threat’s authors restructured its execution framework to be more stealthy and modular. We provide a complete step-by-step breakdown of each phase in Appendix A.

The malware injects an initial downloader script into benign project files in Xcode projects and vulnerable Git repositories. While the attack lifecycle begins with the infected codebase, the endpoint infection is triggered only when the developer builds that project locally.

The malware scrambles its payload generation at compile time, switching between nested layers of different encryption mechanisms. Figure 1 shows a benign infected Xcode project on GitHub with two separate XCSSET payloads.

A screenshot of a code editor showing lines of code in a project file. Some lines are blurred. The code is related to configuration sections within the project. A highlighted area includes seemingly obfuscated text with labels "AFI79" and "AE1CAD1"
Figure 1. Infected Xcode project on GitHub.

The XCSSET v40 infection chain consists of four distinct stages prior to final payload execution:

  • The initial loader script establishes C2 communication
  • The second stage collects basic fingerprinting information on the system and downloads further modules
  • The third stage includes a temporary staging applet that is dropped onto the system to load the final stage into volatile memory space
  • The fourth stage is the core module logic

The moment this memory-resident core module loop becomes active, the malware terminates its staging processes and deletes all installation files from the disk. The goal of the core-module (internally called boot) is to execute and load additional, specialized modules into memory, such as keyloggers, clipboard hijackers or browser hijackers.

Figure 2 describes XCSSET v40’s infection chain.

A diagram showing phases of a cyberattack involving a trojanized Xcode project. Phase 1: Developer downloads project, which executes a command. Phase 2: Bash stager runs initial reconnaissance. Phase 3: Additional reconnaissance occurs, with two loaders managing further operations. Phase 4: Execution of boot orchestrator and decryption of payloads. Attack phase details modules for browser hijack, data exfiltration, crypto stealing, and persistence.
Figure 2. XCSSET v40 full infection chain.

New Module Breakdown

Our analysis of XCSSET v40 uncovered 17 distinct modules, each designed for a different goal. The modules were delivered via a dynamic C2 infrastructure and executed in memory.

We found that the operators have enhanced several of its legacy modules while introducing two new components. These include a Chrome hijacking backdoor and a Telegram trojanizer.

We provide the full list of XCSSET v40 modules in Appendix B.

Chrome Hijacking Backdoor via Chrome DevTools Protocol (CDP) Protocol

The Chrome hijacking module controls the browser by misusing a legitimate Chromium feature, the CDP.

For the CDP-based hijacking to work, the malware must redirect how the user interacts with the browser. It does this by wrapping the benign Google Chrome binary in a malicious persistence script. When a victim launches Google Chrome, the wrapper executes a three-step chain:

  • The orchestrator check: First, it restarts the main XCSSET orchestrator module (boot) every time Google Chrome is initialized, ensuring the malware's core process remains active
  • CDP execution: It then launches the legitimate Google Chrome application with specific command-line arguments that activate the CDP on a pre-defined local port, exposing the browser's internal engine
  • chrome_remote backdoor: Finally, it drops and launches a specialized Chrome hijacking binary (chrome_remote). This binary connects to the opened CDP port, allowing the attackers to execute arbitrary JavaScript, manipulate active browser sessions and extract cookie tokens invisibly.

Figure 3 illustrates the module’s infection and execution chain.

A diagram illustrating a cyberattack process involving a Boot Orchestrator, Browser Hijacker, and chrome_remote Backdoor. The Boot Orchestrator starts the attack, which injects into memory via the Browser Hijacker and creates persistence by launching the browser with CDP flags. The chrome_remote Backdoor connects to a local HTTP and WebSocket server, opening localhost:18907, leading to stages like Cookie Theft and Password Theft. Arrows indicate the process flow.
Figure 3. Chrome-hijacking backdoor’s execution chain.

Inside the chrome_remote Binary

The chrome_remote binary dropped by the browser hijacking module establishes a persistent WebSocket connection to the C2 server to pull down real-time JavaScript payloads. Leveraging CDP's ability to inject code before a page even loads allows the malware to force the browser to evaluate and execute these remote scripts on every new tab or document the user opens.

Once injected into a webpage, the malware’s dynamic scripts override critical browser APIs to manipulate the user's active session for the following goals:

  • Traffic interception: Hooks placed on window.fetch and XMLHttpRequest monitor to exfiltrate sensitive data streams, credentials and API tokens
  • Crypto wallet manipulation: Intercepting MetaMask's Ethereum provider allows the malware to alter cryptocurrency wallet addresses or manipulate decentralized application (dApp) transactions
  • Credential theft: Overriding password-manager autofill fields captures credentials

This module is able to pivot from a browser hijack to full host-level compromise, operating within the context of the legitimate Google Chrome process. The binary monitors active tabs for specific browser console logging events. If the operator wants to run a local system command on the infected machine, they execute a standardized string such as a console.log prefixed with a specific delimiter.

The chrome_remote binary intercepts this console event, strips the delimiter and passes the remaining payload to the host's underlying shell handler (exec.Command). The resulting shell output is then packaged and routed back through the active CDP WebSocket to the C2 server, establishing a stealthy, fileless reverse shell.

We reported the information about this threat to Google. This behavior is protected against in Windows, and Google is currently working on expanding the same protections to macOS.

Telegram Trojanizer

We identified a new Telegram Desktop trojanizer module in May 2026 that was absent from the April 2026 deployment. The delayed introduction of this module demonstrates that the threat actor was actively refining XCSSET v40 after it was already deployed in the wild.

This new module performs the following activities:

  • Downloading a pre-built malicious Telegram.app ZIP
  • Wiping the legitimate copy
  • Dropping the C2-supplied replacement in its place
  • Ad hoc code-signing the fake Telegram app
  • Issuing a kill command to the original Telegram process so the victim relaunches the trojanized copy

This module was updated with a custom AES-encrypted configuration from a dedicated endpoint (/w?tr). We have observed this security mechanism in other modules in earlier iterations of the XCSSET malware family.

The decrypted configuration is written to ~/.tr, and a companion ~/.tr_map file tracks state. Whenever the SHA-1 of .tr changes, .tr_map is cleared. Both files are then uploaded back to the C2 as base_tr_file.txt and base_tr_map.txt.

Because the configuration blob itself was not captured during our collection window, we could not verify its exact contents. However we assess that this is how XCSSET’s operators kept server-side track of which Telegram-related markers existed on each infected host.

This is not the first time XCSSET has been seen targeting Telegram. The original 2020 generation of XCSSET featured dedicated telegram / telegram_lite data-stealing modules. The 2025 XCSSET iteration included the data_folders_finder module that exfiltrated Telegram's chat history, cached files and local encryption keys.

The newest Telegram trojanizer represents a meaningful escalation in the attacker’s access to the app. Rather than a one-time copy of Telegram-related data, the attacker now replaces the application binary itself, giving them an in-process foothold.

The Invisible Malware: New Tactics, Techniques and Procedures (TTPs) Breakdown

When analyzing v40, it became clear that XCSSET went through architectural changes and made core changes to its TTPs.

The attackers behind the malware enhanced its stealth practices to sabotage detection and thwart analysis, while also adding new persistence and data theft methods. This section highlights the recent TTPs observed in v40 illustrated in Figure 4, including:

  • Multi-layered encryption
  • Polymorphism
  • New fileless persistence
  • Impairing defenses
  • Virtual machine (VM) evasion
A diagram of XCSET v40 malware characteristics with a skull icon in the center. Features include Polymorphic, Fileless Persistence, Anti-VM, and Impairing Defenses, each in separate colored boxes.
Figure 4. New XCSSET v40 TTPs.

Multi-Layered Polymorphism and Encryption

The architectural hallmark of XCSSET v40 is its defense-evasion framework, combining overlapping layers of polymorphism and a dual-key encryption scheme. Rather than relying on a single defensive trick, the malware implements a multi-tiered cryptographic gauntlet across its binaries, network payloads and internal source code. Figure 5 describes the XCSSET v40 evasion stack:

A diagram titled "XCSSET v40 Evasion Stack" showing three levels: "Binary Level" with note on frequent recompilation, "Network Level" detailing dual-key encryption, and "Module Level" describing Caesar and substitution ciphers. Each level includes icons.
Figure 5. Layers of polymorphism and encryption in XCSSET v40.

Binary and Network-Level Polymorphism

The malware leverages polymorphism to rotate its digital fingerprints and evade detection. The loader binary, which is responsible for executing the core modules in memory, is recompiled on the C2 server every few hours. During analysis, we observed eight distinct hashes delivered to a single endpoint within a 24-hour window.

The functional modules streamed to the orchestrator are polymorphic. Each component is encrypted via AES-256-CBC using a per-build key and a randomized Initial Vector (IV) prepended to the ciphertext. Because the IV shifts with every single transmission, even two identical modules served seconds apart will result in two different encrypted blobs. Figure 6 illustrates the encrypted payload injection process into osascript as detected in Cortex XDR.

A flowchart illustrating a cyberattack process involving several steps. The process starts with "osascript" as the main node, which injects an AES-encrypted payload into the loader. This is followed by several "sh" and "bash" nodes. A new module payload is downloaded via a "curl" command, linking to a specified URL. "Apple" is labeled at a box indicating the starting point of the process.
Figure 6. Encrypted module payload injected to XCSSET v40’s loader.

Network Level Dual-Key Architecture

While previous versions of XCSSET protected their C2 communications using a single, hard-coded plaintext key, v40 introduces a dual-key architecture that separates inbound and outbound encryption.

Unlike its predecessors, XCSSET v40 embeds its inbound key within the compiled AppleScript loader. As a result of this compartmentalized key placement, defenders who retrieved the outbound key from network telemetry will not be able to decrypt and access the core logic of the malware.

Module Source-Code Obfuscation and String-Literal Ciphers

The malware applies a third layer of polymorphism at the structural code level. Every internal string literal is dynamically encoded using a per-module keyed Caesar cipher featuring a randomized 52-character alphabet and variable shift values. As a result, no two builds of the same module share common string signatures.

XCSSET v40’s developers also implemented a pre-compilation substitution cipher for all internal module, function and variable names. Because this obfuscation takes place on the C2 server before distribution, the decryption mapping is absent from the host endpoint. This absence means that analysts cannot reverse a local execution routine to reveal the original code structure.

Figure 7 includes a scrambled source-code module with decrypted string literals.

A screenshot of a code snippet featuring a function written in a programming language. The function includes command-line operations such as `curl` and `osascript`, as well as conditions using `if` and `else`. There are several references to connecting to a server using specific URLs and managing session files.
Figure 7. Encrypted function names in the boot module.

By leveraging advanced pattern matching and LLM assistance, we broke the identifier substitution cipher. This allowed us to trace the obfuscated module and function names back to their original, operator-assigned names. This allowed us to dive into the malware’s core logic.

XCSSET adopted new technologies to scale their operations. This can also be a reminder for the threat intelligence community that defenders can harness those same capabilities to neutralize this threat.

New Fileless Persistence

Beyond introducing polymorphic capabilities, XCSSET v40 also added a new fileless persistence to its TTPs. In addition to its usual persistence through Git hooks, Launch Daemons and trojanized applications, v40 adopted another method that misuses the macOS defaults configuration system.

Defaults is the macOS counterpart to the Windows Registry, which is a built-in mechanism for managing user preferences and application settings.

Historically, macOS malware families like NetWire and FruitFly have misused the defaults utility to store state data. XCSSET v40 instead uses this utility to shift from predictable, disk-resident persistence to a fileless re-infection loop.

Rather than dropping additional scripts on disk between cycles, XCSSET v40 writes a Base64-encoded staging payload into a preferences domain it generates per host. Inside the domain, the malware writes the payload under keys that are meant to seem random, like mpirv_eahpi_apm or ychax_muwch_ucy. When a victim launches a trojanized or hijacked application, the threat runs a one-liner to retrieve and decode the payload:

The decoded blob re-infects the host, with the SRC tag identifying which infection vector (e.g., hijacked browser, infected Xcode project or trojanized application) is responsible for triggering the re-arm.

Beyond standard persistence, XCSSET v40 uses the defaults system during initial infection to store and query system information. Misusing defaults as an operational configuration cache is uncommon in the macOS malware landscape.

Impairing Defenses

XCSSET v40 also introduces significant defense-evasion techniques that were not observed in prior campaigns. In this multi-part effort to thwart Apple’s defenses, XCSSET v40:

Disabling the SoftwareUpdate Configuration Channel

XCSSET v40 executes the following commands to hinder the machine’s ability to receive security updates:

Setting these values to false prevents the endpoint from automatically retrieving updates to crucial macOS signature databases like:

  • XProtect
  • MRT
  • TCC

This also prevents access to Apple's Rapid Security Response channel, which delivers emergency patches between full macOS releases.

Termination of Cloud Telemetry Mechanisms

XCSSET v40 runs a constant loop that hinders the endpoint’s ability to send security-related data through the CloudTelemetryService process. This evasion method blocks the transmission of local security telemetry to Apple, ensuring that the operator's tooling is not sampled into subsequent XProtect signature releases.

Exclusive File Lock on the XProtect Signature Database

The malware spawns a Perl process that tries to acquire and hold access to the endpoint's YARA-rule database (XPdb). This exclusive file lock on the XProtect signature database ensures that if the endpoint does receive a security update, its content could not be written to disk.

TCC Database Reset Upon Denial of Permissions

Prior XCSSET versions terminated module execution when the user denied AppleEvents automation prompts. XCSSET v40 instead invokes tccutil reset AppleEvents, which clears the user's TCC decision database for the AppleEvents service. It then reloads a TCC prompt, masquerading as System Settings or Xcode to trick the user into re-granting automation permissions to the malware's bundle ID. The subsequent automation request is treated as a first-time prompt, redisplaying the consent dialog.

Anti-VM Reporting

XCSSET v40 also attempts to avoid running on VMs. Upon execution of the stats module (one of the first modules downloaded to the machine), the module generates a set of checks on the machine’s CPU and hardware metadata. This check is to determine whether or not the infected endpoint is a VM.

Once the module performs those checks, it calculates a final verdict ("Model Identifier suggests VM: false", "Result: likely physical") and ships the results over to the C2. Hosts reporting a virtual environment receive no further module deliveries, ensuring that automated sandboxes do not analyze XCSSET’s core logic.

C2 Infrastructure Analysis

By analyzing XCSSET v40’s Uniform Resource Identifier (URI) structure and domain registration strategies, we were able to learn more about the timeline of the most recent campaign. We even found several operational security (OPSEC) failures that provided insights into the attacker’s strategies and capabilities.

Endpoint URL Breakdown

XCSSET v40 shows a clear pattern of URL endpoint structure throughout the campaign, assigning distinct functionality to each URI endpoint as shown in Table 1.

Path Method Purpose
/d/<rotated_binary_name> GET <Base64- + AES-encrypted payload> Binary download (e.g., AppleScript loader, Chrome hijacker binary)
/a GET Loader and stager retrieval during initial infection
/s/<rotated_module_name> GET <Base64- + AES-encrypted payload> AppleScript module retrieval (executed in-memory)
/l POST -d <Base64 payload> Status and log reporting
/u POST -F m=<Base64 payload> File exfiltration
/p POST -d t=…&u=…&s=… Heartbeat
/w?<cmd> GET Server-side dynamic configuration retrieval (e.g., /w?cbp for clipboard, /w?tr for telegram)
/e POST Browser-hijack events

Table 1. XCSSET v40 URI endpoint breakdown.

Domain Registration and Staging Strategy

XCSSET v40's C2 infrastructure reveals a distinct domain registration strategy. In early 2026, the attackers registered about 40 different domains in at least four short bursts across a small pool of IP addresses. The operator staged and aged these domains months before launching the attack wave, to bypass detection of newly registered domains.

Geographically, the attackers’ targeting parameters and naming conventions have also evolved. While the 2025 campaigns relied on [.]ru (Russia) domains masquerading as legitimate content delivery networks (CDNs) and tech properties, the 2026 attack wave introduced [.]in (India) names registered alongside identical [.]ru siblings. This geographic infrastructure pivot aligns with recent victimology, matching our observations of XCSSET v40 targeting developers across South Asia.

OPSEC Failures

Despite mitigating detection risks by aging their domains, the attackers compromised their own campaign through poor OPSEC. Specifically, they cross-contaminated the IP addresses hosting those domains across different XCSSET campaigns.

Furthermore, all four operator IP addresses are linked by a single shared SSL thumbprint (6e480d648fa1b70612f5d198a66875e28847547d), reused SSH keys and a shared self-signed remote desktop protocol (RDP) certificate.

Mitigation Strategies

Defending against XCSSET v40 requires defenders to use real-time behavioral enforcement to flag runtime irregularities. Unit 42 suggests the following mitigations to detect and prevent this threat:

  • Implement AI-enhanced process anomaly detection capable of flagging runtime irregularities, specifically monitoring for abnormal AppleScript instances
  • Monitor browser launcher paths and block unauthorized file-write activity
  • Identify and block the creation of abnormal local system defaults domains and their modification through the defaults utility
  • Track ad hoc signed applications and untrusted local code signers, immediately isolating binaries that bypass native Apple Gatekeeper requirements
  • Implement automated supply-chain dependency scanning to intercept poisoned open-source repositories before they are pulled into internal developer pipelines

Conclusion

The latest XCSSET version demonstrates a persistent and specialized threat within the macOS landscape. Rather than relying on conventional delivery methods, the framework turns legitimate developer workstations into automated, self-propagating supply chain vectors.

The discovery and analysis of XCSSET v40 reveals a modular framework for exfiltrating data, subverting system security and performing persistent browser hijacking.

While the malware's historical reliance on AppleScript and bash stagers remains consistent, v40 introduces a significant technical evolution in defense evasion. By adopting a largely memory-resident and polymorphic architecture, XCSSET v40 leaves a minimal disk footprint.

Because adversaries are now using AI-enhanced pipelines to generate polymorphic code on the fly, defenders must shift to AI-driven behavioral analysis to identify unusual or suspicious process chains and flag anomalous use of built-in detection mechanisms.

Palo Alto Networks Protection and Mitigation

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

Cortex XDR and XSIAM

At the endpoint level, Cortex XDR blocks XCSSET on macOS hosts using Behavioral Threat Protection (BTP) to terminate fileless, in-memory execution chains—including suspicious osascript calls, multi-pass base64/xxd decoders, and process spawning from infected .xcodeproj build phases—while Advanced WildFire inspects and blocks payloads on disk.

At the Security Operations level, Cortex XSIAM correlates these host-level detections with developer repository, network, and identity telemetry, providing SOC analysts with a unified attack narrative and automated playbooks to stop cross-environment supply-chain propagation.

Advanced URL Filtering and Advanced DNS Security

Advanced URL Filtering and Advanced DNS Security identify known domains and URLs associated with this activity as malicious.

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Indicators of Compromise

XCSSET v40 C2 Domains

  • accapple[.]ru
  • adschecks[.]ru
  • adschecks.ru
  • adsmobi[.]ru
  • adsmorein[.]in
  • adsmoreme[.]in
  • amdcdn[.]ru
  • amzndev[.]in
  • amzndev[.]ru
  • amznprod[.]in
  • applecdn[.]ru
  • appledisk[.]ru
  • appledns[.]ru
  • applehosts[.]ru
  • appletime[.]in
  • bulksec[.]ru
  • cdnamz[.]in
  • cdnamz[.]ru
  • cdnapple[.]in
  • cdnatapple[.]ru
  • cdnroute[.]ru
  • checkcdn[.]ru
  • chromeads[.]ru
  • cnmag[.]ru
  • devnetaps[.]ru
  • dnsapple[.]ru
  • dnsrelays[.]ru
  • explorecdn[.]ru
  • fiddlejoy[.]ru
  • figmacat[.]ru
  • figmanets[.]in
  • funchats[.]ru
  • gironetcdn[.]ru
  • goalmate[.]ru
  • googlenets[.]ru
  • greencn[.]ru
  • icloudsnet[.]ru
  • imails[.]ru
  • legalads[.]in
  • littleads[.]in
  • littledns[.]ru
  • maganet[.]ru
  • mindelgate[.]ru
  • netapsdev[.]ru
  • netcdnads[.]in
  • netcdnamz[.]ru
  • netcdndev[.]in
  • netcorps[.]ru
  • netsprot[.]in
  • netsproto[.]in
  • networkads[.]in
  • rigacdn[.]in
  • rigmajoys[.]in
  • rigmanet[.]ru
  • rigmanets[.]in
  • sahusuzuki[.]in
  • stuffdns[.]in
  • testjoys[.]ru
  • timewebnet[.]in
  • vigmanet[.]ru
  • whitead[.]in
  • whiteads[.]ru
  • wincdn[.]ru
  • windsecure[.]ru

C2 URLs - Chrome CDP Helper Binary

  • hxxps[:]//amzndev[.]in/d/zw_sfp64
  • hxxps[:]//amzndev[.]ru/d/zw_sfp64
  • hxxps[:]//googlenets[.]ru/d/zw_sfp64
  • hxxps[:]//netcdndev[.]in/d/zw_sfp64
  • hxxps[:]//whitead[.]in/d/zw_sfp64
  • hxxps[:]//whiteads[.]ru/d/zw_sfp64

XCSSET v40 C2 IP Addresses

  • 91.108.106[.]229
  • 95.142.35[.]34
  • 95.142.35[.]206
  • 95.142.37[.]159
  • 151.243.109[.]188
  • 178.208.92[.]129
  • 178.208.92[.]168

XCSSET v40 SSL Thumbprint

  • 6e480d648fa1b70612f5d198a66875e28847547d

Additional Resources

Appendix A - XCSSET v40 Infection Lifecycle Breakdown

The infection lifecycle of XCSSET v40 can be categorized into four phases, as detailed below.

Phase 1: Initial Compromise and Execution

The infection lifecycle begins when a developer opens a poisoned Xcode project, typically downloaded from GitHub or built internally:

  • The moment the developer builds the project locally, a malicious run-script phase executes silently in the background
  • The malware dynamically scrambles its payload generation at compile time, switching between nested layers of Hex- and Base64-encoding
  • This decoded script initiates contact with the attacker’s C2 infrastructure by executing a curl request to the /a with basic execution context (p=xcode_phase) to retrieve the next stage

Phase 2: Host Reconnaissance and Staging

  • The retrieved staging payload runs a second, specialized curl command that collects and exfiltrates primary host metadata
  • The payload queries the operating system type (uname -s) and the current username (whoami), transmitting these details back to the C2 endpoint

Phase 3: Loader Wrappers and Binaries

If the C2 approves the host profile, it returns a bash script obfuscated via a custom substitution cipher. This script handles the high-risk task of staging the main loader while covering its tracks:

  • The bash script performs deeper hardware fingerprinting, matching the host's serial number against targeted profiles
  • It then pulls the primary malware loader to /tmp/r and compiles an accompanying AppleScript wrapper as /tmp/p.app on the fly
  • To eliminate forensic evidence, the loader wrapper is executed in memory by osascript, which in turn downloads the main orchestrator module and its AppleScript loader
  • After execution, the malware terminates osascript and deletes both /tmp/r and /tmp/p.app from the disk to minimize its forensic footprint

Phase 4: Orchestrator and Core Logic Modules

Once it erases its disk footprint, the malware transitions to a mostly fileless execution:

  • The main orchestrator module named “boot” by the developers runs and retrieves additional module payloads from https://<C2>/s/<encoded_module_name>
  • Finally, the orchestrator pipes the payloads to the AppleScript to decrypt and execute the modules in memory

Appendix B - XCSSET V40 Module Breakdown

This appendix maps the 17 modules identified in XCSSET v40. We correlated the canonical XCSSET v40 module names recovered through our decryption efforts with the terminology used in the three prior public reports.

Please note that since XCSSET has gone through major architectural changes in v40, some modules’ logic may be expanded or split into different modules. It is also worth noting that previous reports of XCSSET did not decrypt the original module names, and therefore they appeared as jumbled strings.

Module Name Previously Recorded Names Functionality
boot boot, bootstrap Main orchestrator, module-dispatch loop
stats vexyeqj, seizecj Initial reconnaissance on the infected endpoints, exfiltrates existing browser extensions, performs anti-VM checks
clipboard_v2 bnk Keyboard hijacker
payloader payloader Secondary module dispatcher, downloads dynamic configuration files, performs keyboard hijacking
replicator_finder replicator, dfhsebxzod Xcode project file infector
git_finder pods_infect, jez, jey Git pre-commit hook infector
zip_infect_finder logic previously existed in dfhsebxzod and replicator modules Split out in v40 from replicator_finder. Recursively traverses user directories to identify and infect Xcode projects present in .zip archives.
data_folders_finder finder, txzx_vostfdi, neq_cdyd_ilvcmwx C2-driven folder finder and data exfiltrator
firefox_data iewmilh_cdyd Infostealer targeting Firefox
notes_app cozfi_xhh Apple Notes exfiltrator
settings_app xmyyeqjx LaunchDaemon-based persistence using a fake Settings.app, defense evasion by blocking XProtect features
finder_app finder_app, vectfd_xhh TCC permission misuse and reset, creates trojanized app that mimics Finder/ Xcode/ Terminal/ Reminders/ SimulatorTrampoline
persist hfdieiz, some of the logic previously existed in xmyyeqjx .zshrc and Dock-app based persistence
browser_remote chrome_remote, firefox_remote, opera_remote, yandex_remote, brave_remote, edge_remote, 360_remote (one module per browser, each downloads a backdoor masquerading as browser from the server; uses an exploit to hijack the actual browser) Unified browser-hijack dispatcher checks for existing browser on the endpoint and dispatches different hijacking modules
safari_remote safari_remote Browser hijacker
chrome_remote new module (v40) Browser backdooring and hijack through CDP protocol
Note: Trend Micro’s 2020 report mentions a module named chrome_remote, but v40’s module has different functionality
tdesktop new module (v40) Telegram desktop trojanizer

Chinese-Speaking Threat Actor Harnesses AI Models for Autonomous Cyberattacks

Executive Summary

Unit 42 identified an AI-enabled autonomous hacking campaign carried out by a Chinese-speaking threat actor. They targeted infrastructure using seven vulnerabilities, combining autonomous AI-driven enumeration with manual exploitation that achieved confirmed impact.

The actor, operating under the aliases knaithe and KnYuan, leveraged DeepSeek, via the Hermes Agent framework, as their autonomous offensive operator. They orchestrated this operator via Telegram for the following activities:

  • Independently enumerating targets and their vulnerabilities using FOFA
  • Sourcing exploit tools
  • Initiating attacks without human intervention

In parallel with their use of DeepSeek as their autonomous operator platform, the actor configured multiple large language models (LLMs) (Qwen, GLM, Kimi, MiniMax). We also identified limited usage and testing of Western platforms. This includes Claude Code for connectivity testing and proxy validation. There were also signs of usage of Codex on exploit development directories. This limited usage is consistent with evaluating the AI-market to identify their preferred tool set.

When initial exploitation failed due to the target environment's restrictive configurations, their Hermes Agent autonomously conducted searches for known critical-severity Common Vulnerabilities and Exposures (CVEs). It initially surveyed 10 product families, scanning GitHub for trending proofs of concept (PoCs) and prioritizing vulnerabilities by attack surface. This research led the agent to pivot to higher-value vulnerabilities, the seven covered in Table 2 below. While the observed campaign had limited impacts, the workflow confirms a functional, end-to-end autonomous offensive capability.

Palo Alto Networks customers are better protected from the threats described here through the following products and services:

The Unit 42 AI Security Assessment and Unit 42 Frontier AI Defense service can help identify and mitigate complex AI-enabled risks.

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics GenAI, Vulnerabilities, LLM

Technical Analysis

We gained unique insights into this autonomous attack capability when the autonomous agent inadvertently exposed its infrastructure by starting a file server in its home directory. This revealed the full operational environment to our threat researchers.

This visibility enabled us to understand their full tool set, how the attackers orchestrated multiple AI platforms and gave us a peek into their targeting. Based on our analysis of their session logs and configuration files, the actor primarily used the Hermes Agent with DeepSeek as its reasoning agent for the attack phase of this campaign. Their Hermes Agent conducted autonomous vulnerability enumeration, downloaded public exploit code from the internet and attempted exploits against targets.

Additionally, the threat actor leveraged the following tools in a limited capacity, likely indicating an ongoing assessment of the AI market for their use cases:

  • Claude Code: The actor only used this for connectivity testing and proxy validation. Session history (10 entries across three sessions) contained only /model checks, connectivity tests and one npm install request.
  • Codex: There were signs of usage on exploit development directories, but the chat logs were not preserved. The actor marked their exploit development directories as trusted, granting full access to read, modify and execute code. Although we cannot verify actual usage because the actor configured their system to limit local response storage (disable_response_storage = true), the correlation between trusted directories and successful campaigns is notable.
  • Qwen Code: There was minimal usage by the actor, including two sessions total. They configured multiple large language models (LLMs) (Qwen, GLM, Kimi, MiniMax), consistent with evaluating Chinese-market AI models.

Tool Configuration and Proxy Infrastructure

The actor configured four AI coding tools to remove client-side execution permissions. Note, this does not impact server-side controls for vendor-hosted platforms. They routed the two Western tools, Claude Code and Codex, through a third-party proxy service (code.newcli[.]com) to reduce traceability. The actor accessed DeepSeek and Qwen directly through their native API endpoints.

The actor enabled anti-attribution settings on both tools. The actor configured Claude Code with CLAUDE_CODE_ATTRIBUTION_HEADER: "0" and CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1", while they set Codex to disable_response_storage = true to limit response storage. Unit 42 did not recover any Codex chat logs from the exposed server. Note: This setting does not impact the retention of logging or safety signals in OpenAI’s safety systems.

Table 1 summarizes each tool's configuration.

Tool Model Configuration Change Access Method
Hermes Agent DeepSeek Framework: no built-in safety layer; custom red-teaming skills with godmode jailbreaking skill available Direct API: api.deepseek[.]com
Codex GPT-5.4 (via proxy) network_access = "enabled" Proxy: code.newcli[.]com/codex/v1
Claude Code Opus (via proxy) dangerously-skip-permissions: true, 12 of its tools are explicitly allowlisted (Bash, file I/O, web requests, agent spawning, etc.) Proxy: code.newcli[.]com/ultra
Qwen Code GLM-5/Qwen/ Kimi/MiniMax approvalMode: "yolo" Direct API: dashscope.aliyuncs[.]com

Table 1. AI tool configurations.

DeepSeek/Hermes Agent — Autonomous Attack Cycle

DeepSeek, operating through the Hermes Agent framework, served as the actor's primary offensive AI tool. Hermes Agent provided orchestration (terminal access, Telegram-based command and control, and the skills system) while DeepSeek served as the reasoning engine for code generation, vulnerability assessment, target selection and decision-making.

The actor had customized Hermes Agent with three red-teaming skills:

  • godmode: LLM jailbreaking, framework-bundled
  • web-terminal-exploitation: unauthenticated WebSocket exploitation, custom-created
  • fofa-cyberspace-search: a custom procedure template instructing DeepSeek to use the actor's fofoapi.py script for internet asset enumeration

The actor also integrated the open-source FofaMap-Platinum-Full-Expert Model Context Protocol (MCP) server, which exposes:

  • FOFA asset search
  • Nuclei scan generation
  • A DeepSeek-powered natural-language-to-FOFA query translator directly within the agent

We recovered the following sequence in Figure 1 from a single Hermes Agent session (May 7, 2026). We were unable to recover additional operator input beyond the initial task.

A flowchart illustrating a cybersecurity attack process with four phases: Langflow Exploitation, Autonomous CVE Research, Vulnerability Assessment & Exploit Acquisition, and n8n Exploitation Attempt. It shows how the attack progresses starting from an initial task and leads to the final attack session. Key terms like "AUTONOMOUS PIVOT" and "n8n" are highlighted.
Figure 1. Autonomous attack flow observed in Hermes Agent session (May 7, 2026).

Phase 1: Langflow Exploitation (CVE-2026-33017)

DeepSeek identified a Langflow vulnerability (CVE-2026-33017, CVSS 9.8) and autonomously attempted exploitation through the following steps:

  1. Downloading the public PoC exploit from GitHub
  2. Enumerating 84 Langflow instances via FOFA (title="Langflow")
  3. Running the PoC scanner (langflow_poc.py --scan-file langflow_targets.txt --threads 10)
  4. Identifying one vulnerable target (Langflow 1.3.4)

The exploitation attempts failed because the vulnerability requires either auto_login enabled or a public flow ID and the target had neither. DeepSeek assessed the entire product as a low-value target:

Phase 2: Autonomous CVE Research and Target Selection

After abandoning Langflow, DeepSeek conducted autonomous research to identify a higher-value vulnerability. It surveyed deployment counts across 10 product families via FOFA, and then searched GitHub for trending 2026 CVE PoC repositories sorted by stars. DeepSeek evaluated each candidate by severity, deployment footprint and exploitability before selecting n8n:

FOFA confirmed n8n as a high-value target: 647,017 instances globally; 25,209 in China.

Phase 3: n8n Vulnerability Assessment and Exploit Acquisition

DeepSeek obtained the public n8n exploit PoC from the Chocapikk repository. The PoC chains two CVEs into an attack sequence requiring an unauthenticated form with file upload:

The following are advisories from n8n:

DeepSeek analyzed affected version ranges to identify exploitable targets:

Phase 4: n8n Target Enumeration and Exploitation Attempts

DeepSeek ran FOFA queries targeting Chinese n8n instances and probed targets for version and form endpoints. Three instances were confirmed to be running vulnerable versions (v1.18.0, v1.117.3, v1.108.2). One target exposed three form endpoints, but all required authentication:

DeepSeek launched parallel scanning across 50-plus remaining Chinese targets. None had publicly accessible forms. The actor did not achieve exploitation. The recovered session data ends at this point.

Manual Campaigns

Separate from the autonomous AI campaigns, the actor conducted manual operations using conventional workflows (FOFA enumeration, custom Python scanners and direct exploitation) with confirmed impact.

These included:

  • Data exfiltration from three organizations via a Citrix NetScaler vulnerability (CVE-2026-3055)
  • Command execution on 11 Marimo notebook instances (CVE-2026-39987)
  • Java deserialization reverse shell attempts against nine Apache Tomcat servers (CVE-2026-34486)
  • Reverse shell callbacks targeting three IKE VPN endpoints (CVE-2026-33824).

How the AI Exposed the Operation

Hermes Agent, responding to a Telegram command, started an HTTP file server (python3 -m http.server 8888) from the actor's home directory (/home/worker) rather than an isolated staging directory. This exposed the actor's entire workspace:

  • AI tool configurations
  • API keys
  • Exploit scripts
  • Target lists
  • Bash history
  • Hermes autonomous exploitation session logs

The exposure was unintentional. The actor demonstrated operational security awareness elsewhere, having emptied exploit directories after use and disabled Codex conversation logging.

Vulnerabilities

CVEs Exploited or Staged

The threat actor maintained active exploit tooling for seven vulnerabilities. The threat actor likely retrieved the tooling manually or they downloaded it from public repositories via the Hermes Agent during the autonomous scan -> download -> exploit cycles. Table 2 summarizes each vulnerability and the actor's method of engagement.

CVE Product CVSS Method Actor Activity
CVE-2026-33017 Langflow 9.8 Autonomous Exploitation attempt (failed — auto_login disabled)
CVE-2026-21858/CVE-2025-68613 n8n Workflow Automation 10.0 / 9.9 Autonomous Exploitation attempt (failed — auth required)
CVE-2026-3055 Citrix NetScaler ADC & Gateway 9.8 Manual Active exploitation, data exfiltrated
CVE-2026-34486 Apache Tomcat 7.5 Manual Active exploitation, reverse shell attempts
CVE-2026-39987 Marimo Notebook 9.8 Manual Active exploitation, command execution confirmed
CVE-2026-0300 PAN-OS User-ID Authentication Portal 9.8 Manual Non-functional research PoC cloned, not executed
CVE-2026-33824 Windows IKE Extensions (IKE VPN) 9.8 Manual Active exploitation, reverse shell attempts

Table 2. CVEs exploited or staged by the threat actor.

PAN-OS CVE-2026-0300

The actor cloned a public repository (qassam-315/PAN-OS-User-ID-Buffer-Overflow-PoC) for CVE-2026-0300, a buffer overflow vulnerability in the PAN-OS User-ID Authentication Portal (Captive Portal). The cloned code is non-functional with placeholder values that cannot achieve code execution. No evidence of modification or execution was found.

Targeting Analysis and Limited Success

From our analysis and visibility, we identified that this actor attempted to exploit over 460 targets, leveraging a mix of autonomous and manual techniques. What’s interesting is that the actor appeared to allow DeepSeek to narrow the targeting scope, likely to conserve AI compute.

For example, DeepSeek sampled approximately 100 IP addresses out of the 25,209 Chinese systems that FOFA scans identified with exposed n8n instances. Of those 100 systems, it probed roughly 40 unique IP addresses, checking their version via curl commands.

While most of the systems were unreachable or non-responsive, DeepSeek found three with the vulnerable versions and attempted to exploit them automatically. This autonomous process of target identification, sampling and narrowing of scope is notable because the system executed hundreds of hours of manual targeting analysis in mere minutes, while also managing its own compute resources.

Across all the exploitation attempts, both autonomous and manual, Unit 42 confirmed data exfiltration from three Citrix NetScaler targets (CVE-2026-3055) and command execution on 11 Marimo notebook endpoints (CVE-2026-39987). However, we reviewed evidence of batch exploitation against an unknown number of hosts that were listed in a file deleted by the actor prior to our analysis. 

The three successful exploitations had memory data exfiltrated through the Citrix NetScaler out-of-bounds memory read vulnerability (CVE-2026-3055). The actor searched the exfiltrated data for NetScaler authentication cookies (NSC_AAAC=), indicating session hijacking intent. The actor persistently targeted a government entity in Malaysia and they exploited it over multiple days with memory grooming parameters and maximum read attempts. The actor returned with proxy anonymization on subsequent attempts.

Attribution

The Chinese-speaking actor is based in Zhuhai, China, and operates as an opportunistic exploit operator and self-described binary security researcher. This assessment is supported by the actor’s GitHub activity, specifically their maintenance of 1DayNews, an automated vulnerability intelligence pipeline. This tool:

  • Aggregates RCE disclosures from 17 sources (primarily network perimeter vendors)
  • Leverages DeepSeek to filter for exploitability
  • Distributes actionable alerts via Telegram

The actor's broader activity is opportunistic, with confirmed victims spanning three countries and multiple sectors. The autonomous AI campaigns targeted Chinese domestic infrastructure indiscriminately. In contrast, the manual campaign against the Malaysian target demonstrated higher intent, including refined exploitation parameters and proxy anonymization sustained over multiple days.

Conclusion

Our findings document a threat actor developing AI-augmented offensive capabilities that enabled them to dramatically increase the speed and scale of their campaigns. This research validates an emerging threat posed by AI-enabled attackers as they hone their autonomous attack processes to discover, assess, pivot and retarget without human intervention.

Although these autonomous campaigns did not achieve full compromise of any of their intended targets, the findings carry several implications for defenders.

  • Autonomous AI-driven attack cycles are operationally viable, and the margin of failure was narrow: Exploitation was prevented by target-side configuration requirements — the absence of prerequisite workflow configurations (Langflow) and authentication on form endpoints (n8n). Targets with weaker default configurations would have been susceptible.
  • Threat actors are constructing persistent AI offensive infrastructure: Rather than using AI tools in isolation, this actor assembled an integrated environment — custom automation skills, MCP server integration, proxy anonymization, and Telegram-based command and control — designed to retain and reuse successful procedures across sessions.
  • Threat actors follow the path of least resistance: For their autonomous attack engine, the actor selected a model with minimal safety controls (DeepSeek) accessed through an open-source framework with no client-side restrictions. The actor attempted to use Western models, but their provider-side controls likely limited their effectiveness for autonomous attacks. This likely led the actor to select the most permissive model for their campaign. Note: Our colleagues at OpenAI were able to confirm that their provider-side safeguards refused requests that violated their policies. They also confirmed that continued attempts led their safety systems to flag and disable an account they believe is linked to this campaign prior to our intelligence sharing with their team.
  • Autonomous AI execution introduces novel operational security risks for threat actors: The same autonomous capability the actor developed for offensive use directly caused the exposure of the operation, producing forensic artifacts that would not have existed under manual execution.

The significance of these findings lies in the trajectory rather than the outcome of any individual campaign. The actor is actively iterating — refining tool configurations, developing custom skills, establishing proxy infrastructure and executing autonomous attack cycles. The technical barrier to AI-augmented offensive operations is low and continues to decrease.

Palo Alto Networks Protection and Mitigation

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

Cortex XDR and XSIAM

To combat an attack in which an attacker takes advantage of software exploits or vulnerabilities, Cortex XDR employs Endpoint Protection Modules (EPM). Each EPM targets a specific exploit type in the attack chain.

In addition, Cortex XDR and XSIAM help protect against post-exploitation activities using a multi-layer approach. This approach combines several layers of protection, including Advanced WildFire, Behavioral Threat Protection and the Local Analysis module, to prevent both known and unknown malware from causing harm to endpoints.

Cortex Xpanse

Cortex Xpanse has the ability to identify exposed Langlow, n8n and Citrix ADC/Netscaler devices on the public internet and escalate these findings to defenders. Customers can enable alerting on this risk by ensuring that these attack surface rules are enabled. Identified findings can be viewed in the incident view of Expander. These findings are also available for Cortex XSIAM/XDR/Cloud customers with the ASM license.

Next-Generation Firewall with Advanced Threat Prevention

Next-Generation Firewall with the Advanced Threat Prevention security subscription can help block the attacks with best practices via the following Threat Prevention signatures 97030, 96882, 96855, 97044, 97046, 97251, 97177, and 510019.

The Unit 42 AI Security Assessment and Unit 42 Frontier AI Defense service can help identify and mitigate complex AI-enabled risks.

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Additional Resources

Russian Global Webmail Espionage

Executive Summary

Unit 42 has observed a persistent cyberespionage campaign we track as CL-STA-1114. This activity cluster overlaps with activity from a Russian threat actor tracked by other vendors as Void Blizzard and LAUNDRY BEAR.

The attackers behind this campaign targeted Zimbra webmail in organizations in the following sectors:

  • Governments
  • Defense
  • Transportation
  • Financial organizations across the following regions:
    • NATO member states
    • Ukraine
    • Commonwealth of Independent States (CIS) countries
    • Africa

Unique to this campaign, the group leveraged zero-click phishing emails that exploit a vulnerability in the Zimbra Collaboration Suite (ZCS) webmail platform (CVE-2025-66376). The exploit automatically injects a malicious JavaScript payload without requiring recipient interaction. Once executed, the payload exfiltrates sensitive user data, including login credentials, email archives, and search histories. Threat actors continue to actively target unpatched ZCS instances using CVE-2025-66376.

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics Cyberespionage, Phishing, Data Exfiltration

Technical Analysis

The attackers behind CL-STA-1114 have been active since at least 2024, and this campaign targeting Zimbra servers started in July 2025. Initial access starts with a phishing email that contains either an HTML attachment or embedded HTML in the message text. This lure is designed to catch recipients' attention with news headlines.

Figure 1 shows an example of the lure used and a snippet of the underlying HTML code.

A screenshot of a split screen image displaying a webpage layout. On the left, content under 'Global News Digest: Business, Economics & Eurasia' with articles discussing CEOs, OpenAI, and the impact of American technology firms. On the right, rows of HTML code and text highlighting technical aspects of webpage formatting. The content covers topics such as business strategies, economic developments, and technological advancements
Figure 1. Example lure and a snippet of its underlying HTML content.

The HTML text contains an obfuscated division with a Base64-encoded script (highlighted in red in Figure 1). The obfuscated section creates an invisible Scalable Vector Graphics (SVG) element that, upon loading, decodes the Base64-encoded script into a JavaScript payload that it injects into the victim’s browser.

When executed, this JavaScript exfiltrates the victim’s Zimbra webmail data to a hard-coded command and control (C2) server. Exfiltrated data includes:

  • CSRF tokens
  • Email address and password
  • Two-factor authentication (2FA) scratch codes
  • System and environment details
  • The victim’s last 90 days of email and search history

Over the course of this campaign, we observed minimal changes to the JavaScript payload.

Figure 2 illustrates the attack chain.

A flowchart illustrating a cybersecurity attack chain. On the left, a person sends a phishing email leading to downloads of HTML and JavaScript files. The files are depicted with labels "Base 64 Encoded JavaScript Payload." The process connects to a "Command and Control (C2) server" and a "Webmail Server," showing the extraction of emails, passwords, search history, email archives, and Zimbra Web configurations.
Figure 2. The attack chain.

Since we began tracking this campaign, there have been at least nine IP addresses and nine domains for the C2 servers. These servers were active for an average of 35.4 days. See the Indicators of Compromise (IoC) section for a list of the IP addresses and domains used in CL-STA-1114 activity.

Conclusion

This campaign activity in CL-STA-1114 illustrates the persistent and evolving threat of state-sponsored cyberespionage. The attacker behind this activity targets widely used mail platforms like Zimbra, posing a risk to critical industries globally.

This research highlights the need for vigilance, proactive patching and advanced threat detection to protect organizations. Network administrators, defenders and security researchers should patch vulnerable systems and use the IoCs below to investigate and strengthen defenses against CL-STA-1114 and similar activity.

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Indicators of Compromise

IP addresses

  • 37.120.247[.]228
  • 64.226.124[.]190
  • 104.248.134[.]194
  • 185.86.79[.]95
  • 193.238.152[.]66
  • 194.156.103[.]193
  • 216.252.238[.]18
  • 216.252.238[.]64
  • 216.252.238[.]104

Domains

  • analyticemailmeter[.]com
  • emailanalytics[.]com[.]ua
  • istc-cloud[.]com
  • mailnalysis[.]com
  • synacorzimbra[.]nl
  • zimbra-metadata[.]com
  • zimbrastat[.]com
  • zimbrasoft[.]com[.]ua
  • zmailanalytics[.]com

Additional Resources

Three Steps to the Terminal: A Siemens ROX II Zero-Day Trilogy

Executive Summary

We conducted this research in close partnership with Siemens, reflecting our shared commitment to advancing the security and resilience of critical infrastructure.

This report details a critical, chained exploit comprising three zero-day vulnerabilities (CVE-2025-40948, CVE-2025-40947, and CVE-2025-40949) discovered in Siemens ROX II operational technology (OT) switches. Successful exploitation of this chain would allow an attacker to achieve full privilege escalation and persistent root-level access on these devices, which are critical components of industrial control networks. The vulnerabilities range from Medium to Critical severity, with CVSS 3.1 scores of 6.8 (CVE-2025-40948), 7.5 (CVE-2025-40947), and 9.1 (CVE-2025-40949).

The attack vector proceeds in three stages, escalating from reconnaissance to complete system compromise:

  • Arbitrary file disclosure (CVE-2025-40948): An attacker leverages an insecure configuration of the xz utility, which executes with root privileges, to read any file on the switch’s file system. This vulnerability enables initial reconnaissance that could reveal critical information such as sensitive configuration files, password hashes and private cryptographic keys.
  • Privilege escalation via command injection (CVE-2025-40947): This critical flaw resides in the feature key validation function. The function fails to sanitize an attacker-controlled payload before inserting it directly into a command executed with root privileges. Exploiting this allows for direct command injection and full root access.
  • Persistent root code execution (CVE-2025-40949): Following privilege escalation, the final vulnerability is exploited in the switch’s web management task scheduler. Improper input sanitization allows an authenticated attacker to inject malicious commands into the system’s root cron table. This establishes persistent code execution, surviving system reboots and maintaining full control.

These vulnerabilities could collectively transform a vital network security device into a platform for malicious activity, severely threatening the integrity and availability of the industrial network. Siemens has released security advisories SSA-973901, SSA-078743 and SSA-081142 to address these issues, which recommend that customers update their affected ROX II devices to firmware version V2.17.1.

Palo Alto Networks customers are better protected against these threats through the following products and services:

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics Vulnerabilities, Zero-day, Exploits

Partnership Overview

The Palo Alto Networks OT Threat Research Lab and Siemens partnered to advance the security and resilience of critical infrastructure through collaborative vulnerability research on the Ruggedcom ROX II platform. We combined the OT Threat Research Lab’s expertise in industrial cybersecurity research with Siemens’ deep product knowledge and the coordination capabilities of Siemens ProductCERT. These teams worked together to identify, validate, remediate and responsibly disclose security vulnerabilities.

This collaboration reflects the growing importance of industry partnerships in securing OT environments. As critical infrastructure enters the AI era, organizations must work together more closely than ever to address emerging threats, accelerate vulnerability remediation and strengthen the security of the technologies that support essential services worldwide. This partnership demonstrates how coordinated research and responsible disclosure can help build a more resilient and secure future for critical infrastructure.

The Role of OT Switches

The modern OT environment is a complex network of devices working in concert. At the heart of this connectivity are OT switches, which act as the nervous systems of industrial networks, directing communication between critical assets like human-machine interfaces (HMIs) and programmable logic controllers (PLCs).

Protecting the integrity and availability of these switches is paramount for any industrial operation, be it a factory floor or a power plant. For instance, a properly configured OT switch provides crucial network segmentation, which enhances security by isolating different parts of the network while still allowing necessary communication.

However, OT switches designed to secure the network can themselves become attack surfaces. A common misconception is that because these devices are often air-gapped or sit on isolated networks, they’re inherently safe. In reality, they are just as susceptible to software vulnerabilities as any other IT equipment, allowing an unprivileged attacker to exploit software flaws, escalate privileges and disrupt OT communication.

This threat research article demonstrates how seemingly benign flaws can be exploited to initiate a chain of events. In this case, this could lead to full control of the critical OT switch operating system ROX II.

The Impact: From Innocuous to Hostile

Arbitrary File Disclosure

The first vulnerability, CVE-2025-40948, is an arbitrary file disclosure vulnerability. While not immediately devastating, this flaw provides vital intelligence by revealing sensitive information on the switch operating system (OS), from password hashes to network topology data. This initial foothold is a crucial step in a sophisticated attack.

Privilege Escalation and Root Access

The second vulnerability, CVE-2025-40947, is the pivotal privilege escalation flaw. We identified this vulnerability by carefully analyzing the switch’s feature key functionality, a mechanism designed to unlock optional capabilities. By reverse-engineering this feature, we discovered a way to exploit its internal logic and gain root access. This vulnerability grants an attacker total control, bypassing available security measures and transforming the switch into a platform for malicious activity.

Persistence via Task Scheduling

The third vulnerability, CVE-2025-40949, solidifies the attacker’s control by exploiting the switch’s task scheduling functionality. An authenticated attacker can schedule malicious scripts to run with root privilege at predetermined intervals, ensuring persistence even after a reboot. This allows for ongoing malicious activity, such as data exfiltration or denial-of-service attacks, making the compromise difficult to detect or remove.

Exploit Chain Part 1: Exploiting CVE-2025-40948, Then Misusing xz for File System Information Disclosure

During the initial analysis of the switch’s publicly available firmware, we worked with Siemens researchers and located a key configuration file associated with a privileged daemon. This file is used by a management and configuration daemon running with root privileges on the switch’s operating system. As a root-privileged process, it can perform any action on the system, including reading and writing any file.

Using CVE-2025-40948 to Misuse xz for Arbitrary File Disclosure

The xz command is a common Linux utility primarily used for compressing files into the XZ format with a highly effective compression algorithm. However, xz can be used with specific parameters to function like the standard Linux cat command, which is used to print files to standard output. By supplying the parameters -f, -c and -d at the same time, an attacker can instruct xz to view file contents.

The CVE-2025-40948 vulnerability lies in the privileged daemon executing the xz command with user-provided parameters. Since the process runs as root, an attacker can pass any file path to xz, allowing it to read any file on the file system, including those normally inaccessible to regular users.

The Impact: Unrestricted File Access

This insecure configuration creates a significant arbitrary file disclosure vulnerability. An attacker can leverage this to:

  • Read sensitive configuration and system files containing credential information
  • Access private keys or other cryptographic materials
  • Gather information about the system and network, paving the way for further attacks

In the case of the ROX II switch, this oversight would have allowed an attacker to leak the contents of any file on the file system. This highlights the importance of carefully vetting all commands executed by privileged processes and ensuring that user input is never used to construct commands insecurely.

Exploit Chain Part 2: Exploiting CVE-2025-40947, the Feature Key for Root Access

The Feature Key Mechanism

To understand CVE-2025-40947, we must first understand how the Siemens feature key mechanism works. A feature key is a cryptographically signed license that enables specific functionalities on the switch. When a customer purchases a license, Siemens provides a signature (i.e., the feature key) that the customer installs on the device. The switch then uses a pre-installed public key to verify the feature key’s authenticity and enable the corresponding features. This process is intended to be secure, but our analysis revealed a critical flaw in its implementation.

How the Vulnerability Works

By reverse engineering the feature key handling library (responsible for installation), we identified the CVE-2025-40947 vulnerability in its signature verification function. This function is responsible for validating the signature provided in the feature key. The function involves three important steps:

  1. Read and parse: The function reads from the feature key file and parses a signature line containing up to a fixed number of characters
  2. Command preparation: It then prepares a Linux command to verify the signature using the gpgv utility, inserting the parsed signature string directly into the command
  3. Command execution: Finally, it executes the constructed command using system() with root privileges

The code excerpt in Figure 1 shows how the signature is copied into the command string before being executed. This is the root cause of the command injection vulnerability, as there is no sanitization or validation of the input signature before it is inserted into the command string.

A screenshot of a code snippet showing potential security vulnerabilities. The code is commented in steps, demonstrating how an attacker could manipulate a command string to execute code as root. Vulnerabilities include lack of sanitization and command injection possibilities.
Figure 1. Code excerpt showing how the signature is copied into the command string.

CVE-2025-40947 Exploitation in Practice

To exploit this vulnerability, an attacker needs to craft a payload that fits within the signature field size limit. The exploitation process involves two main steps:

  1. File upload: The attacker first uses the web UI’s normal file upload functionality for a feature key to upload a malicious script (e.g., a Python reverse shell) to a writable directory on the switch.
  2. Command injection: Next, the attacker crafts a new feature key file where the signature field contains a command injection payload. This payload is designed to execute the malicious script that was previously uploaded. For example, a payload like $(python /tmp/rev_shell.py) could be used, where /tmp/rev_shell.py is the uploaded script.

When the attacker uploads this specially crafted feature key, the vulnerable verification function will execute the injected command with root privileges, giving the attacker a reverse shell and full control over the device. This attack vector highlights the importance of robust input validation and secure coding practices, especially when handling external data and executing system commands.

Exploit Chain Part 3: Exploiting CVE-2025-40949, Persistence via System Scheduling

Following the initial privilege escalation, we discovered a third critical vulnerability, CVE-2025-40949, in the Siemens ROX II switch's system scheduling functionality. This flaw allows an authenticated attacker to establish persistent execution of arbitrary commands with root privileges.

CVE-2025-40949 Vulnerability Details

The vulnerability resides in the switch’s system task scheduler, which is used to automate periodic command execution. An authenticated attacker can manipulate input fields within the web management interface used to configure scheduled tasks.

Due to improper sanitization and validation of user-supplied data, the attacker can inject control characters and commands into the underlying system configuration file responsible for task execution. This technique results in a command injection attack executed with root privileges. The impact is persistent code execution as the root user, enabling long-term compromise that survives system reboots and maintains control over the device.

Exploit Chain Proof of Concept (PoC)

Exploiting this vulnerability involves several steps that an authenticated attacker can perform via the web management interface. This high-level summary demonstrates how persistent root access is achieved.

  • Step 1 - Prepare the malicious code: The attacker prepares malicious code, such as a script designed for communication or system manipulation. This payload is stored in a location accessible by the switch's operating system.
  • Step 2 - Inject the command: The attacker uses the task scheduler interface to create a new scheduled task. By crafting a special input string for some of the task configuration fields, the attacker is able to inject an execution command. This command is structured to overwrite or bypass the intended task parameters, causing the system to execute the attacker’s payload instead of a legitimate function.
  • Step 3 - Execute and achieve persistence: Once the configuration is saved, the scheduled task mechanism processes the injected command. This results in the execution of the attacker’s prepared code with root privileges, achieving persistent control over the device. This control remains active through system operations, allowing for ongoing malicious activity.

Conclusion

The discovery and mitigation of these three chained zero-day vulnerabilities in Siemens ROX II switches highlight the necessity of collaborative vulnerability research between vendors and security researchers. By working together to identify and remediate flaws that could allow full system compromise, the industry can better protect the critical infrastructure that underpins essential services.

To protect the intricate and interconnected OT environment, organizations must execute a defense-in-depth strategy. This methodology must combine timely firmware updates with compensating controls, such as virtual patching.

Palo Alto Networks Protection and Mitigation

While applying vendor-provided security updates remains the recommended long-term remediation, organizations may require additional time to test and deploy patches within OT environments.

Next-Generation Firewall with Advanced Threat Prevention

Next-Generation Firewall with the Advanced Threat Prevention security subscription can help block the attacks with best practices via the following Threat Prevention signatures 97246, 97250, 97249.

OT Security

OT Device Security provides deep visibility and AI-powered inline protection for industrial environments, securing critical OT assets and legacy systems without requiring downtime.

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Indicators of Behavior

System behavior indicators:

  • Unusual task scheduler entries:
    • Description: Unexpected scripts or commands injected into the switch’s system configuration files or task scheduler configuration. These are typically characterized by the execution of arbitrary commands (e.g., python, bash or direct system calls) instead of legitimate task functions.
  • Abnormal use of the xz utility:
    • Description: Execution of xz with parameters -f, -c and -d by the privileged configuration daemon. This indicates an attempt to read files on the file system that are not normally accessible to the user.

Additional Resources

Adam Robbie, Head of OT Threat Research, Emmanuel Zhou, Sr. Staff Researcher and Rick Wyble, OT Security Researcher, are researchers affiliated with the Palo Alto Networks Advanced Research Center for OT. Miguel Pereira is from Siemens ProductCERT.

AI, Automation and Attacks: Unpacking the Unit 42 2026 Global Incident Response Report

Unit 42’s 2026 Global Incident Response Report offers frontline intelligence drawn directly from global investigations. The report spotlights four defining trends shaping the threat landscape. We’ll take a closer look at Trend 1: AI Has Become a Force Multiplier for Attackers.

What the Report Explains

Drawing on hundreds of incident response engagements, the Unit 42 2026 Global Incident Response (IR) Report provides evidence-backed insights that illustrate how threat actors leverage AI to reduce the friction behind attacks. Specific use cases include shortening development cycles, automating content generation and streamlining reconnaissance techniques. These operational efficiencies have effectively compressed the attack lifecycle, transforming what once took days into a matter of hours.

Yet, while the speed of AI has undoubtedly impacted the attack surface, the fundamental threat landscape has remained relatively consistent over the past year. The attacks observed in recent investigations are largely consistent with historical patterns. Threat actors continue to rely on established techniques such as credential theft, phishing, exploitation of known vulnerabilities and ransomware deployment.

This points us to the conclusion that AI is acting as a force multiplier to increase the speed and efficiency of attacks, but is not significantly redefining methods of compromise. This also implies that defenders already have the knowledge and capabilities to prevent, detect and respond to AI-enhanced cyberattacks.

Ria’s Thoughts

As an intern at Palo Alto Networks and a full-time college student, I have had the chance to observe perspectives surrounding AI from both academic and industry organizations. AI has transformed cybersecurity, but its presence in academia remains limited.

The speed of AI innovation, as well as concerns regarding academic integrity, have restricted the incorporation of AI platforms into curriculum, leading to an almost “anti-AI” mindset. Rapid AI integration within workplace operations poses challenges for students with limited formal education in these tools. This disconnect challenges the traditional assumption that higher educational institutions adequately prepare students for the workforce and reflects a larger problem: technologies are evolving much faster than established systems can adapt to them. While this grants opportunities for the select few familiar with AI tools, it ultimately expands the skills gap between employers and students, leading to increased job uncertainty.

For students and emerging cybersecurity professionals, understanding AI is as essential as understanding the security technologies and principles it can support. As AI becomes increasingly embedded within the cybersecurity industry, organizations are prioritizing professionals who can use it effectively — not just to automate basic tasks, but to deepen analysis, enhance decision making and identify missing gaps.

Equally important is recognizing AI’s limitations. Practitioners must be able to validate AI-generated responses, think critically, identify hallucinations or inaccuracies and know when human expertise is required. As AI continues to amplify attackers’ operations, the strongest practitioners will be those who combine strong technical foundations with AI proficiency and the judgement to recognize when human intervention is needed.

What Unit 42 Has to Say

Because AI continues to advance at record speeds, the threat landscape looks different today than it did when we published the IR Report in February 2026. To gain the latest updates on how these tactics have evolved, I interviewed Andy Piazza, senior director of threat intelligence, Unit 42, and Richard Emerson, senior manager of reactive intelligence, Unit 42.

Andy’s Thoughts

According to Andy, AI-assisted cyberattacks have still not yet reached a level that urges organizations to redesign their cyber defense strategy — but the initial signals of AI-adoption are beginning to emerge. Threat actors are leveraging AI to lower the barrier to entry and to streamline certain stages of an attack. Between the market demand for “AI impact” driving a hype cycle, and initial signs that threat actors are exploring AI-enabled attacks, these campaigns appear louder or more visible in media coverage than they really are present in the threat landscape.

However, the underlying tradecraft remains largely unchanged — the techniques for compromising systems are based on the underlying technology of the compromised hosts, not the technology that is compromising them. At this stage, Unit 42 has not observed a meaningful shift in capabilities related to AI-enabled attacks. Rather, adversaries are applying AI to the established tactics, techniques and procedures (TTPs) that they already engage in.

Still, the operational efficiency gains AI offers adversaries should not be dismissed. We are seeing threat actors test AI in their attacks. From malware written using AI to malware that calls out to a large language model (LLM) or Model Context Protocol (MCP) server for command and control instructions, attackers are exploring many use cases for AI-enabled threats, just like defenders are across most enterprises. To date, these campaigns are nascent and have not had major impacts.

Yet, that is a temporal assessment that is likely to change as adoption increases. If AI enables attackers to operate faster or at greater scale, organizations that rely primarily on detect-and-respond models may struggle to keep up. This reinforces the need to emphasize prevention controls, rather than assuming security operations center (SOC) teams can absorb high increases in alert volume.

Andy’s advice: AI-driven threats should be treated as a strategic priority, particularly as the technology continues to evolve. However, they do not currently represent a fundamentally new class of risk. Defenders can mitigate these threats using existing processes and controls, but it is critical to continue to adapt and remain informed on emerging technologies.

Richard’s Thoughts

Richard agrees that AI has not introduced fundamentally different attack vectors. He does, however, emphasize more strongly that threat actors are leveraging AI in more sophisticated and scalable ways. In one instance, researchers identified agentic ransomware managing multiple stages of an extortion operation. While the AI agent was not fully autonomous, it operated from end to end across the attack lifecycle, significantly reducing operational complexity and compressing the timeline for the threat actors involved.

Richard also points to the rise of token jacking, where threat actors exploit exposed credentials to gain unauthorized access to cloud AI services and LLM API tokens. This can potentially generate millions of dollars in unauthorized compute charges at the victim's expense. Recent trends suggest that adversaries are evolving past simply misusing the stolen tokens to training their own malicious models as well.

Looking ahead, Richard expects threat actors to continue using AI to optimize existing stages of the attack lifecycle rather than creating entirely new attack vectors. He anticipates broader adoption of AI for processes such as vulnerability discovery, malware development and decision-making during active intrusions. Although he believes that fully autonomous agentic attacks remain an emerging capability, he warns that these systems will eventually operate at speeds that outpace human defenders alone. As a result, organizations must combat AI with AI to respond to these threats in real time. That being said, defenders must still think critically and understand the logic behind these agents to identify their mistakes and manually redirect defense efforts when they fail.

Final Thoughts

My conversations with Andy and Richard have reinforced one clear idea: AI is changing the speed and scale of cyberattacks more than it is changing the attacks themselves. This distinction is critical. From a defense perspective, this means that foundational security knowledge is still as relevant as ever, with AI being an additional piece of the puzzle.

AI is a force multiplier for attackers, but it has the potential to become an equally powerful force multiplier for defenders. As students and emerging professionals entering the dynamic world of cybersecurity, our responsibility is to understand these technologies and guide how they can be used. The future of cybersecurity will be shaped by those who are willing to continuously learn, adapt to new tools, and leverage technology to protect our digital way of life.

Additional Resources

The npm Threat Landscape: Attack Surface and Mitigations (Updated July 15)

Executive Summary

The security of the npm ecosystem reached a critical inflection point in September 2025. The Shai-Hulud worm, a self-replicating malware that automated the compromise and redistribution of malicious packages, marked the end of the “nuisance” era of npm attacks and the beginning of a high-consequence threat landscape.

Since that watershed moment, Unit 42 has tracked an aggressive acceleration in the frequency and technical depth of supply chain compromises. Attacks have evolved from a series of isolated typosquatting incidents into systematic campaigns by various threat actors to weaponize the trust that powers modern software development.

April 2026 Campaigns

We have seen two campaigns in April: the first started April 22, 2026 and included the string Shai-Hulud: The Third Coming. The second started April 29, 2026 and is known as Mini Shai-Hulud.

May 2026 Campaigns

In May 2026, the Mini Shai-Hulud campaign continued with two new waves attributed to TeamPCP. These campaigns introduced two unique elements. One campaign used a credential-free initial access technique. The other campaign generated the highest single-hour package count of any Shai-Hulud worm to date. Copycat activity has made future attribution to TeamPCP more difficult.

June 2026 Campaign

A new supply chain attack on June 1, 2026 compromised at least 32 packages published under the @redhat-cloud-services npm namespace. The attacker bypassed code review entirely, pushing a payload named Miasma.

July 2026 Campaign

Attackers compromised the release pipelines of four core AsyncAPI GitHub repositories on July 14, 2026. In a campaign calling itself miasma-train-p1, they published five trojanized packages to npm:

  • @asyncapi/generator@3.3.1
  • @asyncapi/specs@6.11.2
  • @asyncapi/specs@6.11.2-alpha.1
  • @asyncapi/generator-helpers@1.1.1
  • @asyncapi/generator-components@0.7.1

The payload appears to be a descendant of the Miasma remote access Trojan (RAT).

The New Baseline for npm Threats

The Shai-Hulud incident proved that the npm registry could be used as a force multiplier for malware distribution. In the months following, we have observed three core shifts in adversary TTPs:

  • Wormable propagation: Malicious payloads now prioritize the theft of npm tokens and GitHub Personal Access Tokens (PATs) to automatically infect and republish legitimate packages, as seen in the March 2026 Axios compromise.
  • Infrastructure-level persistence: Attackers are no longer just stealing data; they are embedding themselves into continuous integration/continuous delivery (CI/CD) pipelines to attain long-term, undetectable access to enterprise environments.
  • Multi-stage payloads: Following the September 2025 template, current attacks often deploy dormant “sleeper” dependencies that only activate under specific environmental conditions to evade automated scanners.

npm Attacks Seen As a Whole

npm compromises have common themes. In the post-Shai-Hulud era, we believe it is helpful to consider the attack surface as a whole.

This article will combine:

  1. Details of major incidents: Real-time analysis of significant package compromises (e.g., Shai-Hulud 2.0, Axios, Chalk/Debug)
  2. Cross-campaign correlation: Identifying common infrastructure or code snippets that link disparate attacks to the same threat actors
  3. Remediation playbooks: Actionable guidance for rotating credentials and purging malicious dependencies from local and cloud-based caches

Shai-Hulud: A New Wave

A malicious npm package published as @bitwarden/cli version 2026.4.0 was identified as part of a broader supply-chain campaign attributed to TeamPCP. The package impersonates the legitimate Bitwarden command-line interface (CLI) password manager. Upon installation, it executes a multi-stage payload that steals credentials from cloud providers, CI/CD systems and developer workstations. It then self-propagates by backdooring every npm package the victim can publish. It has been noted that inside public GitHub repositories that were published contained the string “Shai-Hulud: The Third Coming.”

Attackers deployed the same payload across multiple Checkmarx distribution channels, indicating a coordinated campaign to weaponize compromised developer tooling credentials to maximize the area of impact:

  • Docker Hub images
  • GitHub Actions
  • VS Code extensions

Palo Alto Networks customers are better protected from the threats described in this article through the following products and services:

The Unit 42 Incident Response team can also be engaged to help with a compromise or to provide a proactive assessment to lower your risk.

Related Unit 42 Topics Supply Chain, Credential Harvesting, Obfuscation, Backdoor

July 2026 - Miasma Expansion or Potential Copycat?

On July 14, 2026, attackers compromised the release pipelines of four core AsyncAPI GitHub repositories, publishing five trojanized packages to npm:

  • @asyncapi/generator@3.3.1
  • @asyncapi/specs@6.11.2
  • @asyncapi/specs@6.11.2-alpha.1
  • @asyncapi/generator-helpers@1.1.1
  • @asyncapi/generator-components@0.7.1

The campaign calls itself miasma-train-p1, and the payload appears to be a descendant of the same Miasma RAT deployed in the June 2026 Red Hat supply chain operation. However, the initial access was different this time. Rather than a compromised employee account compromising the GitHub repository, the attackers exploited a process gap in the CI/CD pipeline itself.

The AsyncAPI repositories maintained strict branch protections and peer-review mandates on their primary main branches. However, pre-production release branches, specifically next and schema, were left unprotected. The threat actors pushed malicious commits directly to these shadow release branches that bypassed all human review (e.g., Commit 3eab3ec9304aa26081358330491d3cfeb55cc245 by attacker GitHub ID 148100). This commit triggered automated GitHub Actions build and release workflows.

The injected code ran inside the Continuous Integration (CI) runner itself, harvesting NPM_TOKEN and GITHUB_TOKEN environment secrets, then used the stolen npm token to programmatically publish backdoored package versions to the trusted @asyncapi scope on the public registry.

In contrast to the previous Miasma payload, this version’s architecture has changed. When a developer runs npm install on a compromised package, a backdoored source file executes, such as index.js, validator.js or utils.js.

To evade static code-integrity audits, the file exports a legitimate-looking schemas object with version-keyed JSON references. However, upon import, its main() function triggers a detached child process running an obfuscator.io-obfuscated script. That script determines the operating system via process.platform and creates a platform-specific persistence directory disguised as a legitimate NodeJS data folder:

  • %LOCALAPPDATA%\NodeJS on Windows
  • ~/Library/Application Support/NodeJS on macOS
  • ~/.local/share/NodeJS on Linux
  • ~/.config/node as a fallback

The payload then fetches the Stage-2 Miasma RAT from the InterPlanetary File System (IPFS) via a hard-coded content identifier (CID) Qmet4fhsAaWMBUxNDfREHwgiyDeSWy4YSYs9wiKUW5jGyf or QmQobZSp1wRPrpSEQ56qnyq7ecZh5Bg5k1fnjt4SUwwHb9. It then writes the RAT as sync.js and spawns it with detached: true, stdio: 'ignore' and windowsHide: true.

The parent process calls child.unref() and exits cleanly, giving the perception that nothing is wrong. The RAT is now running headlessly in the background.

Once executing, the Miasma RAT writes an operational lockfile, ~/.config/.miasma/run/node.lock. It does so to prevent redundant instances and to establish persistence via a user-scoped systemd service (miasma-monitor.service on Linux and macOS, or a miasma-monitor Run key on Windows).

To bypass automated system audits, the RAT writes its host-tracking identity cache to paths that mimic legitimate OS application storage:

  • ~/Library/Application Support/com.apple.spotlight/index-v2.cache on macOS (mimicking the Spotlight search index)
  • ~/.cache/mesa_shader_cache/gl_cache.bin on Linux (mimicking the Mesa OpenGL shader cache)
  • %HOME%\AppData\Roaming\Microsoft\CryptnetUrlCache\Content\msrt.dat on Windows (mimicking the Cryptnet certificate cache)

Credential theft targets are consistent with the June campaign:

  • GitHub tokens
  • npm tokens
  • SSH keys
  • Cloud provider credentials
  • Kubernetes service-account tokens
  • CI/CD secrets

Perhaps the most notable escalation is the command-and-control (C2) infrastructure. During the June Red Hat incident, the variant used a straightforward central C2 server. This campaign layers a decentralized fallback network on top of its primary C2 at 85.137.53[.]71. The RAT regularly polls hxxp://85.137.53[.]71:8080/api/v1/beacon for task commands. It also exfiltrates harvested credentials via HTTP POSTs to hxxp://85.137.53[.]71:8080/api/v1/file-result, forwarded to a dedicated upload listener on port 8081.

If the primary C2 IP address was blocked, the RAT accessed the public Ethereum RPC gateway at ethereum-rpc[.]publicnode[.]com to examine an on-chain smart contract (0x12c37A86a0Ed0beBe5d1d6a43E42f07860eAc710), which functioned as a decentralized registry for the active C2 address. This contract was launched by the adversary wallet 0x92d4C5413e4F7B258a114964101F9e1C6d64C6Ba and included a backup contract located at 0x1969ab05d67b67fdcaa26240f738ccb077e1cd84.

If that was also blocked, the RAT established communication with public Nostr relays (wss://relay.damus[.]io and wss://relay.nostr[.]com/) as out-of-band backup channels. Finally, it implemented a BitTorrent DHT bootstrap routine (using router.bittorrent[.]com:6881 and dht.transmissionbt[.]com:6881) to join a peer-to-peer network and discover alternate controllers.

This was a highly redundant, resilient and evasive C2 architecture designed to survive standard domain and IP-level mitigation strategies. Blocking any single layer does not kill the implant.

On July 14, 2026, Unit 42 researchers analyzed a compromised macOS developer machine on which the developer opened a project workspace in GitHub Copilot. When the copilot parsed the workspace and triggered automated dependency loading, it imported the trojanized @asyncapi/specs@6.11.2 package. This silently launched the Stage-1 loader, which fetched Miasma sync.js from IPFS and spawned it under Homebrew Node.js v22, initiating active beaconing to 85.137.53[.]71:8080.

The developer did not run npm install manually. The tooling did it for them.

The campaign also features self-attributed configurations that suggest this is merely the first wave of a broader, phased rollout. The worm's self-propagation capability is limited to four hops via a hard-coded generation cap (maxGen = 4). Additionally, its rollout approach leverages a default canary deployment strategy (batch.defaultStrategy = CANARY), which initially infects 5% of potential targets before scaling up in waves of 100.

This is not runaway malware. It is rate-limited by design to manage exposure and avoid triggering widespread detection during the initial spread.

Attribution remains the same open question as with the June 2026 campaign. The Miasma campaign shares infrastructure hosting patterns with TeamPCP, including the same Dutch autonomous system (AS43641/VSYS-AMS) used in prior operations against AntV, TanStack and Red Hat. With the addition of this miasma-train-p1 campaign identifier it can be tied directly to the lineage that includes Mini Shai-Hulud and the June Red Hat compromise.

It is difficult to determine whether TeamPCP threat actors are directly behind this campaign. The Mini Shai-Hulud source code has been public since May 12 and nothing in this operation requires insider access to TeamPCP tooling.

June 2026 - Mini Shai-Hulud Spreads the Blight

On June 1, 2026, a new supply chain attack compromised at least 32 packages published under the @redhat-cloud-services npm namespace, with the malicious versions cumulatively averaging approximately 80,000 weekly downloads. The root cause was a compromised Red Hat employee GitHub account, used to push malicious orphan commits to multiple RedHatInsights repositories, bypassing code review entirely.

The attacker triggered GitHub Actions workflows to request OpenID Connect (OIDC) tokens, publishing Trojanized packages with valid SLSA provenance. The certificate was accurate, the packages really were built by that pipeline. It just also happened to have malware injected into it at the time.

The payload is called Miasma. It is named after the description that the malware stamps on attacker-created GitHub repositories, "Miasma: The Spreading Blight." The threat is derived from the Mini Shai-Hulud malware open-sourced by TeamPCP on May 12, with substantially identical tradecraft.

The analyzed sample replaced a normal approximately 200 KB index.js with a 4.29 MB obfuscated payload. This is a 25x size increase that is itself a reliable detection signal.

Stolen credentials include:

  • GitHub tokens, npm tokens and SSH keys
  • AWS, GCP and Azure credentials and cloud identities
  • Kubernetes service-account tokens and HashiCorp Vault secrets
  • CI/CD secrets from GitHub Actions, CircleCI and related platforms

Attribution remains uncertain. The TTPs are consistent with TeamPCP, but the public release of the Mini Shai-Hulud source code means any competent actor can replicate the same attack. What is certain is the trend, which is that one compromised account and one CI pipeline delivered 32 trojanized packages automatically to every developer who ran npm install. Then the registry does the rest.

May 2026 - Mini Shai-Hulud Continues

Two further waves in May 2026 continued the Mini Shai-Hulud campaign:

  • The first introduced a fundamentally new initial-access technique that requires no stolen credential and produced the first malicious npm packages with valid supply chain levels for software artifacts (SLSA) provenance
  • The second demonstrated the largest single-hour package count of any Shai-Hulud wave

Both are attributed to TeamPCP, though the public release of the worm's source code on May 12 has already spawned separate copycat activity, complicating future attribution.

May 11, 2026: Mini Shai-Hulud Strikes Again

On May 11, TeamPCP launched a coordinated supply chain attack across the npm and PyPI ecosystems. The initial vector was TanStack's GitHub Actions CI pipeline. Within six minutes, 84 malicious package artifacts were published across 42 @tanstack/* packages.

The worm's self-propagation mechanism then expanded rapidly. By end of day, we had documented 373 malicious versions across 169 npm packages plus compromised PyPI packages.

The affected scope went well beyond TanStack. The worm's self-propagation spread the compromise to packages across multiple industries and ecosystems:

  • Enterprise infrastructure: @opensearch-project/opensearch (the official OpenSearch JavaScript client; versions 3.5.3–3.8.0) and 57 @uipath/* enterprise automation packages
  • AI tooling: @mistralai/mistralai and its Azure/GCP variants, which is the official Mistral AI TypeScript client
  • Specialized ecosystems: 19 @squawk/* aviation data packages, intercom-client@7.0.4 (customer messaging) and dozens of others across @tallyui, @draftlab, @beproduct, @mesadev and several unscoped packages

@tanstack/react-router alone receives over 12.7 million weekly downloads. We estimate 520 million cumulative downloads were in the affected window. Palo Alto Networks provides XDR and XQL queries to detect this activity.

A New Initial Access: No Stolen Credential Required

Every prior Shai-Hulud wave began with a stolen or phished credential. The TanStack attack needed neither. Instead, three GitHub Actions weaknesses were chained, none of which was sufficient alone.

Step 1: Pwn Request

On May 10, the attacker created a fork of TanStack/router under the account zblgg/configuration, deliberately named to avoid appearing in fork-list searches. A malicious commit was authored under the spoofed identity claude <claude@users.noreply.github.com>, impersonating the Anthropic Claude GitHub App, and prefixed [skip ci] to suppress automated CI on push.

A pull request (PR #7378) against TanStack/router#main then triggered bundle-size.yml — a workflow that used the pull_request_target trigger and checked out the fork's merge ref. This gave the fork's code execution in the base repository's runner context, with full access to its cache scope.

The threat actors used Bun, which is a lightweight JavaScript runtime and package manager alternative to Node.js and npm as shown in Figure 1. The attack used Bun to execute the malicious payload tanstack_runner.js. This in turn attempted to enumerate the system for sensitive credentials, including invoking the GitHub CLI to capture the GitHub authentication token (gh auth token).

Code snippet of execution chain with some information redacted.
Figure 1. Mini Shai-Hulud TanStack execution chain on Windows.
Kubernetes

In a Linux-hosted Kubernetes environment, Unit 42 observed legitimate runc create container activity associated with a build pipeline that subsequently retrieved and executed the compromised JavaScript package. The runc create invocation itself was legitimate Kubernetes runtime activity associated with the containerized build process.

During the build:

  • The project again dynamically retrieved and executed the Bun runtime through its pnpm dependency chain
  • It subsequently executed the malicious JavaScript payload tanstack_runner.js
  • Then proceeded as in the Windows environment

The process lineage is shown in Figure 2.

Code snippet of execution chain in the kubelet node.
Figure 2. Mini Shai-Hulud TanStack execution chain in Linux hosted Kubernetes.

Step 2: GitHub Actions Cache Poisoning

The fork's code wrote a 1.1 GB poisoned pnpm store under the exact cache key that release.yml would later look up. The key was pre-computed from the public pnpm-lock.yaml using the same hashFiles() formula the workflow uses. The poisoned cache entry then sat dormant for eight hours.

A critical detail: actions/cache@v5's post-job save uses a runner-internal token, not the workflow GITHUB_TOKEN, so setting permissions: contents: read on the workflow does not prevent the cache write.

Step 3: OIDC Token Extraction From Runner Memory

When a legitimate maintainer pushed to main, release.yml triggered, restored the poisoned cache and executed attacker-controlled binaries during the build phase. Those binaries read /proc/<Runner.Worker>/mem and extracted the OIDC token — minted lazily in runner memory only when id-token: write is set — then POSTed it directly to registry.npmjs.org.

The workflow's own Publish Packages step was never reached; tests failed and that step was skipped. npm received 84 valid, signed, provenance-attested package publishes anyway.

This is the same /proc-memory extraction technique documented in the tj-actions/changed-files compromise of March 2025 and reused in the April 2026 SAP and Bitwarden waves.

The SLSA Provenance Problem

This is the first documented case of a worm publishing malicious npm packages with valid SLSA Build Level 3 provenance. Sigstore correctly attested that the packages were built by release.yml from refs/heads/main of TanStack/router — because they were. SLSA provenance confirms which pipeline built a package, not whether that pipeline's internal state was clean.

The root cause is the same OIDC trust-scope misconfiguration exploited in the April 29 @cap-js wave. The trusted-publisher binding trusted the entire repository rather than a specific workflow on a protected branch.

Provenance verification is necessary but no longer sufficient. This is why behavioral analysis at install time is essential.

Payload and Propagation

The malicious payload, router_init.js (2.3 MB obfuscated), was not delivered via a preinstall hook on the compromised packages themselves. Instead, each tarball received an injected optionalDependencies entry pointing to an orphaned commit in the attacker's fork.

This is a commit that GitHub surfaces under the legitimate TanStack/router URL due to shared fork-network commit object storage:

The dependency is designed to fail silently during installation. The malicious code executes in the background while the install process appears normal, leaving near-zero trace in logs. The payload uses multiple layers of obfuscation and encryption to resist automated analysis. It shares the same custom cipher documented in the April 22 Bitwarden and April 29 SAP sections, confirming shared authorship across all three waves.

For secondary victims infected via worm propagation (e.g., UiPath, Mistral AI and OpenSearch), the delivery mechanism reverted to the familiar preinstall hook from the April SAP wave.

The pattern is now well-established. Once the worm gains a foothold in one ecosystem, it uses stolen credentials to republish itself into every other package the victim maintains, rapidly expanding its reach across unrelated projects and organizations.

The Dead-Man's Switch: A Critical Remediation-Order Warning

The May 11 payload installs a persistent background service that polls api.github.com/user with the stolen GitHub token every 60 seconds. If the token is revoked (HTTP 40x), the service executes rm -rf ~/ — destroying the user's home directory. The daemon auto-exits after 24 hours.

May 12, 2026: Public Release of the Worm

On the evening of May 12, 2026, the fully weaponized Mini Shai-Hulud source code was published to public GitHub repositories before being taken down. The toolchain including the CI cache-poisoning scripts, OIDC token extractor and the credential stealer with its propagation logic is now publicly available.

Mini Shai-Hulud is no longer scoped to TeamPCP. Future incidents using this toolchain may not share TeamPCP's infrastructure or tradecraft and should not be attributed solely on the basis of worm lineage.

May 19, 2026: @antv Wave

On May 19, 2026, the npm maintainer account atool was compromised as part of a new Mini Shai-Hulud wave. In approximately one hour, 639 malicious package versions were published across 323 unique packages. This is the largest single-hour package count of any Shai-Hulud wave to date.

The affected scope spans the @antv data visualization ecosystem and related libraries:

  • @antv/g2, g6, x6, l7, s2, f2, g, g2plot, graphin, data-set and s2-vue
  • Packages outside the @antv namespace including echarts-for-react ( approximately 1.1 million weekly downloads), timeago.js, size-sensor and canvas-nest.js

The potential area of impact across data visualization, graphing, mapping, charting and React component ecosystems is significant.

Infection Mechanism

Unlike the TanStack wave's pipeline-hijack technique, this wave returns to a simpler model. This involves compromising a maintainer account and using it to republish packages directly. This is the same approach seen in the September and November 2025 campaigns.

The attacker modified each package's package.json in three ways:

  • Adding a preinstall hook ("preinstall": "bun run index.js") that executes the malicious payload via the Bun runtime
  • Bundling Bun as a dependency to ensure it's available on any machine
  • Inserting a git-based optional dependency pointing to an orphaned commit in the legitimate antvis/G2 repository as a backup execution path

To ensure the malicious versions reached as many targets as possible, the attacker also bumped version numbers beyond the latest legitimate release (e.g., @antv/s2-vue jumped from the real version 2.2.0 to 2.4.0). Any project using a permissive version range like ^2.x would automatically pull the malicious version on its next install.

Payload Capabilities

The 499 KB obfuscated payload runs six credential collectors in parallel, sweeping a broad range of targets:

  • Developer credentials: GitHub tokens, npm tokens, SSH keys, Git credentials and private keys
  • Cloud and infrastructure: AWS credentials and parameters, Kubernetes service-account tokens, HashiCorp Vault secrets and Docker authentication
  • CI/CD platforms: Tokens from 18-plus platforms including GitHub Actions, GitLab CI, CircleCI, Vercel and Netlify
  • Third-party services: Database connection strings, Stripe, Slack and Twilio API keys
  • Password managers (new to this wave): The payload directly queries 1Password, Bitwarden, pass and gopass via their local CLIs

All stolen data is encrypted and sent to a C2 endpoint disguised as OpenTelemetry trace ingestion (t.m-kosche[.]com), meaning network monitoring tools may classify the traffic as legitimate observability telemetry.

A fallback channel exfiltrates data to GitHub repositories created under the victim's account, using Dune-themed names and the reversed campaign marker Shai-Hulud: Here We Go Again as the description.

April 2026 - Shai Hulud: A New Wave

Late April Mini Shai-Hulud Wave

As of April 29, 2026, a new supply chain attack wave (dubbed Mini Shai-Hulud) is actively targeting the SAP developer ecosystem via four compromised npm packages.

The affected versions are:

  • @cap-js/sqlite@2.2.2
  • @cap-js/postgres@2.2.2
  • @cap-js/db-service@2.10.1 mbt
  • @1.2.48

Combined, these packages carry approximately 570,000 weekly downloads, with @cap-js/sqlite and @cap-js/db-service each pulling around 250,000 and 260,000 downloads, respectively.

All four packages are part of SAP's Cloud Application Programming (CAP) Model and multitarget application (MTA) build toolchain. This makes the targets of this attack enterprise developers and CI/CD pipelines with access to cloud credentials, GitHub tokens and deployment secrets.

The campaign is a close structural continuation of the @bitwarden/cli@2026.4.0 compromise earlier in April 2026. It uses the same toolchain, same obfuscation and same propagation logic, which is now turned against the SAP ecosystem.

Attack Mechanism

Each compromised package received two new files:

  • setup.mjs
  • execution.js

These files arrived along with a modified package.json that adds a preinstall lifecycle hook ("preinstall": "node setup.mjs"). This means the malicious code executes automatically during the npm install process, before the installation is complete. The setup.mjs bootstrapper detects the host OS and architecture, then performs the following activities:

  • Downloading the Bun JavaScript runtime (v1.3.13) from the official github[.]com/oven-sh/bun releases
  • Extracting the runtime to a temporary directory
  • Immediately using it to execute execution.js

Payload Capabilities

The 11.7 MB single-file, obfuscated credential stealer, execution.js, is a propagation framework. It performs the following activities:

  • Using a custom string scrambling layer labeled ctf-scramble-v2 to hide sensitive strings from static analysis
  • Including a Russian locale killswitch (exiting silently if the system locale is set as ru)
  • Daemonizing itself on non-CI machines to run in the background

It harvests the following information:

  • GitHub tokens (including gh auth token output)
  • npm tokens from .npmrc
  • Full environment variable blocks
  • GitHub Actions secrets
  • AWS STS identity
  • Secrets Manager and SSM parameters
  • Azure Key Vault secrets
  • GCP Secret Manager values
  • Kubernetes service account tokens
  • Claude and MCP configuration files
  • Electrum wallets
  • VPN configs

A particularly aggressive CI path uses an embedded Python helper that reads the /proc memory of the GitHub Actions Runner.Worker process to extract masked secret values.

All collected data is:

  • Compressed
  • AES-256-GCM encrypted with a key wrapped under an embedded RSA public key
  • Exfiltrated to freshly created public GitHub repositories with randomized Dune-themed names and the description A Mini Shai-Hulud has Appeared

Propagation and GitHub Dead Drop

The campaign uses GitHub's public commit search API as a covert command and control (C2) channel. The malware performs the following activities:

  • Searching for commits containing the keyword OhNoWhatsGoingOnWithGitHub
  • Decoding matching commit messages as a token dead-drop to recover stolen GitHub tokens
  • Using them to spread

Once a usable token is obtained, the payload:

  • Copies itself into execution[.]js
  • Writes setup.mjs
  • Sets "preinstall": "node setup.mjs" in package.json
  • Increments the patch version
  • Repacks the tarball for publishing

The malware also pushes the following files directly into victim repositories:

  • .vscode/setup.mjs
  • .claude/execution.js
  • .claude/settings.json

The malware pushes the above files using commits authored as claude <claude@users.noreply.github.com> with the message chore: update dependencies.

The three forensic links to @bitwarden/cli@2026.4.0 are precise enough to indicate shared authorship or a directly reused toolchain.

1. The setup.mjs preinstall bootstrapper. In the Bitwarden campaign, setup.mjs was the self-replication artifact the worm (bw1.js) injected into every npm package the victim could publish. The SAP packages use that same filename as their bootstrapper, and the two share clear common lineage: same Bun version (1.3.13), same Alpine/musl detection logic and the same redirect-following download approach.

2. The decodeScramble / ctf-scramble-v2 obfuscation method. The Bitwarden payload encodes all sensitive strings using a custom seeded ASCII shuffle cipher. This is a Fisher-Yates shuffle over a 128-character ASCII table driven by a linear congruential PRNG seeded with 0x3039 (12345). The SAP execution.js uses a layer explicitly labeled ctf-scramble-v2, which is the same deterministic substitution scheme. This is not a library, it is a bespoke implementation. It is reused across both payloads.

3. The GitHub commit dead-drop pattern. The Bitwarden malware used GitHub's public commit search API as a covert C2 channel. It embedded stolen tokens in commit messages matching LongLiveTheResistanceAgainstMachines:<base64> and used them to bootstrap new exfiltration channels without attacker-controlled infrastructure.

This wave applies the exact same pattern under a new keyword (OhNoWhatsGoingOnWithGitHub) with matching commit messages decoded as a token dead-drop. The mechanism is identical in implementation:

  • Search the GitHub API for commits containing the keyword
  • Parse the commit message body
  • Decode the embedded token
  • Validate it for repository access

Rotating the keyword while keeping the technique intact is a hallmark of the same operator updating a reused codebase.

Broader Shai-Hulud Campaign Context

According to Checkmarx's official security update, this npm package is one component of a broader supply-chain campaign that simultaneously compromised multiple Checkmarx distribution channels:

  • Docker Hub: Poisoned checkmarx/kics images (v2.1.20, v2.1.21, latest, alpine, debian)
  • GitHub Actions: Malicious checkmarx/ast-github-action v2.3.35
  • VS Code extensions: Backdoored checkmarx/ast-results (v2.63, v2.66) and checkmarx/cx-dev-assist (v1.17, v1.19)
  • npm: The @bitwarden/cli package analyzed in this report

Per Checkmarx's disclosure, all artifacts share the same C2 infrastructure (audit.checkmarx[.]cx), the same obfuscation techniques and the same credential harvesting and propagation logic. The VS Code extension variant delivered its payload (mcpAddon.js) from a backdated orphan commit in Checkmarx's own GitHub repository, making the download URL appear trustworthy.

TeamPCP (@pcpcats) publicly took credit for the compromise. Per Socket's analysis, the group had previously targeted Checkmarx infrastructure in March 2026, along with Trivy and LiteLLM, suggesting an ongoing campaign against security tooling vendors.

Attack Overview

Table 1 shows the attributes of the attack.

Attribute Detail
Package @bitwarden/cli@2026.4.0
Trigger preinstall lifecycle script
Runtime Bun v1.3.13 (downloaded during install)
C2 server audit.checkmarx[.]cx:443 (94.154.172[.]43)
C2 path /v1/telemetry
Fallback C2 Dynamic, fetched via GitHub Search API dead drop
Exfiltration HTTPS POST (encrypted) + GitHub public repos
Attribution TeamPCP (@pcpcats)

Table 1. Attributes of the attack.

The Bitwarden security team provided the following information. They identified and contained the malicious package described in Table 1, which was briefly distributed through the npm delivery path for @bitwarden/cli@2026.4.0 between 5:57 PM and 7:30 PM EST on April 22, 2026, in connection with the broader supply chain incident.

Their investigation found no evidence that end user vault data was accessed or at risk, or that production data or production systems were compromised. Once the issue was detected, they:

  • Revoked compromised access
  • Deprecated the malicious npm release
  • Immediately initiated remediation steps

The issue affected the npm distribution mechanism for the CLI during that limited window, not the integrity of the legitimate Bitwarden CLI codebase or stored vault data.

People who did not download the package from npm during that window were not affected. Bitwarden completed a review of internal environments, release paths and related systems. They found no additional impacted products or environments at this time.

A CVE for Bitwarden CLI version 2026.4.0 is being issued in connection with this incident.

Stage 1: Bootstrap - bw_setup.js

The package.json provides two execution paths for the malicious script, as shown in Figure 3.

Screenshot of a code snippet in JSON format. It includes a "scripts" section with a "preinstall" key running node and a "bin" section with "bw".
Figure 3. Execution paths for the malicious script in the package.json file.

The preinstall hook runs automatically during npm install. The bin field registers bw_setup.js as the bw command, symlinking it into the user's PATH.

Since the legitimate Bitwarden CLI also uses bw as its binary name, this serves as a secondary trigger. Even if preinstall is blocked (e.g., via --ignore-scripts), the malware executes the next time the user or any script invokes bw. The shebang line #!/usr/bin/env node at the top of bw_setup.js ensures it runs as a Node.js script when called directly.

The bootstrap script performs three actions:

  1. Platform detection: Identifies the OS and architecture (Linux, macOS, Windows; x64 or arm64), including musl versus glibc detection on Linux.
  2. Bun runtime download: Downloads the Bun JavaScript runtime (v1.3.13) from the official github[.]com/oven-sh/bun releases. This is needed because the main payload uses Bun-specific APIs (shell execution, file I/O, gzip) not available in Node.js.
  3. Payload execution: Runs bw1.js using the freshly downloaded Bun binary.

A custom ZIP extraction implementation is included to avoid any dependencies, making the bootstrap entirely self-contained.

Stage 2: The Payload - bw1.js

The payload is an approximately 10 MB single-line JavaScript file containing approximately 285,000 lines when formatted. It bundles legitimate software developer kits (SDKs) (e.g., AWS SDK, Google Cloud client libraries, Azure Identity, Octokit, jsonwebtoken, tar) alongside the malicious orchestration code.

Obfuscation Techniques

The code employs multiple layers of obfuscation:

  • String table rotation: A function _0x214e resolves hex indices to strings from a large rotated array (_0x1ee1), breaking simple static string analysis.
  • Seeded ASCII shuffle cipher: Sensitive strings (domains, file paths, shell commands) are encoded as arrays of numeric indices into a Fisher-Yates-shuffled ASCII table. The shuffle uses a linear congruential PRNG seeded with 0x3039 (12345), as shown below in Figure 4.
Screenshot of a snippet showing a class named PRNG with a constructor and next methods. The constructor sets a seed value, while the next method recalculates the seed using a specific formula and returns it after division by a large number.
Figure 4. Seeded ASCII shuffle cipher.

The 128-character ASCII set is shuffled deterministically, producing a substitution table where an index with the hex value 0x42 maps to the ASCII character a, 0x6e to u. For example, the C2 domain is stored as [0x42, 0x6e, 0x36, 0x4b, 0x2b, 0x5c, 0xd, 0x57, 0x0, 0xd, 0x7, 0x26, 0x42, 0x3, 0x2a, 0x5c, 0xd, 0x2a], which decodes to an ASCII string for the domain audit.checkmarx[.]cx.

  • Gzip and Base64 embedded payloads: Several blobs are stored as gzip-compressed Base64 strings, including an RSA public key, a GitHub Actions workflow YAML, the worm's setup.mjs loader and a manifesto string
  • Mangled identifiers: All variable and function names are replaced with hex patterns such as _0x3865d8

Credential Harvesting

The payload deploys multiple provider classes, each targeting a different credential source. Every provider scans its results with regex patterns to extract npm and GitHub tokens, as shown in Figure 5.

Screenshot of a code snippet showing two regular expressions for detecting tokens: one for 'ghtoken' and another for 'npmtoken', both following a specific pattern.
Figure 5. Regex patterns to extract npm and GitHub tokens.
File System Provider (Cn)

Reads sensitive files from the developer's workstation, with per-OS path lists decoded via the scrambler as shown below in Table 2.

Platform Targeted Files
Linux ~/.ssh/id_*, ~/.ssh/keys, .git/config, ~/.npmrc, .npmrc, .env, ~/.claude/mcp.json, ~/.claude.json, ~/.kiro/settings/mcp.json
macOS ~/.aws/credentials, .git/config, ~/.npmrc, .npmrc, .env, ~/.claude.json, .claude.json, ~/.kiro/settings/mcp.json, .kiro/settings/mcp.json
Windows Credential store paths, config.ini

Table 2. OS path lists from the malware.

Files larger than approximately 5 MB are skipped. All others are read in full and included in the exfiltration payload.

Shell Provider (un)

Runs gh auth token via execSync to capture the GitHub CLI's active token, and then harvests the full process.env environment block. Both are returned for token-regex scanning and exfiltration. Unlike the cloud providers below, the Shell Provider does not use any SDK — it relies solely on the single shell command and environment variables.

GitHub Actions Provider (Co)

Detects CI/CD environments via process.env.GITHUB_ACTIONS === "true" and extracts all configured secrets by parsing {"value":"...","isSecret":true} patterns from the Actions runner context.

AWS SSM Provider (ku)

Uses the bundled AWS SDK (SSMClient, DescribeParameters, GetParameter) to enumerate and read parameters from AWS Systems Manager Parameter Store.

Azure Key Vault Provider (Rn)

Uses Azure Identity and Key Vault SDK to call getSecretsFromVault, listing and reading secrets from all accessible vaults.

Google Cloud Secret Manager Provider (uo)

Uses the Google Cloud Secret Manager client to listSecrets and accessSecretVersion, reading all accessible secrets across projects.

Exfiltration

All harvested credentials are processed through a two-tier exfiltration system.

Primary: HTTPS to C2 (Cy Class)
  1. Results are serialized to JSON and compressed with gzip
  2. A random 32-byte AES-256-GCM symmetric key is generated
  3. The data is encrypted with AES-256-GCM
  4. The symmetric key is RSA-encrypted with a hard-coded 4096-bit public key (Fr)
  5. The encrypted envelope is sent via POST hxxps[:]//audit.checkmarx[.]cx:443/v1/telemetry.
Secondary: GitHub Public Repositories (ky Class)

Using stolen GitHub tokens, the malware:

  1. Creates a new public repository under the victim's account with the description "Checkmarx Configuration Storage" and a Dune-themed name (e.g., gesserit-melange-813)
  2. Commits encrypted result files to a results/ directory
  3. Embeds stolen tokens in commit messages using the format LongLiveTheResistanceAgainstMachines:<base64_token>

This dual exfiltration ensures data reaches the attacker even if the C2 domain is blocked.

GitHub Actions Workflow Injection (u_ Class)

When the malware obtains a GitHub token with repo and workflow scopes, class u_ validates the scopes and then:

  • Enumerates repositories the victim can push to, prioritizing recently active ones
  • Checks whether each repo has configured GitHub Actions secrets (skips repos without them)
  • Creates a new branch, commits .github/workflows/format-check.yml — a malicious workflow that dumps all secrets, as shown below in Figure 6.
Screenshot of a a YAML configuration script for a GitHub Actions workflow. The workflow name is "Formatter" it uses the "actions/checkout" and "upload-artifact" actions. The workflow is configured to output results to a specific file.
Figure 6. Content of the format-check.yml file.
  • Downloads the resulting artifact containing all serialized secrets
  • Deletes the branch and workflow run to cover its tracks

npm Worm Propagation

This is the self-replicating component. When the malware finds an npm token (npm_...):

Token Validation

Calls the npm tokens API with Authorization: Bearer <token>, verifies the token has publish (write) permission on the package scope and that it bypasses two-factor authentication (2FA).

Package Enumeration

Using the validated token:

  • Fetches the npm username
  • Iterates through the token's allowed resources (orgs, scopes, specific packages)
  • Queries /-/org/<user>/package for writable packages
  • Falls back to /-/v1/search?text=maintainer:<user> for public packages
Tarball Download and Backdooring

For each target package:

  • Downloads the latest tarball from the npm registry
  • Extracts it to a temporary directory
  • Copies the Bun binary into the package
  • Rewrites package.json:
    • Clears all scripts
    • Sets "preinstall": "node setup.mjs" (decoded from the scrambler)
    • Bumps the patch version (e.g., 1.2.3 → 1.2.4)
  • Writes setup.mjs with the full worm payload (K$, a gzip+Base64 encoded copy of the malware)
  • Re-packs the tarball
Publishing

Writes a .npmrc with the stolen token's auth line (//registry.npmjs[.]org/:_authToken=<token>) and runs bun publish <tarball>.

Every newly infected package will trigger the same preinstall chain on any developer who installs it, creating an exponential propagation vector.

C2 Resilience: The GitHub Dead Drop

The malware implements a fall back mechanism for C2 resilience using GitHub's public search API as a covert command channel.

If the primary C2 server (audit.checkmarx[.]cx) is unreachable, the malware:

  1. Searches GitHub commits for the keyword beautifulcastle via the public Search API
  2. Finds a matching commit in [helloworm00/hello-world](hxxps[:]//github[.]com/helloworm00/hello-world) (commit bc544f4, dated April 21 - one day before the main attack)
  3. Parses the commit message body with the regex /beautifulcastle ([A-Za-z0-9+/=]{1,30})\.([A-Za-z0-9+/=]{1,700})/
  4. Decodes the first capture group from Base64 to get a domain
  5. Verifies the second capture group as a digital signature (512-byte RSA-4096) against the hard-coded public key Er, ensuring only the attacker can direct the malware to a new C2 server

At the time of analysis, the dead drop contained a placeholder value (hxxps[:]//example[.]com), indicating it was pre-staged for future use. The attacker can rotate C2 infrastructure at any time by creating a new signed commit on any public GitHub repository.

A second fall back (Hr function) searches for commits matching LongLiveTheResistanceAgainstMachines:<base64> to recover previously stolen GitHub tokens from exfiltration repos, bootstrapping new GitHub-based exfiltration channels without any attacker-controlled infrastructure.

Anti-Detection Measures

  • Russian locale killswitch: The mz0 function checks Intl.DateTimeFormat().resolvedOptions().locale, LC_ALL, LC_MESSAGES, LANGUAGE and LANG for Russian (ru). If any match, the malware calls process.exit(0) immediately without executing
  • Daemonization: The Ml0 function re-spawns the process detached with __DAEMONIZED=1 in the environment, allowing the parent to exit cleanly while the payload runs in the background
  • PID-based lock file: $l0 writes process.pid to a temp file and checks whether a previous instance is still alive via process.kill(pid, 0), preventing multiple instances from running simultaneously
  • Signal handlers: Catch SIGINT/SIGTERM with no-op callbacks (() => {}) to prevent interruption
  • Temp directory cleanup: After tarball manipulation removes forensic artifacts
  • All sensitive strings: Encoded via the scrambler or gzip+Base64
  • Silent error handling: Failures are caught and suppressed
  • Innocuous naming: The C2 path v1/telemetry mimics legitimate analytics endpoints

Interim Guidance

  1. Block the C2 domains and IPs listed above at the network perimeter.
  2. Rotate all credentials that may have been exposed: npm tokens, GitHub PATs, AWS/Azure/Google Cloud keys, SSH keys and CI/CD secrets.
  3. Audit npm packages you maintain for unauthorized version bumps or new preinstall hooks.
  4. Review GitHub for unauthorized repository creation, unexpected workflow files and artifact downloads.
  5. Search for the format-results artifact in GitHub Actions logs across your organization.
  6. Hunt for unexpected Bun process execution and outbound connections to the IoC infrastructure.
  7. Pin dependencies to known-good versions using lockfiles and integrity hashes.

Unit 42 Managed Threat Hunting Queries

The Unit 42 Managed Threat Hunting team continues to track any attempts to exploit this CVE across our customers, using Cortex XDR and the XQL queries below. Cortex XDR customers can also use these XQL queries to search for signs of exploitation.

The following XQL query has been used to successfully identify execution of a JavaScript file through Bun that subsequently calls the GitHub CLI in a likely attempt to collect locally stored authentication tokens. While Bun is legitimate in many developer environments, its use as a runtime for package install malware in this campaign makes this behavior worth investigating when observed with credential access commands such as gh auth token:

Conclusion

Unit 42 has witnessed a shift since the September 2025 Shai-Hulud incident, proving that it wasn’t a temporary spike but the new baseline for software supply chain risk. In an ecosystem where code is shared at the speed of thought, a single compromised dependency can trigger a global cascade.

Ultimately, npm compromises share commonalities and organizations can navigate this volatility by keeping particular best practices in mind. As we continue to monitor, analyze and update our findings related to npm packages, we encourage you to move beyond static defenses and embrace a culture of continuous verification. The supply chain may be the new primary target, but with collective intelligence and relentless visibility, it doesn’t have to be the primary vulnerability.

Palo Alto Networks customers are better protected by our products, as listed below. We will update this threat brief as more relevant information becomes available.

Mitigations for Compromised npm Packages

Enforce Cooldown Periods

Implement a policy (via a private registry or proxy like Artifactory) that blocks any package version published within the last 24 to 72 hours. Most malicious packages are identified and removed from the public registry within this window.

Disable Lifecycle Scripts

Many compromises rely on preinstall or postinstall hooks to exfiltrate secrets. Use the following in your .npmrc: ignore-scripts=true.

Version Pinning and npm ci

Use package-lock.json and ensure your CI/CD pipelines use npm ci instead of npm install. This prevents the "hidden" update of dependencies during a build.

Private Registry Proxying

Never allow developer machines or CI runners to talk directly to registry.npmjs[.]org. Route all traffic through a private registry.

Namespace Shadowing (Prevention of Dependency Confusion)

Attackers often publish packages with the same name as your internal libraries to the public registry. Always use scoped packages (e.g., @myorg/internal-lib) and configure your private registry to only resolve that scope internally.

Provenance Verification

Verify the OpenID Connect Attestation. Many major packages provide "provenance," proving the code was built on a specific GitHub/GitLab runner. Use tools like slsa-verifier to check these during the build.

Egress Filtering in CI/CD

Most npm-based malware attempts to send ~/.npmrc tokens or ~/.ssh keys to a C2 server. Apply strict egress network policies to your CI runners. Only allow connections to your private registry and known deployment targets.

Software Bill of Materials (SBOM)

Automatically generate an SBOM for every production release. This allows your security team to perform instant impact analysis when a new zero-day is announced.

Palo Alto Networks Product Protections Related to Compromised npm Packages

Palo Alto Networks customers can leverage a variety of product protections and updates to identify and defend against this threat.

If you think you might have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Advanced WildFire

The Advanced WildFire machine-learning models and analysis techniques have been reviewed and updated in light of indicators associated with npm compromises, including the malicious Bitwarden package.

Cloud-Delivered Security Services for the Next-Generation Firewall

Advanced URL Filtering and Advanced DNS Security identify known domains and IP addresses associated with this activity as malicious.

Cortex Cloud

Cortex Cloud’s Application Security Module (ASPM) supports the scanning of npm packages installed on cloud resources as well as monitoring audit logs from third party SaaS vendors, including GitHub as discussed within this article. Cortex Cloud prioritizes alerts, issues, policies and assets based on ingested applications as well as their usage. This allows security teams to maintain security awareness across their on-premises and cloud environment by identifying and remediating impacted cloud resources and actively responding to associated runtime operations from the threats discussed within this article through Cortex Cloud’s XDR Agent and serverless operations. For additional details about how to protect against this threat using Cortex Cloud, please see their blog.

Koi Agentic Endpoint Security

Koi Agentic Endpoint Security allows customers to delay automatic updates for all installed packages by a set time window, allowing newly pushed versions to establish reputation and undergo public scrutiny before being deployed in your environment.

Indicators of Compromise

Indicators From July 14, 2026 Miasma Activity

tcp://85.137.53[.]71 Central C2 node. Hosts beacon, exfil, and proxy management.
hxxp://85.137.53[.]71:8080 Port 8080 HTTP C2 beacon.
hxxp://85.137.53[.]71:8080/api/v1/beacon Contacted by Stage-2 sync.js (73b44b87...).
hxxp://85.137.53[.]71:8080/api/v1/file-result Used for file and credential exfiltration. Has four VT detections.
hxxp://85.137.53[.]71:8081 Port 8081 exfil listener.
hxxp://85.137.53[.]71:8091 Port 8091 proxy control.
fqdn://ipfs[.]io Abused to deliver Stage-2 payloads.
fqdn://rentry[.]co Used to exfiltrate tokens/keys.
fqdn://ethereum-rpc.publicnode[.]com Public node gateway to query C2 smart contracts.
fqdn://relay.damus[.]io Out-of-band decentralized C2 fallback.
fqdn://relay.nostr[.]com Out-of-band decentralized C2 fallback.
fqdn://router.bittorrent[.]com DHT bootstrap node on port 6881.
fqdn://dht.transmissionbt[.]com DHT bootstrap node on port 6881.
0x12c37A86a0Ed0beBe5d1d6a43E42f07860eAc710 Mainnet contract dead-drop.
0x1969ab05d67b67fdcaa26240f738ccb077e1cd84 Secondary mainnet fallback contract.
0x92d4C5413e4F7B258a114964101F9e1C6d64C6Ba Wallet that created and updated contracts.
73b44b8724d31f80859018c988e9b033155c5fd8225205a914eda1a11b78a841 Loader inside @asyncapi/specs@6.11.2. Spawns detached node child.
f7367ce5509f536a406deecdbb577c60e8585cb2ab77058a86bde6188a609cfd Loader inside @asyncapi/specs@6.11.2-alpha.1.
9b2e65db653ca8575c9b10eefb9a80c6006404812c2ec212bf5675e3c690233b @asyncapi/specs@6.11.2. Verified by REF06.
d425e4583cc6185d41e95c45eda00550045a5d1919b9a012236a4520d009dbd7 @asyncapi/specs@6.11.2-alpha.1. Verified by REF06.
bfaeb987faa6de2b5a5eb63b1233d055215b09b0349a9394f2175fd7cdf385e4 @asyncapi/generator@3.3.1. Verified by REF06.
34014776d3d3ff11bc4439b02fd7ac0f02a887eb3a052eeafff236e2f6db8ad1 @asyncapi/generator-helpers@1.1.1. Verified by REF06.
082d733db0687dcd768104972b065d4b58cb1e6043688c6c20fa3702337f36ab @asyncapi/generator-components@0.7.1. Verified by REF06.
22bf76fe317ea6769bd38619bd440e42d119bd6b Inside @asyncapi/generator. Sourced from REF04.
a7e18d96efd3cdb127ef4cdcad9e3ad26c482bf2 Inside @asyncapi/generator-helpers. Sourced from REF04.
9890950adcbc2478e7a080234f053214adbad44e Inside @asyncapi/generator-components. Sourced from REF04.
c70e105e212ff3c1daa04bb2a62507717f296b0b Inside @asyncapi/specs. Sourced from REF04.
c8cb3f6d5b90c46686d2bf531dc1a5786e27edc5 Core Miasma RAT binary. Sourced from REF04.
540028bbd229cc8ce0f531f84e11296870f9b54faa231abb6f5da8557ae3df31 Downloaded from C2. Sourced from C2 relations.
QmQobZSp1wRPrpSEQ56qnyq7ecZh5Bg5k1fnjt4SUwwHb9 Delivers sync.js.
Qmet4fhsAaWMBUxNDfREHwgiyDeSWy4YSYs9wiKUW5jGyf Delivers sync.js specs/react-sdk variant.
ssl://0432fa4ba871877d94081fe83323fa24dfa1491e9de8725cbab7b734de9e9be3b233ef6742fd6264437c9532223d687b05fa540b70af6a516b8539af84d0eeb48e Used to sign/verify C2 instructions.
3eab3ec9304aa26081358330491d3cfeb55cc245 Pushed to asyncapi/generator next branch.
148100 Account used to commit backdoored code.

Indicators From April 29, 2026 Activity

Affected Packages

  • @cap-js/sqlite@2.2.2
  • @cap-js/postgres@2.2.2
  • @cap-js/db-service@2.10.1 mbt@1.2.48

SHA256 Hashes

  • setup.mjs: 4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34
  • execution.js: 6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95

URLs

  • hxxps[:]//github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/ (Bun download)
  • hxxps[:]//api.github[.]com/search/commits?q=OhNoWhatsGoingOnWithGitHub (dead drop)

Indicators From April 22, 2026 Activity

Network Indicators

Table 3 lists the network indicators from this activity.

Indicator Type
audit.checkmarx[.]cx C2 domain
94.154.172[.]43 C2 IP address
checkmarx[.]cx Attacker-controlled domain
91.195.240[.]123 Attacker IP address

Table 3. Network indicators.

GitHub Indicators

Table 4 lists the GitHub indicators from this activity.

Indicator Type
helloworm00/hello-world Dead drop repository
bc544f455d7c06c8a1f3446160a6d9a4a8236b11 Dead drop commit SHA1 hash
helloworm00@proton[.]me Attacker email address
Commit messages matching LongLiveTheResistanceAgainstMachines:* Exfiltration staging
Public repositories named <dune-word>-<dune-word>-<3digits> with description "Checkmarx Configuration Storage" Exfiltration repositories

Table 4. GitHub indicators.

Files and Process Indicators

Table 5 lists the file and process indicators from this activity.

Indicator Type SHA256 hash
bw_setup.js Bootstrap script f35475829991b303c5efc2ee0f343dd38f8614e8b5e69db683923135f85cf60d
bw1.js Obfuscated payload 18f784b3bc9a0bcdcb1a8d7f51bc5f54323fc40cbd874119354ab609bef6e4cb
package.json Malicious manifest 167ce57ef59a32a6a0ef4137785828077879092d7f83ddbc1755d6e69116e0ad
setup.mjs in infected packages Worm payload
Unexpected bun process execution Runtime indicator
.github/workflows/format-check.yml on transient branches Workflow injection
format-results workflow artifact Secret exfiltration

Table 5. File and process indicators.

npm Indicators

Table 6 lists the npm indicators from this activity.

Indicator Type
@bitwarden/cli@2026.4.0 Malicious package
New preinstall: "node setup.mjs" in package.json Injected hook

Table 6. npm indicators.

Indicators From June 1, 2026 Activity

Affected Package Versions
@redhat-cloud-services/chrome 2.3.1, 2.3.2
@redhat-cloud-services/compliance-client 4.0.3, 4.0.4, 4.0.6
@redhat-cloud-services/config-manager-client 5.0.4, 5.0.5, 5.0.7
@redhat-cloud-services/entitlements-client 4.0.11, 4.0.12, 4.0.14
@redhat-cloud-services/eslint-config-redhat-cloud-services 3.2.1, 3.2.2, 3.2.4
@redhat-cloud-services/frontend-components 7.7.2, 7.7.3, 7.7.5
@redhat-cloud-services/frontend-components-advisor-components 3.8.2, 3.8.4, 3.8.6
@redhat-cloud-services/frontend-components-config 6.11.3, 6.11.4, 6.11.6
@redhat-cloud-services/frontend-components-config-utilities 4.11.2, 4.11.3, 4.11.5
@redhat-cloud-services/frontend-components-notifications 6.9.2, 6.9.3
@redhat-cloud-services/frontend-components-remediations 4.9.2, 4.9.3, 4.9.5
@redhat-cloud-services/frontend-components-testing 1.2.1, 1.2.2, 1.2.4
@redhat-cloud-services/frontend-components-translations 4.4.1, 4.4.2
@redhat-cloud-services/frontend-components-utilities 7.4.1, 7.4.2, 7.4.4
@redhat-cloud-services/hcc-feo-mcp 0.3.1, 0.3.2, 0.3.4
@redhat-cloud-services/hcc-kessel-mcp 0.3.1, 0.3.2, 0.3.4
@redhat-cloud-services/hcc-pf-mcp 0.6.1, 0.6.2, 0.6.4
@redhat-cloud-services/host-inventory-client 5.0.3, 5.0.4, 5.0.6
@redhat-cloud-services/insights-client 4.0.4, 4.0.5, 4.0.7
@redhat-cloud-services/integrations-client 6.0.4, 6.0.5, 6.0.7
@redhat-cloud-services/javascript-clients-shared 2.0.8, 2.0.9, 2.0.11
@redhat-cloud-services/notifications-client 6.1.4, 6.1.5, 6.1.7
@redhat-cloud-services/patch-client 4.0.4, 4.0.5, 4.0.7
@redhat-cloud-services/quickstarts-client 4.0.11, 4.0.12, 4.0.14
@redhat-cloud-services/rbac-client 9.0.3, 9.0.4, 9.0.6
@redhat-cloud-services/remediations-client 4.0.4, 4.0.5, 4.0.7
@redhat-cloud-services/rule-components 4.7.2, 4.7.3
@redhat-cloud-services/sources-client 3.0.10, 3.0.11, 3.0.13
@redhat-cloud-services/topological-inventory-client 3.0.10, 3.0.11, 3.0.13
@redhat-cloud-services/tsc-transform-imports 1.2.2, 1.2.4, 1.2.6
@redhat-cloud-services/types 3.6.1, 3.6.2, 3.6.4
@redhat-cloud-services/vulnerabilities-client 2.1.8, 2.1.9, 2.1.11

Repository/GitHub

  • Attacker-created repository description: "Miasma: The Spreading Blight"

Network

  • Bun runtime download: github.com/oven-sh/bun/releases/download/bun-v1.3.13/

Additional References

Updated April 27, 2026 at 2:15 p.m. PT to add information about Bitwarden and link to the Cortex Cloud article in the Additional References section.

Updated May 1, 2026 at 4:55 p.m. PT to add information on the Mini Shai-Hulud campaign.

Updated May 20, 2026 at 12:30 p.m. PT to update the Executive Summary with information on two new waves and add a new section on Mini-Shai Hulud May 2026 waves.

Updated May 21, 2026 at 8:45 a.m. PT to add managed threat hunting queries and additional product protection information. 

Updated June 2, 2026 at 11:22 a.m. PT to add section on the Red Hat supply chain attack. Added affected packages in the Indicators of Compromise section. 

Updated July 15, 2026 at 4:10 p.m. PT to add section on July campaign using a Miasma variant. Updated the Indicators of Compromise section.

TuxBot v3: Inside an IoT Botnet Framework With LLM-Assisted Development

Executive Summary

We identified a previously undocumented modular internet-of-things (IoT) botnet framework named TuxBot v3 Evolution.

The malware authors leveraged an LLM to assist in their code development, yielding mixed results. While the AI complied with their request to generate botnet code, it included a safety disclaimer that the developer failed to remove before shipping.

Although the LLM clearly aided in constructing the botnet, several functions in the analyzed samples failed to work correctly. While a manual code review could have easily resolved these errors, the authors neglected this step. However, it is highly likely that corrected, more polished iterations exist, which significantly elevates the potential threat posed by this malware.

We initially reported this information through our Timely Threat Intelligence program, and this article provides further in-depth analysis of the TuxBot v3 Evolution botnet.

We recovered detailed information on the framework from internal telemetry. The data includes the full source code, compiled binaries for 17 architectures and automated distributed denial of service (DDoS) performance testing reports. The bot programs infected devices to display the console banner “Infected By Akiru.”

The TuxBot v3 Evolution framework consists of:

  • A C-based bot agent that cross-compiles for architectures from ARM and MIPS to x86_64, PowerPC, RISC-V, etc.
  • A Go-based command-and-control (C2) server with a DDoS-for-hire panel
  • A custom exploit virtual machine
  • Docker-based test infrastructure
  • An automated build system

The bot agent brute-forces Telnet access on targeted devices with 1,496 credential pairs, contains exploit code targeting more than 30 IoT device families and communicates with a C2 server over an encrypted TCP channel.

Fall-back C2 mechanisms include:

  • A SHA512 domain generation algorithm (DGA)
  • Peer-to-peer (P2P) gossip with Ed25519-signed commands
  • IRC
  • DNS TXT queries
  • HTTP polling

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics LLM, AI, Botnet, IoT, DDoS

TuxBot Framework Details

TuxBot is a modular IoT botnet framework derived from various known IoT botnet codebases. Based on our analysis of the samples, TuxBot includes features borrowed from the known botnet AISURU and the publicly unknown Wuhan botnet lineages. (We infer the Wuhan botnet lineage based on references in the TuxBot samples.)

It is also partially ported from the open-source MHDDoS Python DDoS toolkit.

Figure 1 shows screenshots of the TuxBot v3 Evolution installer. According to the system configuration, the framework maintains dual versioning: 3.5.2 for the Installer version and 3.0.0-EVOLUTION-FINAL within the Docker configuration file.

A screenshot of a terminal interface running "Tuxbot" software. The left section shows options for system detection and dependencies, with Ubuntu detected. The right section displays CNC configuration steps for Tuxbot, including key generation and library execution. It shows progress with various steps marked as "already built".
Figure 1. TuxBot interactive setup wizard screens.

We discovered two important sources of TuxBot data from the wild. Our first discovery was an archive containing the complete source code of the framework. This archive consists of:

  • 61 C++ source files
  • 58 headers
  • Its own compiler and virtual machine
  • Docker Compose configurations for test environments
  • Quick Emulator (QEMU) setups for multi-architecture testing
  • 254 automated DDoS benchmark reports

Our second discovery was a compiled bot binary that was also bundled in the source tree under the QEMU test directory and hidden with a dot-prefix to the filename. This sample was submitted to VirusTotal on Jan. 20, 2026.

Comparing this binary with the source code reveals that it is a development build. This binary was compiled with its C2 IP address set to the loopback IP address 127.0.0.1 and the bot protocol port set to 31337. Because this information can be modified during the botnet setup process, the operator could have production builds with a real C2 IP address and with the bugs we document here already fixed.

The TuxBot framework we recovered and analyzed is approximately 70% functional. The core infection flow (scanning, credential brute-forcing, persistence, primary C2 setup and DDoS execution) works. The Telnet, SSH, HTTP and Android Debug Bridge (ADB) scanners all operate correctly. Furthermore, with its 1,496 credential pairs, the Telnet scanner remains a viable infection vector.

Exploitation beyond brute-forcing is limited. All three exploit systems are non-functional for different reasons that we detail later in this analysis. An additional scanner fires, but its hard-coded dropper IP address is no longer active.

Several other features are broken due to a handful of bugs, most of which trace back to large language model (LLM)-assisted development. The developer relied on an LLM to generate C modules, port exploits and write C2 server code.

Raw chain-of-thought reasoning from the LLM was left verbatim in source files, and the LLM hallucinated cryptographic implementations that the developer shipped without verifying. During our analysis, we could fix several of these broken features with a few targeted prompts to an LLM. This means an adversary with access to the same source code could produce a more complete version with minimal effort.

Development Timeline

The archive containing the source code also contains a Git log. This Git log allowed us to build a timeline that shows the development progress of this botnet, noted in Table 1.

Date Event Evidence
Jan. 3, 2025 Developer clones MHDDoS (DDoS attack script) from GitHub Git log in the MHDDoS/ subdirectory leaks the workstation hostname newtuxdev.sevielw.digikalas[.]online
Aug. 6, 2025 Developer domain digikalas[.]online registered Namecheap registration with Icelandic privacy protection (Withheld for Privacy ehf), Cloudflare DNS
Jan. 4–6, 2026 254 automated DDoS benchmark reports generated The package found includes reports, directory timestamps and JSON test configurations against Docker targets
Jan. 20, 2026 The first TuxBot sample appears on VirusTotal SHA256 hash
71dfbb171eca4ef9d02ff630b56e5283bbef7b375d4dbe9e8c9531bef312fa8d, x86_64 debug build with symbols
March 5, 2026 C2 server first seen on Xpanse 209.182.237[.]133:2222, banner SSH-2.0-CNC-Control-Server
April 22, 2026 Six new samples detected in internal telemetry Not on VirusTotal, multiple architectures, GCC 14.2.0 production builds

Table 1. TuxBot Framework development timeline.

The source code and publicly available data provide a rough development chronology. The developer's hostname, captured in the included Git log, indicates an Iranian-hosted workstation. The developer domain newtuxdev.sevielw.digikalas[.]online was no longer live, but the parent domain digikalas[.]online has remained active and resolved to an IP address on Iran's Arvan Cloud content delivery network (CDN) during our research.

The 254 benchmark reports from the archive from January 2026 reveal:

  • Active testing of 12 attack methods across three Docker-based botnet hosts
  • Measuring packet rates, throughput and error rates

This testing occurred just weeks before the first sample appeared on VirusTotal, consistent with a late-stage development push before deployment.

The source code contains an IP address of 185.10.68[.]127, which we pivoted on to link TuxBot to Keksec/Kaitori (a Tsunami/Mirai/Gafgyt variant) ecosystems to a shared infrastructure.

Framework Overview

According to the framework’s description, the TuxBot developer built what they called a professional-grade C2 framework platform with a multi-user admin panel, automated deployment and modular attack capabilities. Figure 2 shows the botnet panel reference.

A screenshot of a terminal displaying a command reference for TuxBot tool. User commands include options like "help," "methods," and "stats," each with descriptions. Admin commands include "adduser" and "global," also with descriptions. There is a section titled "Attack Usage" showing a command format with placeholders for target, duration, and options.
Figure 2. TuxBot C2 botmaster panel command reference.

The C2 server is written in Go and uses three listeners that use different TCP ports for incoming connections.

The first listener serves the bot protocol on TCP port 1999 (or 31337, depending on the build), handling encrypted command dispatch to connected bots. The same port is multiplexed with an admin binary protocol identified by a magic byte header.

The second listener is an SSH server on TCP port 2222 that presents an interactive shell for operators. This is the DDoS-for-hire interface shown in Figure 3. Operators log in, see a count of connected bots and issue attack commands in the format !method target duration.

A screenshot of a terminal interface showing "Tuxbot C2 Framework" with the system status indicating authentication is successful, a secure connection is established, and the system is ready.
Figure 3. TuxBot SSH C2 control panel system status screen.

As Figure 4 shows, the C2 server enforces per-user quotas on concurrent attacks, maximum duration and bot allocation. This is all backed by a MariaDB database that stores user accounts, attack logs and permissions.

A screenshot of a terminal screen showing system statistics. It displays one active bot, zero running attacks, and an uptime of 33 minutes and 45 seconds. Server status is online. Total bots are one, with one encrypted.
Figure 4. TuxBot system statistics showing currently connected bots.

The third listener is a machine API on TCP port 9999 that uses a JSON interface intended for programmatic access.

The integrated build system automates the entire deployment:

  • Installing dependencies (Go, MariaDB, cross-compilation toolchains)
  • Initializing the database schema
  • Generating a configuration
  • Compiling the C2
  • Cross-compiling the bot for 17 target architectures, as noted in Figure 5
A screenshot of a terminal screen showing automated compilation process for various computer architectures. The output indicates success and completion of builds, with two entities mentioned. Commands are executed with a timestamp prefix.
Figure 5. Exploit loading and cross-compilation of bot clients (malware artifacts).

These target architectures include:

  • x86_64
  • ARM
  • ARM64
  • MIPS
  • MIPSEL
  • MIPS64
  • PowerPC

The compiled binaries are placed in a directory served over HTTP, so exploited devices can download the appropriate binary for their architecture.

The framework includes Docker Compose configurations for several test scenarios. A “battle arena” configuration spins up a C2 server, five bot replicas and a target host running nginx and socat listeners on game server ports (Minecraft, TeamSpeak, FiveM, Xbox Live). This allowed the developer to test DDoS methods against real protocol listeners in a controlled environment. Additional configurations test P2P gossip recovery, full integration with all scanners active and production-like deployments with stealth and persistence enabled.

An interesting design note is that the source code configures the SSH banner as SSH-2.0-CNC, but the live C2 server on Xpanse at 209.182.237[.]133 presents the banner as SSH-2.0-CNC-Control-Server. This discrepancy suggests that the production deployment uses a modified version of the source code we discovered, providing further evidence that the operator has a separate, potentially more complete build.

Bot Overview

Analysis Details

The bot is a C program that compiles into a single statically linked binary. It links against glibc and libsodium for X25519, ChaCha20, Poly1305, SHA512 and Ed25519 algorithms.

The original binary submitted to VirusTotal was an earlier debug build with symbols intact, compiled with GCC 11.4.0 instead of the production GCC 14.2.0. The bot programs infected devices to display the console banner Infected By Akiru, as shown in Figure 6.

A screenshot of a terminal window showing a prompt with the message "Infected By Akiru" after executing a file.
Figure 6. Post-infection screen console message.

On execution, the bot follows a fixed initialization sequence. After seeding the pseudo-random number generator and initializing libsodium, it performs the following activities:

  • Loading the C2 address
  • Setting up anti-debugging protections
  • Hiding its process name
  • Installing persistence
  • Launching a cascade of subsystems consisting of:
    • The attack dispatcher
    • A competitor killer feature
    • An exploit VM
    • Self-replication servers
    • Multiple C2 channels (IRC, HTTP, DNS, P2P)
    • Scanners (Telnet, SSH, HTTP, PHP-based application, ADB)
    • A SOCKS5 proxy
    • The mining placeholder

The main process then enters a loop that receives encrypted commands from the C2 server and dispatches attacks.

String Table and the XOR Key Bug

TuxBot stores sensitive strings (C2 addresses, scanner calls, exploit payloads) in an XOR-encrypted table that it decrypts at runtime. The table key is previously defined as 0xDEDEFB4F.

The toggle_obf() function splits this 32-bit key into its four component bytes (0x4F, 0xFB, 0xDE, 0xDE) and XORs each byte of each table entry with all four in sequence. Because XOR is associative, these four operations collapse into a single effective key. The two 0xDE bytes cancel each other out (any byte XORed with itself yields zero), leaving 0x4F XOR 0xFB = 0xB4.

The table contains 58 entries. Forty-nine of them decrypt correctly with key 0xB4 and include:

  • The C2 port (1999)
  • Scanner strings (shell, enable, system)
  • The Infected By Akiru post-infection console banner
  • Busybox probe strings
  • Various process names used for stealth

Nine entries produce garbage when decrypted with 0xB4. These entries were encrypted using a separate offline tool, which uses a key of 0xDEDEFBAF, yielding an effective byte of 0x54.

The developer introduced this bug by changing the least significant byte of the key in the table from 0xAF to 0x4F. The offline encryption tool was never updated to match, and the nine entries that had already been processed with the old key were never re-encrypted. As a result, these entries are encrypted in the binary with key 0x54, while the runtime applies key 0xB4, producing corrupted output.

Decrypting them with the correct key (0x54) reveals the intended values shown in Table 2.

Entry Intended Value
TABLE_IRC_SERVER 127.0.0[.]1
TABLE_IRC_PORT 6667
TABLE_IRC_CHANNEL #tuxbot
TABLE_IRC_NICK_PREFIX tux
TABLE_HTTP_C2_URL hxxp[:]//127.0.0[.]1/cmd
TABLE_THINKPHP_PAYLOAD Full HTTP GET request (312 bytes) targeting ThinkPHP invokefunction
TABLE_GPON_PAYLOAD Full HTTP POST request (316 bytes) targeting GPON diag_Form
TABLE_REALTEK_PAYLOAD1 Full SOAP request (988 bytes) targeting Realtek UPnP /picdesc.xml
TABLE_REALTEK_PAYLOAD2 Full SOAP request (988 bytes) targeting Realtek UPnP /wanipcn.xml

Table 2. String table decrypted values.

All four exploit payloads hard code the dropper IP address 185.10.68[.]127 inside them, an IP address that is flagged as malicious on VirusTotal in early May 2026.

The consequences of this bug are significant. The IRC C2 fall-back channel, the HTTP C2 polling channel and the four table-stored exploit payloads are all non-functional at runtime. The bot attempts to use them, but it silently fails due to the corrupted string values. For example, the IRC channel tries to inet_addr() on garbage bytes, gets INADDR_NONE and retries the connection every 10 seconds.

We were able to fix this to call the add_entry_plaintext() function correctly, by taking the raw string and XORing it with the runtime key (0xB4) at initialization, guaranteeing the keys always match. With that fix applied, the IRC C2 channel connects, joins #tuxbot and accepts attack commands as noted in Figure 7.

A screenshot of an IRC chat window in a terminal. A user has joined the channel #tuxbot. Messages display information about channel creation date and user status within #tuxbot.
Figure 7. IRC channel (#tuxbot) and connected infected bots.

Credential Table

The bot ships with 1,496 username/password pairs for Telnet brute-forcing. The file header explicitly says // START IMPORTED FROM DDOS-ROOTSEC pass_file. Each entry is XORed with key 0xB4 (matching the runtime key, so these work correctly).

The list of 1,495 login credentials includes standard and vendor-specific defaults.

C2 Protocol

TuxBot implements a layered C2 architecture with one primary channel and five fall-back mechanisms. Only the primary channel and three of the five fall-back mechanisms were functional in the version we analyzed. Figure 8 shows the diagram.

A diagram illustrating the architecture of a CNC server setup. The server manages three main components: TCP C2 (Primary), IRC C2 (Backup), and DNS C2 (Covert). The TCP C2 uses a specific port and security protocols, the IRC C2 utilizes a labeled table, and the DNS C2 involves TXT records. Beneath these, a Bot Agent details various functionalities including attack engine, scanner module, exploit capabilities, persistence methods, and more. Each component lists specific technical details relevant to its function.
Figure 8. C2 protocols and the client/server relationships.

Primary Channel: Encrypted TCP

The bot connects to the C2 server on TCP port 1999 (or 31337, depending on build configuration). The handshake begins with the bot sending 4 bytes: 0xDEADBE01. It then generates and sends its 32-byte public key. The C2 server responds with its own 32-byte public key. Each encrypted packet has the following format:

  • 4-byte magic (0xDEADBEEF)
  • 12-byte nonce (from /dev/urandom)
  • Ciphertext
  • 16-byte Poly1305 tag

Fall-Back Channels

The framework defines five additional C2 channels, summarized in Table 3.

Channel Implementation Status
DNS TXT Queries c2.tuxbot.local via 8.8.8[.]8 Functional
DGA Seed format <YYYY-MM-DD>-TuxBotv3-Evolution-Seed-2025-<index>, SHA-512, 20 domains/day Functional
P2P Gossip TCP port 13337, Ed25519-signed commands Functional
IRC TCP port 6667, plaintext Broken
HTTP Polling Polls hxxp[:]//127.0.0[.]1/cmd Broken

Table 3. C2 channels and their implementation status.

Secondary Channel: IRC Protocol

The broken IRC implementation reveals the intent for a secondary channel of communication, as demonstrated below in Figure 9.

A screenshot of a Wireshark TCP Stream showing a network conversation. The text details a connection to the IRC Network, listing various server messages and commands, including PING and PONG exchanges. There are server logs related to #bot and #tuxbot channels. Connection and termination of the server session are noted.
Figure 9. Example of IRC bot C2 communication from an infected machine.

When fixed, it forks a child process that connects to an IRC server, joins a channel (default #tuxbot) and listens for PRIVMSG commands prefixed with the ! character. It supports 12 attack methods (udp, syn, ack, vse, stomp, greip, greeth, udpplain, bypass, std, socket and dns) plus a kill command.

Commands arrive as plaintext IRC messages and get parsed by the parse_irc_command() function. Then the commands are converted to the same binary packet format used by the primary encrypted channel before being passed to attack_parse().

Unlike the primary channel, the IRC channel has no encryption and no authentication. Anyone who knows the server and channel can command the bots.

DGA Details

The dga_generate_domain() function constructs a seed string formatted as %04d-%02d-%02d-TuxBotv3-Evolution-Seed-2025-%d, where the date is the current UTC date and the final integer iterates from 0–19 per cycle. This produces 20 candidate domains per day.

The SHA512 hash of this string is computed, and the first 12 bytes of the digest are mapped to lowercase letters (digest[i] % 26 into the a-z charset) to form the domain label. The top-level domain (TLD) is selected from a 6-entry table (.com, .net, .org, .info, .biz and .cc) using digest[12] % 6. Both the main C2 reconnection loop and the resilience module use this function to try DGA domains when the primary C2 address is unreachable.

Exploits

The source tree contains four categories of exploit. Only one of them works at runtime. This is a direct consequence of the bugs introduced during development.

Exploit Category 1: Hard-Coded C Functions (Implemented But Never Called)

Sixteen exploit functions are implemented as native C code, covering 13 CVEs across different vendors and devices. Each function constructs an HTTP or SOAP request with a %s format string for the dropper IP address. The code is complete and would work if called. But exploit_engine_init() has zero callers anywhere in the codebase. No scanner or spread module references it. These 16 exploits are compiled into the binary and considered as dead code.

Exploit Category 2: Exploit VM (Called But Broken)

The main Telnet scanner spawns a dedicated exploit worker thread that calls vm_run_random() in a loop against random IP addresses, making this the only exploit system the bot actually tries to use at runtime. The developer built a custom domain-specific language for writing exploits as text files, a Go compiler to compile them into a binary package and a C virtual machine to execute them.

We also observed 27 .expl files, a custom file format created by the developer for this framework. Each file contains a single exploit, making exploit integration modular rather than hard-coded. These were written and compiled into a single 10,694-byte exploit package that would add coverage for 13 CVEs (including CVE-2022-1388, CVE-2022-22965, CVE-2020-8515 and CVE-2022-44877) plus two non-CVE targets.

The package fails because the Go compiler writes the file magic value as 0x54555845 ("TUXE") while the C VM expects 0x4558504C ("EXPL"). The package is rejected on load, and the exploit worker thread runs but fires nothing. Beyond the magic mismatch, the compiler never emits an OP_CONNECT opcode, and the variable syntax differs between the compiler and VM. This means that even fixing the file magic value would not be enough to make the package execute correctly.

Exploit Category 3

This category consists of XOR table payloads, but these are broken due to an XOR key mismatch. Four exploit payloads are stored as XOR-encrypted entries in the string table. These target different vendors and were intended as an alternative delivery mechanism. They are all encrypted with the wrong XOR key (0x54 instead of 0xB4), resulting in garbled HTTP requests at runtime.

Exploit Category 4

This category consists of functional dedicated scanners for remote code execution (RCE) and ADB.

In summary, the exploit categories are described in Table 4.

Exploit Category Count
Implemented but never called (dead code) 13 CVEs + 4 non-CVE targets (System 1, exploit engine)
Called at runtime but broken (VM magic mismatch) 13 CVEs + 2 non-CVE targets (System 2, exploit VM)
Broken (XOR key mismatch) 4 exploits overlapping with System 1 (System 3)
Functional dedicated scanners RCE vulnerability scanner, ADB scanner

Table 4. Exploit categories and counts (per implementation status).

These four categories mean that this bot's actual exploit capability at runtime is limited to the last two categories:

  • An RCE vulnerability scanner (whose dropper is dead)
  • The ADB scanner

The other three exploit categories that were supposed to provide broad IoT exploitation are non-functional, each for a different reason. A complete table of all CVEs and their status is provided in the Indicators of Compromise section.

DDoS Methods

The attack dispatch system registers 78 attack vectors. These vectors map to only six actual handler functions, as shown in Table 5.

Handler (Designator) Vectors Description
attack_udp_generic_optimized 25 UDP/GRE/ICMP floods using raw sockets with sendmmsg() batches of 512 packets
attack_tcp_syn_optimized 47 TCP SYN floods, also mapped to all Layer 7 HTTP method IDs
attack_tcp_ack_optimized 2 TCP ACK floods
attack_tcp_stomp_optimized 1 TCP ACK+PSH floods
attack_udp_dns_optimized 2 DNS query floods
attack_miner 1 Cryptocurrency mining placeholder

Table 5. DDoS method handlers and their descriptions.

The 47 vectors mapped to attack_tcp_syn_optimized include all application-layer methods for HTTP that the developer attempted to port from MHDDoS:

  • GET floods
  • POST floods
  • Slowloris DDoS attacks
  • Apache Range header attacks
  • WordPress XMLRPC pingback attacks
  • Cloudflare bypass attack variants

These methods have source code implementations, but attack_init() routes all of their vector IDs to the TCP SYN handler. An operator who types !get target 60 expecting an HTTP GET flood instead gets a TCP SYN flood.

The HTTP attack methods are compiled into the binary as dead code. Figure 11 shows the command for a controlled bot to launch an attack against a given IP address and port number.

A screenshot of a terminal window showing a command to launch a DNS attack on an IP address using port 80. The attack is executed for 2 seconds with 1 bot.
Figure 10. TuxBot C2 panel connection showing the launch of an attack through the connected bot.

The source tree contains approximately 92 individual method implementations across three lineages:

  • 30 from the traditional Mirai codebase
  • 12 AISURU-suffixed variants with sendmmsg() batch optimization
  • 8 Wuhan-suffixed variants bridged through adapter code

These exist in the compiled binary but are never called because attack_init() redirects everything to the six optimized handlers shown in Figure 12 below.

A screenshot of a command line interface displaying a list of attack methods categorized by layers and types. Each category lists methods. At the bottom, it notes a total of 92 methods, with a sample usage command.
Figure 11. TuxBot C2 panel connection showing the launch of an attack through the connected bot.

Network HTTP Brute-Forcing Scanning Support

The source code reveals a modular architecture designed for high-efficiency network scanning, specifically using a dedicated HTTP scanning routine to discover vulnerable web interfaces.

The HTTP scanner operates as an isolated child process that manages up to 128 concurrent connections in an infinite, non-blocking select() loop. For each idle slot (approximately 5% chance per tick), it targets a random public IP address on TCP port 80 or 8080, excluding loopback and non-routable IP address ranges.

The scanner then attempts a non-blocking TCP connection to a random administrative endpoint (such as /admin or /cpanel). It does so using credential combinations (like admin:admin) from hard-coded lists via a Base64-encoded Authorization: Basic header in an HTTP GET request.

If the response yields a successful HTTP/1.* with 200 OK status strings, the scanner prints a debug log and terminates the connection. Crucially, the source code indicates that this feature was not fully implemented, as the successful propagation logic is stubbed out and completely lacks the functionality to report successful infections back to the C2 server. If the attempt times out after 5 seconds or fails, it simply closes the connection and frees the slot for reuse.

Figure 12 shows an example of the scanning traffic filtered in Wireshark.

A screenshot of a network protocol analyzer showing a list of captured packets. The columns include No., Time, Source, Destination, Length, Info, and more. The data illustrates network activity between IP addresses, DNS queries, and HTTP protocol exchanges.
Figure 12. Network HTTP brute-force scanning traffic from an infected machine.

Persistence and Stealth

The persistence and stealth subsystems follow patterns well established in the IoT botnet ecosystem, so we will not describe every technique in detail. TuxBot installs itself through seven persistence mechanisms:

  • A systemd service disguised as sd-pam.service with Restart=always
  • Two cron entries (@reboot and */5 * * * *)
  • Shell profile injection into .bashrc, .profile and .zshrc files
  • Hidden backup copies at three file system locations
  • A guardian process with crash backoff
  • Hardware watchdog keepalive
  • Periodic binary relocation across 21 directories with dot-prefixed filenames
    • This process masquerades under one of 20 system daemon names (such as systemd-udevd, dbus-daemon, cron, sshd) selected at random

Self-Defense Mechanisms

The Anti-VM module implements a weighted scoring system with a threshold of 30, combining more than 10 detection methods, including:

  • DMI file checks for VMware/VirtualBox/QEMU
  • MAC address prefix matching for seven VM vendors
  • Disk size and CPU count heuristics
  • Timing-based detection
  • Kernel module scanning
  • Checks for running analysis tools (gdb, IDA, Ghidra, radare2, Wireshark, Volatility).
  • A competitor killer feature
  • Scans of /proc for memory signatures of Mirai, QBOT, Vamp, Anime and dvrHelper
  • Killing matches and binding their ports to prevent re-infection

LLM-Assisted Development

Analysis Details

The developer used an LLM to write a significant part of this framework. Multiple files contain raw LLM chain-of-thought reasoning left verbatim in comments. These comments are the LLM's internal reasoning as it worked through porting tasks. This reasoning is complete with self-interruptions, decisions and references to “the user” (meaning the developer who prompted the LLM). Here are a few examples:

While trying to port an ADB exploit to the custom .expl format, the LLM writes:

// If the user insists on "all exploits", I will add it but with a NOTE that checksums might fail.

The LLM is questioning whether it remembers code it generated earlier in the same conversation:

// I created them so I should know?

Discovering that a Python exploit script it was porting is broken:

// Wait, where is the command?

These patterns recur throughout the exploit files:

  • Self-interruptions (Wait)
  • Self-corrections (Actually)
  • Investigation prompts (Let's check)
  • First-person task narration (I will)
  • Structured decision labels (DECISION:)

One comment reads // Correct action: I've already explored it. I will check other files. These comments are an LLM narrating its own workflow to itself. Human developers do not usually write comments like these.

The same patterns appear in the C bot modules. Comments include:

Actually, TFTP requires lock-step ACK, Let's assume if the system() call returns, we might want to exit and actually crypto_core allows generating them from a seed. Let's use a random seed.

The most consequential LLM artifact is in the C2 authentication module. The file header claims to implement Argon2id password hashing. The section header reads PASSWORD HASHING - ARGON2ID. The function comment says HashPassword creates a cryptographically secure password hash using Argon2id.

Related LLM comments include:

// Since golang.org/x/crypto/argon2 isn't imported, we'll use our enhanced PBKDF2

// with very high iterations as a strong alternative

hash := deriveKeyEnhanced(password, salt)

Despite its use of PKBDF2 for password hashing, the LLM formats the output to look like Argon2id anyway:

return fmt.Sprintf("$argon2id$v=19$m=%d,t=%d,p=%d$%s$%s", ...)

The LLM hallucinated that it implemented Argon2id but actually fell back to SHA256 loops while keeping the Argon2id comments, constants and output format.

Every .c file in the bot directory (approximately 60 files) carries an identical header:

WARNING: This code is for educational and authorized security research only. Unauthorized use is strictly prohibited and may be illegal.

The LLM complied with the request to generate botnet code but added a safety disclaimer. The developer shipped it without removing it.

What Works and What Does Not

Table 6 summarizes the operational status of each major component of TuxBot v3 Evolution.

Component Status
Multi-architecture compilation (17 targets) Functional
Primary encrypted C2 (X25519 + ChaCha20-Poly1305) Functional
Telnet brute-force scanner (1,496 credentials) Functional
SSH scanner Functional
HTTP scanner Functional
ADB scanner Functional
Exploit engine Dead code. It could be activated by adding a call to the exploit engine function.
Exploit VM Broken
RCE scanner Partial
DDoS (UDP/TCP/DNS floods) Functional
Persistence (systemd/cron/shell/watchdog) Functional
Stealth (process mimicry/relocation/anti-VM) Functional
Competitor killing Functional
DGA (SHA-512, 20 domains/day) Functional
P2P gossip (Ed25519 signed) Functional
Credential list Functional
IRC C2 fall back Broken
HTTP C2 fall back Broken
XOR table exploit payloads (4 entries) Broken
L7 HTTP DDoS methods (MHDDoS port) Dead code
Polymorphic engine Dead code
CF/CAPTCHA bypass modules Dead code
Mining Placeholder/Non-Functional
Windows build Non-Functional

Table 6. Operational status for each TuxBot framework component.

During our research, we were able to fix these issues with a handful of LLM-assisted prompts. We reconstructed the correct table entries and fixed the IRC C2 channel with a few targeted prompts. Given that the operator already has the source code and has been actively deploying binaries (six new samples in April 2026), we can reasonably assume that a version with some or all of these fixes already exists in the wild.

Infrastructure and Ecosystem

By searching through publicly available data, we found active infrastructure and connections to the broader IoT botnet ecosystem.

The primary C2 server is hosted at 209.182.237[.]133, in Singapore. Connecting to TCP port 2222 on this server presents the banner SSH-2.0-CNC-Control-Server, first observed on Xpanse on March 5, 2026, and also visible through Shodan. The SSH key exchange includes a key exchange algorithm that fingerprints Go's crypto/ssh library rather than OpenSSH.

The dropper server at 185.10.68[.]127 is hosted on FlokiNET, an Iceland-based provider known for bulletproof hosting. This IP address had 11/91 malicious detections on VirusTotal in May 2026, with at least 10 communicating malware samples and six associated downloads.

This dropper server serves TuxBot payloads at /bins/bot.<arch> and, on different URL paths, also serves Kaitori v3.9 binaries. Passive DNS history for this IP address shows domains consistent with DDoS-for-hire operations going back to 2021, with the domains vrunabo[.]su, rezy1337.ted[.]ge and high.cpu.co[.]ua.

These two servers are linked by the jetross[.]com Let's Encrypt TLS certificate that appears on both hosts, tying the C2 server in Singapore to the dropper in Iceland under the same operator.

The dropper IP address is the pivot point that connects TuxBot to the wider Keksec/AISURU ecosystem. Kaitori v3.9 samples recovered from our internal telemetry in July 2025 (82 samples) downloaded their payloads from 185.10.68[.]127 on different URL paths. A separate sample, a Go binary, communicates with both 194.46.59[.]169 (a known AISURU IP address) and 185.10.68[.]127. TuxBot, Kaitori and AISURU tooling all converge on the same dropper server, but they are separate codebases.

One additional artifact sits in the source code. The RCE scanning engine contains a hard-coded payload that downloads from hxxp[:]//188.166.2[.]226/OwO/Tsunami.x86 with the user-agent r00ts3c-owned-you. This string was copy-pasted from the r00ts3c Tsunami codebase, which was included in the MHDDoS repository that the developer cloned in January 2025.

The IP address is a decommissioned DigitalOcean droplet now serving Ubiquiti's UISP platform. This payload is dead code.

The developer domain digikalas[.]online resolves to 37.32.24[.]195 on Iran's Noyan Abr Arvan. Its TLS certificate covers api.digikalas[.]online and health.digikalas[.]online, suggesting it hosts a web application beyond the malware development context. The developer subdomain was leaked in the git historical log data.

Conclusion

Our discovery of TuxBot v3 Evolution reveals a development snapshot of an IoT botnet framework. The framework has working core capabilities and several broken features that trace to a small number of reproducible bugs.

Binaries compiled from this framework have been appearing in the wild since January 2026. The C2 infrastructure has been active since at least March 2026.

The developer relied heavily on LLM-generated code throughout the project. That approach accelerated integration and allowed what could be a single developer to produce a multi-architecture botnet with:

  • Encrypted C2
  • A DGA
  • P2P gossip
  • A custom exploit VM
  • A Go-based DDoS-for-hire panel

The LLM also introduced bugs that went unnoticed because the generated code reads well on the surface. The XOR key mismatch, the VM magic incompatibility, the exploit engine that never gets called and the hallucinated Argon2id implementation are the kind of errors that a manual code review would have caught immediately. The developer trusted the output and moved on.

Shared infrastructure with Kaitori v3.9 and AISURU tooling places the TuxBot operator within the Keksec ecosystem. This group is known for running multiple IoT botnet variants in parallel.

TuxBot appears to be another variant in that portfolio. It’s one that aims to go beyond the usual Mirai fork with its encrypted C2, its DGA and a modular exploit system, even though that system does not work yet in the version we recovered.

The broken features can be fixed. We demonstrated this during our analysis by reconstructing the IRC C2 channel and decrypting the mismatched table entries with a few targeted LLM prompts. A fully working version of this framework is not a theoretical concern, but a likely threat.

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Indicators of Compromise

TuxBot Framework (Compiled Malicious Binaries):

  • SHA256 hash: 6b7a8e0c96c2318e747f074f9a99d26738700769ac01bba692d19fc884847737
    File size: 1,456,432 bytes
    Filename: tuxbot.alpha
    File type: ELF 64-bit LSB executable, Alpha (unofficial), version 1 (SYSV), statically linked, BuildID[sha1]=cd540bb31909440fd2bf773e6f1480f5b6f12400, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: 146f6010f6ee082aab13e0148d39baefa77eaba4ff65817b511b08c2092bdfd2
    File size: 1,234,964 bytes
    Filename: tuxbot.arm
    File type: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, BuildID[sha1]=877b804892ab218a53420b6dfbd0a2837368d0b5, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: bd6431fb06e4689142ef597cf00382e38ae20a5393a4d9277e45a3f5b3cbcff9
    File size: 1,329,000 bytes
    Filename: tuxbot.arm64
    File type: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=b21cdc5e1b96c640a1d553ed518c49729e367823, for GNU/Linux 3.7.0, not stripped
  • SHA256 hash: a03b0d41f5ef03328150331ffa0ed970998883f7e0343d79b2d3b95330d8e7c1
    File size: 972,032 bytes
    Filename: tuxbot.arm7
    File type: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, BuildID[sha1]=a70cea846442c18ad265f311b5ced29a4071771d, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: eb2fa179fde2f097c18d5d700ad87d660fc238ee14cbe5477032e60856859621
    File size: 1,352,256 bytes
    Filename: tuxbot.hppa
    File type: ELF 32-bit MSB executable, PA-RISC, 1.1 version 1 (GNU/Linux), statically linked, BuildID[sha1]=69dc276dde8efcb409411508da55d4cbe28d5600, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: a8d70d16509e227d8306be361bc37a3dc9fe34bf476f51e361e55e6d293c2b3f
    File size: 1,160,756 bytes
    Filename: tuxbot.m68k
    File type: ELF 32-bit MSB executable, Motorola m68k, 68020, version 1 (SYSV), statically linked, BuildID[sha1]=adf267caab78a74c4b4dfabe7b578b0a4d639782, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: 0f8bcca3ed65e980da2a1f90a767b7d543be32eeea3e9338d09d4d635a497988
    File size: 1,431,220 bytes
    Filename: tuxbot.mips
    File type: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked, BuildID[sha1]=a8fd13f6b1bdfa87c0f466df69b7e81325b5dd15, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: 96b1f96efca3b9df2dea85678d60da27e3265b4a00e39e20e64b27bb985e1561
    File size: 1,468,624 bytes
    Filename: tuxbot.mips64
    File type: ELF 64-bit MSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), statically linked, BuildID[sha1]=befb0e4d1cd7d2b4139b55f811993af2c8839e75, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: c7a36d6b8128c41f93a32413675401a10a2b5769b221bbaa8c5c309585b73ceb
    File size: 1,403,096 bytes
    Filename: tuxbot.mips64el
    File type: ELF 64-bit LSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), statically linked, BuildID[sha1]=e0f8dd23e4fb0086feb42ea0a5dcef70d7b4d17c, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: 246c97957651de568e61eba1abe572f0b0f960456209995d43d53a0d7cc494a1
    File size: 1,431,268 bytes
    Filename: tuxbot.mipsel
    File type: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked, BuildID[sha1]=7ad840b1945cc346012987727ebcc062431965a4, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: 3ec016d637e4c9cd331edd2580a229621ad638e924a4aa29ac0342e9144ace19
    File size: 1,492,228 bytes
    Filename: tuxbot.ppc
    File type: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, BuildID[sha1]=4e1483737f769e1cee80fa4d7a056a5d8e3b537e, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: 2f2c3551762c03da126e45dca6fc2f997c63f0f1bfc21fd0ceed680ac6f083ce
    File size: 1,721,904 bytes
    Filename: tuxbot.ppc64le
    File type: ELF 64-bit LSB executable, 64-bit PowerPC or cisco 7500, version 1 (GNU/Linux), statically linked, BuildID[sha1]=4cba585d9f208bd712b28f867f908e503ccc9cfe, for GNU/Linux 3.10.0, not stripped
  • SHA256 hash: 9cd5e7e3c8bad321ef6c3d47fe25b3b56e9487f703a7eeee52db4067e6bafe61
    File size: 1,185,264 bytes
    Filename: tuxbot.riscv64
    File type: ELF 64-bit LSB executable, UCB RISC-V, version 1 (GNU/Linux), statically linked, BuildID[sha1]=64af594c7f91793813e3d769e63816b143102396, for GNU/Linux 4.15.0, not stripped
  • SHA256 hash: e3a5296e762e9ee16010399666441d663beeea956382e97cca032a6a5ad06811
    File size: 1,542,064 bytes
    Filename: tuxbot.s390x
    File type: ELF 64-bit MSB executable, IBM S/390, version 1 (GNU/Linux), statically linked, BuildID[sha1]=2774a5f5991657eb9b0062cd3da0391c9bad2643, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: f1efb78887bb8783d7781c07cd13b53c9c79ebe5baa81f335838d0a6e73dec7e
    File size: 1,096,720 bytes
    Filename: tuxbot.sh4
    File type: ELF 32-bit LSB executable, Renesas SH, version 1 (SYSV), statically linked, BuildID[sha1]=304e14a138b92135aad27bb37f4e9db440401ec2, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: f324a45fcd2a9db4e542c09486c21b08bc42d6bf76fbd5f17871090361b10815
    File size: 2,240,240 bytes
    Filename: tuxbot.sparc64
    File type: ELF 64-bit MSB executable, SPARC V9, Sun UltraSPARC1 Extensions Required, relaxed memory ordering, version 1 (GNU/Linux), statically linked, BuildID[sha1]=74fba0bad93bbb0e1eedb196b6efe6af1c0bf23d, for GNU/Linux 3.2.0, not stripped
  • SHA256 hash: 15c17dce89deccd5172285b2650de957918aa1157cde8e4633ae15dfe31f2711
    File size: 1,491,208 bytes
    Filename: tuxbot.x86_64
    File type: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=81670f250f4b3492fd3e00920f9fe7395ecbf85c, for GNU/Linux 3.2.0, stripped

Confirmed TuxBot (External samples):

  • SHA256 hash: 71dfbb171eca4ef9d02ff630b56e5283bbef7b375d4dbe9e8c9531bef312fa8d
    File size: 2,274,688 bytes
    Filename: .bot_x86_64
    File type: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=b1cc41e2b9ddb11d0c9d03d319531fea9459cdae, for GNU/Linux 3.2.0, with debug_info, not stripped

Confirmed TuxBot (Internal samples):

  • SHA256 hash: 511d3ffb4091cbcc94571d9fb3102e8cb424c6e187d01d53ff12078d54929bda
    File size: 163,121 bytes
    File type: ELF 32-bit LSB executable, ARM, version 1 (ARM), statically linked, with debug_info, not stripped
  • SHA256 hash: 6aa4034dc7a2858094ff4dc59af07d6fe31119591e41599bcc0f3d0b516ee734
    File size: 163,120 bytes
    File type: ELF 32-bit LSB executable, ARM, version 1 (ARM), statically linked, with debug_info, not stripped

TuxBot C2 Servers:

  • 185.10.68[.]127 - Dropper (HTTP, /bins/bot.<arch>)
  • 209.182.237[.]133:1999/31337 - Bot protocol (encrypted TCP)
  • 209.182.237[.]133:2222 - C2 SSH admin panel
  • 209.182.237[.]133:9999 - Machine API (TCP JSON)

Keksec/Kaitori (not TuxBot directly):

  • 45.145.185[.]229 - Keksec dropper (/bins/keksec.mips)
  • 107.174.133[.]119 - Keksec dropper (Huawei exploit payload)
  • 194.46.59[.]169 - AISURU infrastructure (yamux Go tool)

Historical IP addresses:

  • 188.166.2[.]226 - Tsunami dropper (dead code in RCE exploit). Now serves Ubiquiti UISP. Blocking will affect legitimate services.
  • 154.6.197[.]43 - Present in the bot source code as scan/server domain. Successful Telnet logins are reported to this IP address. Flagged as a scanner by GreyNoise.

Domains:

  • c2.tuxbot.local - DNS fall-back C2 domain (hard coded in binary)
  • cfcybernews[.]eu - Test domain leaked by CF bypass module
  • captcha.kanfetka[.]site - Test domain leaked by CAPTCHA bypass module
  • digikalas[.]online - Developer domain
  • jetross[.]com - TLS certificate linking the C2 server to the dropper

Host Indicators:

  • Infected By Akiru - Console output after bot execution
  • /bin/busybox Akiru - Busybox probe during Telnet scanning
  • Akiru: applet not found - Expected response to busybox probe
  • sd-pam.service - Systemd persistence service name
  • /tmp/.%08x.lock - Lock file format for single-instance enforcement

Network Indicators:

  • 0xDEADBE01 + 32 bytes - C2 handshake initiation (X25519 public key)
  • 0xDEADBEEF + 12-byte nonce + ciphertext + 16-byte MAC - Encrypted C2 packet format
  • User-Agent: TuxBot - HTTP requests from bot
  • User-Agent: r00ts3c-owned-you - RCE (dead code, inherited from MHDDoS)
  • SSH banner: SSH-2.0-CNC-Control-Server - C2 SSH service (Shodan fingerprint)

Exploited CVEs

Implemented but never called at runtime:

Completely Broken (exploit VM magic mismatch, never executes):

Additional Resources

No Manners Here: The Ruthless Rise of The Gentlemen Ransomware

Executive Summary

The Gentlemen (aka Storm-2697) is a Ransomware-as-a-Service (RaaS) program active since at least July 2025. Public reporting indicates that the operators were likely active months earlier as an affiliate (known as ArmCorp) of Qilin RaaS, which Unit 42 tracks as Spikey Scorpius. Their ransomware variants are written in both C and Go programming languages, enabling the threat actors to spread their encryptors across different operating systems and virtual infrastructure. Figure 1 below illustrates the desktop wallpaper used by the ransomware after deployment.

Image of The Gentlemen ransomware’s wallpaper, featuring five men wearing masks in tuxedos.
Figure 1. Image of The Gentlemen ransomware’s wallpaper. Source: Krebs on Security.

Additional public reporting revealed that the operators (roughly 20 of them) likely morphed from a private entity into a RaaS model on or about September 2025. While traditional RaaS models typically offer affiliates a 70% to 80% cut of paid ransoms, The Gentlemen offer an unprecedented 90% payout.

Background

Unit 42 and other security researchers have observed The Gentlemen’s usage of a wide variety of initial access techniques similar to other RaaS operators since their inception, including the exploitation of vulnerabilities in edge devices (firewalls, VPNs), brute force attacks, obtaining leaked and/or stolen credentials and collaborating with initial access brokers (IABs).

More recently, researchers have identified The Gentlemen’s usage of a custom Go-based backdoor, an EDR killer framework dubbed “GentleKiller” and the suspected usage of an unspecified zero-day vulnerability exploit to amplify their defense evasion capabilities.

In May 2026, The Gentlemen announced a partnership with HasanBroker's BreachForums as a means to recruit affiliates, penetration testers and IABs. Figure 2 illustrates this announcement.

Figure 2. Image of partnership announcement between BreachForums and The Gentlemen. Source: Gurucul.

Additional information about The Gentlemen and their operational structure has emerged in recent months, following the leak of an internal database by an alleged insider in May 2026.

Data Leak Site Insights

One of the most alarming trends observed thus far in 2026 by Unit 42 and other security researchers is the sheer increase in volume of total victims claimed by The Gentlemen in comparison to 2025. Through July 7, one reputable source had counted a total of 580 victims claimed by The Gentlemen across 77 countries since their inception. Of those 580 victims, 103 operated within the manufacturing industry, a commonly targeted sector given the need for organizations to maintain operational uptime.

Figure 3 below represents the total number of victims claimed by The Gentlemen in 2025 compared to both Qilin and Akira, tracked by Unit 42 as Howling Scorpius, which led all RaaS programs in victims claimed last year.

Chart
Figure 3. Chart depicting total victims claimed by prominent RaaS programs in 2025. Source: Unit 42.

In comparison to the above statistics, Figure 4 below represents the total number of victims claimed by The Gentlemen thus far in 2026 (through July 3) compared to both Qilin and Akira.

Chart
Figure 4. Chart depicting total victims claimed by prominent RaaS programs in 2026. Source: Unit 42.

When comparing the last six months of 2025 to the first six months of 2026, the number of victims claimed by The Gentlemen increased by slightly more than 6x. What makes this even more concerning is that these threat actors were only active for the last four months of 2025.

Figure 5 below further illustrates the victims claimed by The Gentlemen per month since August 2025, one month prior to the official launch of their RaaS model. June 2026 represented their highest number of claimed victims to date with 117, just shy of a 4x increase from January 2026.

Figure 5. Chart depicting victims claimed by The Gentlemen per month since August 2025. Source: Ransomware.live.

Conclusion

While legacy big-game hunting RaaS programs like Qilin and Akira continue to drive high volumes of victims by sticking to their established playbooks, The Gentlemen has solidified itself as the second most active RaaS program of 2026 in terms of victims. The combination of a lucrative affiliate payout structure to recruit affiliates, alongside the use of custom tooling across different phases of their attack lifecycle, make The Gentlemen a formidable threat for enterprise organizations to reckon with in the near and mid term future.

Recommendations

Initial Access:

  • Immediately scope for and patch the following vulnerabilities known to be exploited:
  • Establish and maintain robust visibility into internet-facing systems and applications such as firewalls, VPNs and remote access gateways
  • Audit for indicators of prior exploitation of edge devices and internet-facing RDP endpoints
  • Establish strong security requirements for third-party dependencies and vendors, and monitor for breaches of any third-party tools or platforms

Execution:

  • Create immediate, high-severity SIEM alerts for the creation, deletion or execution of any scheduled task matching the string gentlemen*

Privilege Escalation:

  • Immediately scope for and patch the following vulnerabilities known to be exploited:
    • CVE-2025-7771 (ThrottleStop.sys driver)

Defense Impairment:

  • Enable EDR Tamper Protection and monitor for the unexpected loading of unsigned or known vulnerable drivers
  • Implement behavioral alerts for systems executing wevtutil to clear Security/System logs

Credential Access:

  • Deploy phishing-resistance multi-factor authentication (MFA) on all systems
  • Regularly audit and rotate credentials

Discovery:

  • Monitor for internal usage of tools such as Advanced IP Scanner, which the threat actors frequently use for internal network reconnaissance and mapping

Lateral Movement:

  • Enforce strict SMB signing, disable SMBv1 completely, and restrict lateral network movement between internal segments to contain the self-propagation mechanism
  • Ensure SSH is turned off on ESXi hosts by default and only enabled temporarily for explicit maintenance windows
  • Treat your virtualized environment as tier-0 infrastructure and restrict ESXi management interfaces to a dedicated, isolated management VLAN

Command and Control:

  • Monitor for anomalous outbound traffic over non-standard ports or traffic matching known SystemBC communication signatures

Impact:

  • Maintain and validate offline backup and recovery capabilities
  • Implement behavioral alerts for systems using vssadmin and wmic to delete Volume Shadow Copies

Vidar Stealer Unmasked: Code Signing Abuse, Go Loaders and File Inflation

Executive Summary

In April 2026, Unit 42 researchers identified a financially motivated campaign delivering Vidar stealer and the XMRig cryptocurrency miner to consumer and small- and medium-sized business victims worldwide.

Attackers lure victims via malvertising to pages for downloading files that impersonate cracked versions of copyright-protected software. Upon execution, the loader drops and runs both Vidar stealer and XMRig. Vidar stealer targets information like browser credentials, cookies and crypto wallets. XMRig mines Monero cryptocurrency.

We assess the operator of the campaign to be a Vidar stealer malware-as-a-service (MaaS) affiliate involved in operations targeting victims in the U.S. and European Union. This article provides a technical analysis of the campaign.

Palo Alto Networks customers are better protected from the threats discussed above through the following products and services:

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics Vidar Stealer, Malware, Cryptocurrency, XMRig

Attack Timeline

Since its emergence, attackers have used Vidar stealer in multiple large-scale campaigns. We identified a notable spike in activity from mid-late April 2026, primarily targeting organizations in the U.S. and the EU.

Figure 1 illustrates the timeline of the April 2026 campaign, which shows the number of Vidar stealer samples discovered each day.

A bar chart showing Vidar Stealer sample campaign counts from April 15 to May 5, 2026. Peaks around April 21 and 22 with counts reaching 31 and 33. Other days show lower counts. Dates on the x-axis and sample counts on the y-axis.
Figure 1. April 2026 campaign.

Our investigation of this activity led to the discovery of loader binaries distributing both Vidar stealer and XMRig.

Initial Access: Malvertising via Fake Software Cracks

This group behind this campaign distributes loader binaries through malvertising, targeting victims who search for pirated or cracked versions of copyright-protected software. The filenames used in this campaign mimic cracked versions of popular copyright-protected programs as well as generic installers.

The campaign delivers the malware in password-protected archives with a .bin extension in the filenames. This appears to be a deliberate choice to bypass email gateway scanning and to prevent automated sandbox detonation without the password.

We initially discovered 43 of these loader binaries that deliver Vidar stealer and XMRig. Upon extraction and execution, the loader binary is signed with a certificate (subject CN=justwatch[.]com), creating a false sense of legitimacy before any malicious activity begins.

Our analysis of these loader samples indicates they use the Factory-v3 framework.

Factory-v3/UpdateFactory Builder

Factory-v3 has been described as a MaaS builder used for different families of stealer malware. All 43 samples we discovered from this campaign contain embedded Go build metadata identifying the Factory-v3 framework.

The Factory-v3 builder's internal name of UpdateFactor is revealed in a developer/build machine path shown in the programming database (PDB) strings of the loader DLL files:

C:\Users\Administrator\Desktop\UpdateFactory\compiler\1.25.9\go\src\runtime\cgo

Figure 2 shows a diagram of information from the build machine metadata.

A flowchart titled "Build Metadata" with two branches: "EXE Variants" and "DLL Variants." Both branches lead to "Factory-v3 builder."
Figure 2. Information from the build machine path.

The builder generates a unique binary per build. For example, we observed 27 unique build UUIDs across 43 samples, defeating hash-based detection. The builder uses Go version 1.25.9, a custom pre-release of tools for the Go programming language.

Anti-forensic measures are consistent across all samples:

  • The PE TimeDateStamp is zeroed
  • No PE version info is present
  • DLL imports are reduced to kernel32.dll only
  • User-defined type names are obfuscated to a V###### pattern

The same builder, toolchain and Authenticode certificate infrastructure underpin a concurrent Lumma stealer campaign. This indicates Factory-v3 is used as a service for multiple stealer affiliates.

Rogue Authenticode Certificate

All 43 loader samples carry an Authenticode signature fabricated to impersonate JustWatch GmbH, a legitimate German streaming guide service. JustWatch has not been compromised. The certificate is entirely fabricated using a self-signed root certificate authority (CA) that is not present in any public trust store, as shown below in Figure 3.

A screenshot of a roge certificate information displaying details such as the subject and issuer. The serial number is listed. It shows a 4096-bit RSA key with extended key usage for code signing and TLS. The certificate includes a beginning and end validation date.
Figure 3. Rogue certificate information.

Because the certificate is not chained to a Microsoft-trusted root, Windows SmartScreen and Authenticode validation will flag the binary as untrusted. However, the visual presence of a recognizable brand name in the signature dialog is sufficient to deceive many victims into proceeding.

Sample Clusters

The 43 loader samples fall into four clusters, as Table 1 below shows.

Cluster CPU Architecture File Type Frequency Count Role
A x64 EXE 26 Go loader (file-inflated EXE)
B x64 DLL 13 Fake MpClient.dll sideload
C x86 EXE 3 Go loader 32-bit (shared with Lumma Stealer campaign)
D x64 EXE 1 Vidar core payload

Table 1. Sample clusters with filetype.

Cluster B DLL variants export Windows Defender MpClient.dll API functions to enable DLL search-order hijacking (MITRE ATT&CK® T1574.002). When a legitimate Windows Defender binary attempts to load MpClient.dll, the operating system locates the malicious copy first if it is placed in a higher-priority search path. The exported function names mimicked include MpAllocMemory, MpClientUtilExportFunctions, MpConfigOpen, MpFreeMemory and nine others.

File-Size Inflation

Loaders in Clusters A and C append hundreds of megabytes of null bytes after the last PE section, pushing the total file size to as high as 491 MB. Most automated sandbox environments enforce an upper file-size limit of 50-100 MB and silently skip oversized submissions, meaning the malware never executes in the analysis environment.

The real malicious content in the largest observed sample is only 2.3 MB, and the remaining 489 MB is null byte padding. Defenders should ensure security tooling removes null byte padding before applying size limits, since the same sample compresses to approximately 2.4 MB.

AMSI Bypass

Static disassembly of the Vidar core payload sample (SHA256 hash: 7ed4a256e1d281cb4f194d13ff554fb280dafde0a67a18115ea038ea6c87d) reveals an in-memory Antimalware Scan Interface (AMSI) bypass that executes before any stealer logic runs. The routine loads amsi.dll, resolves the AmsiScanBuffer variable and overwrites its first six bytes with a patch. This patch forces the function to return E_INVALIDARG, which might disable Windows AMSI for all subsequent script and code execution on the victim machine.

Both the DLL name and function name are XOR-obfuscated with single-byte key 0x05 to evade static string scanning. Table 2 shows the encoded and decoded strings for these names.

Encoded String XOR Key Decoded String
dhvl+aii 0x05 amsi.dll
DhvlVfdkGpcc\`w 0x05 AmsiScanBuffer

Table 2. Encoded and decoded strings from the sample.

Figure 4 below shows patched bytes written to the AmsiScanBuffer location (0x80070057).

A screenshot of a code snippet showing assembly instructions. It includes a move operation to the EAX register with a value, followed by a return operation.
Figure 4. AMSI buffer bytes.

The binary uses a second, longer obfuscation layer for larger data blobs. This layer is obfuscated by a 32-byte rotating XOR with the key 69946018ddda1058ce5c2a556c78a747838865c47074dcb165effb0840cb1cf5 applied to the Telegram bot token, Monero wallet address and mining pool hostname for the XMRig payload.

Attack Chain

Figure 5 shows that the attack chain begins with malvertising, luring victims into downloading a password-protected .bin archive disguised as a cracked version of a legitimate program.

A flowchart diagram illustrating the cyberattack path. At the top, it starts with a "Fake Crack Download," labeled as generic, leading to the "Factory-V3 Go Loader," signed with a fake justwatch.com certificate. From the loader, the payload drops include "Vidar + XMRig + Persistence." Arrows point to three processes: "Vidar Stealer" (stealing credentials and wallets), "XMRig Miner" (mining Monero), and "C2 Notification" (Telegram message labeled as "X3D Miner 'New Log'").
Figure 5. Execution chain X3D MINER/Vidar Stealer via Factory-v3.

The loader extracted from the .bin archive exhibits the following features:

  • It leverages the Factory-v3 Go framework
  • It is signed with a fake JustWatch certificate
  • It is padded with null bytes to reach a large file size of hundreds of MB to evade detection

The malware employs anti-analysis techniques such as process enumeration, alongside an AMSI bypass where the AmsiScanBuffer function is patched to prevent detection by some types of security software.

Subsequently, the malware drops multiple payloads including Vidar stealer and the XMRig cryptocurrency miner, while establishing persistence mechanisms through registry modifications and scheduled tasks.

The next stage involves reconnaissance, as the malware gathers information about files, hardware IDs (HWID) and bypasses proxies. Vidar stealer then exfiltrates sensitive data such as credentials and cryptocurrency wallets, communicating with a command-and-control (C2) server at 136.243.203[.]109.

Simultaneously, XMRig begins mining Monero using the mining pool at pool.supportxmr[.]com. Finally, the attacker is notified of new activity via Telegram, with messages labeled "X3D MINER • NEW LOG," ensuring the operator stays informed about successful infections and stolen data. This means the threat actor behind Vidar is deploying the X3D MINER XMRig package.

Dynamic analysis of the Vidar core payload confirmed the following execution sequence:

  1. Geolocation beacon: GET request to ip-api[.]com/json resolves the victim's public IP address and country, which are embedded in the subsequent Telegram alert
  2. Payload drop: It drops MicrosoftUpdate.exe in the %TEMP% directory as part of the Vidar stealer component and it places the following files in %AppData%\Temp%AppData%\Temp
    1. MicrosoftEdgeUpdate.exe (the XMRig launcher)
    2. libuv-1.dll (an XMRig dependency)
    3. WinRing0x64.sys (an XMRig kernel driver)
    4. mgwthmc2.dat (an XMRig Monero configuration file)
    5. It copies itself to this folder as NisSrv.exe for persistence
  3. Vidar stealer: MicrosoftUpdate.exe is written to %TEMP% and executed. It targets browser credential stores, cookies and crypto wallet data, packaging everything into a ZIP for exfiltration to 136.243.203[.]109:443.
  4. XMRig miner: MicrosoftEdgeUpdate.exe is launched with --config=mgwthmc2.dat. The configuration is built entirely in memory before being written to disk, with the Monero wallet address and pool details decrypted from encrypted blobs. Each victim's C:\ volume serial number is hashed into an 8-character HWID that is appended to the auth_token field, allowing the operator to track per-victim mining output in the Monero pool dashboard.

Persistence Mechanisms

The payload establishes persistence through three parallel mechanisms:

Registry Run key:

  • HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run value name SystemAgentService, data "...\AppData\Roaming\Microsoft\Windows\Temp\NisSrv.exe" -s
  • Scheduled task:
    schtasks /create /tn "SystemAgentService" /tr "NisSrv.exe -s" /sc onlogon /f

Startup folder batch script:

  • C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\FEbJCNWOCKMJ.bat

All three mechanisms point to the malware file named NisSrv.exe. Attackers chose this filename to blend in with legitimate Windows Defender components, since the real NisSrv.exe is the Network Inspection Service binary.

X3D MINER

The tag X3D MINER appears in Telegram operator notifications sent for every new victim infection. This moniker is used by a group associated with XMRig and binding XMRig with other programs.

The operator behind this campaign runs a dual-monetization scheme. Criminals sell credentials and session cookies stolen by Vidar stealer on criminal log markets, while XMRig provides passive income from hijacked victim CPU cycles. The Factory-v3 builder is assessed to be a separate upstream service used by at least two distinct stealer affiliates.

Variant B

Pivoting on information from the initial 43 loader samples, we identified 56 additional samples of a subsequent variant on April 24, 2026. This variant retains the same builder, delivery and C2 infrastructure.

The operating characteristics, Go loader, Factory-v3 builder, Telegram dead-drop and payload delivery are identical to the original campaign. The single differentiating factor is the Authenticode certificate. ​​

The operator transitioned from using a self-signed certificate mimicking JustWatch to another unauthorized certificate designed to resemble the BleacherReport[.]com certificate. This technique is known as Code Signing Impersonation.

Attackers craft certificates to mimic legitimate, trusted publishers (e.g., Microsoft or Google) by cloning their metadata as Table 3 below shows. It is important to note that Bleacher Report has not been compromised.

Variant A Variant B
Subject CN=justwatch[.]com CN=\\*.bleacherreport[.]com
Issuer CN=WR3 (rogue self-signed CA) CN=GlobalSign Atlas R3 DV TLS CA 2026 Q1 (Cloned issuer name)
Chain is trusted? No No
Certificate type Fake Authenticode (CA:TRUE) Certificate chain could not be built to a trusted root authority (fake certification)

Table 3. Certificate data from the old and new variants of Vidar stealer.

We observed these samples contacting the Telegram channel ci0iiif. New C2 servers in this cluster include 138.199.246[.]13, 116.203.243[.]208 and 136.243.203[.]111.

Conclusion

This campaign demonstrated a multi-layer evasion approach. This approach combined the following characteristics:

  • Rogue certificates
  • Go-compiled loaders with per-build unique hashes
  • Binaries inflated to hundreds of MB with null byte padding
  • An in-memory AMSI bypass

Loader samples sharing these characteristics were all delivered via a MaaS platform that also serves other malware stealer families.

The operator's shift from using a self-signed certificate to leveraging an unauthorized certificate in Variant B demonstrates the actor's ability to adapt rapidly.

We recommend that organizations enforce strong Authenticode chain validation and supplement it with:

  • Certificate serial blocklisting
  • Configuring security tooling to scan files regardless of size
  • Monitoring for MpClient.dll loading from non-standard paths.

Defenders should also:

  • Hunt for the persistence indicators and file-drop patterns described above
  • Block outbound connections to all C2 addresses and pool.supportxmr[.]com immediately

Palo Alto Networks Protection and Mitigation

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

  • Cortex XDR and XSIAM help to prevent the threats described in this article, by employing the Malware Prevention Engine. This approach combines several layers of protection, including Advanced WildFire, Behavioral Threat Protection and the Local Analysis module, to prevent both known and unknown malware from causing harm to endpoints.
  • The Advanced WildFire machine-learning models and analysis techniques have been reviewed and updated in light of the indicators shared in this research.
  • Advanced URL Filtering and Advanced DNS Security identify known domains and URLs associated with this activity as malicious.
  • Prisma Browser provides additional protection layers against advanced web threats including dynamic scans of every loaded web page, to prevent execution of new and unknown malicious attacks such as the malvertising campaign described above, and to protect company assets.

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Indicators of Compromise

Vidar C2 Server IP Addresses

  • 116.203.243[.]208
  • 136.243.203[.]109
  • 136.243.203[.]111
  • 138.199.246[.]13

Code Signing Certificate Information

(Read: Field - Value)

  • Subject Common Name (CN) - justwatch[.]com
  • Issuer Common Name (CN) - WR3
  • Serial Number - 2f:7e:f0:15:7d:17:62:5c:09:86:91:ce:f1:ff:7d:63
  • Validity Period - 2026-03-09 to 2026-06-07
  • SSL Certificate SHA1 Hash (C2) - ab92f731ab20774dfdb95664ee41a2fbafe2a284

File Paths

(Read: File path - Description)

  • %TEMP%\MicrosoftUpdate.exe - Vidar stealer component
  • %AppData%\Roaming\Microsoft\Windows\Temp\MicrosoftEdgeUpdate.exe - XMRig launcher
  • %AppData%\Roaming\Microsoft\Windows\Temp\NisSrv.exe - Persistence copy of loader
  • %AppData%\Roaming\Microsoft\Windows\Temp\libuv-1.dll - XMRig dependency
  • %AppData%\Roaming\Microsoft\Windows\Temp\WinRing0x64.sys - XMRig kernel driver
  • %AppData%\Roaming\Microsoft\Windows\Temp\mgwthmc2.dat - XMRig Monero configuration
  • %StartUp%\FEbJCNWOCKMJ.bat - Startup batch script for persistence

Registry Key for Persistence

  • Registry key: HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • Value name: SystemAgentService
  • Data: "...\AppData\Roaming\Microsoft\Windows\Temp\NisSrv.exe" -s

Scheduled Ask for Persistence

  • Task name: SystemAgentService
  • Trigger: On user logon (/sc onlogon)
  • Action: ...\AppData\Roaming\Microsoft\Windows\Temp\NisSrv.exe -s

Import Hash (imphash) Analysis

Table 4 shows the imphashes with the associated sample clusters and the role of those clusters in this activity.

Imphash Cluster Role
d42595b695fc008ef2c56aabd8efd68e A - x64 EXE (26 samples) Go loader EXE
d8b31f8c03e0c76ff245ed05a15ffe6c B - x64 DLL (13 samples) Fake MpClient.dll
1aae8bf580c846f39c71c05898e57e88 C - x86 EXE (three samples) Go loader x86
c10333c92889b65c3590ef2b3819b420 D - Vidar core (one sample) Vidar core payload

Table 4. Imphash information associated with this activity.

SHA256 Hashes - Original Cluster

Cluster A - x64 EXE Loaders (26 Samples)

  • 097a87cfa4a5186aba3bba096866692951bde59c6f0c2e8c1c4a599246d14da8
  • 201594c9d173bba6cb509407ecba378c19b93da0a81a2182a913c480e6dbb54e
  • 20bf39e1e67152039e70a01ad9e7b23c08d23d2a724ef9c44903f3d4353a2275
  • 35dde1b2482b12582820a861e7c46f10721af6b75052fc872c05d2230a4e8ca1
  • 43920ef7d2742d140a1ab2a1ef172c716903474c73561377dc4f1534d2c5f581
  • 47d6d1a38534ba897a5a1e293e3d5df303bbd8e0526e756ad08887ffc1417bef
  • 68ced9d7c1b1ff8ffb5f56c7d3f849d4fd16a1b95324426811424b40043d6d25
  • 6b7ff061eebeb9ead8812c410247768a7ba90786aeeb1bafa6412cc5b08237b5
  • 739cdedb20de39aeb1f15dc8c2dbbf15fa993250fd879bf87443ff9aeaf4997b
  • 74df77b6a83d89fa137fd285a2efde36b1d62c00b3be81cc93df7d1e6e94837b
  • 8b40cc7d173efd27fb60f3d260acef28f58d67d1f39597e1d611db311a305f62
  • 9656d3301f63ef6114289739a1c44082206298f787238fc6c190ad87eab24751
  • 9b3df1b6c1b98c201de09a7719066f7bcae6b66a3173b703a617f53fddf67d51
  • a17a972a05afe387ed32aa2986d5be8bca2f22619d0aedfa834c6963abfab3bf
  • a4f979b4a5d7bc8bc455dd4c09b44e51a389576fccce35a2c8da3ce680237565
  • a64843ebfbc39e96ec7613003b1b5c3a9b878874ea15a05e1d34ce91781ebfb6
  • aaa2bc1128d8b8b2da76262bf87ede19bac053cca6576efba6aaa71c9438c304
  • b830f043076a12748b6a2dc0810ece85439ee77434d991ae7d84201b09ead756
  • bb30cc2b302d9a6963109b201b78d4163bb6c2d7bc8bf5a66e9a744b62fc2717
  • c328b78c21060e2203ac517833fce41572b91878e187f85fa434cd6914659834
  • c7a4a547eb7f6b0b4b75bb6dd8955244bb2618ba234ae740cdedd7c2d30e3465
  • d384c403c084967d8c967501ee6332b050af04ef424f13a3f5a88d155389d98c
  • d6446f2803444bd2200d48a01a9ad7d487e67e8e831c9cd13f89cbfec17fd4e2
  • d7c9c9469c513c05aa431fae34f414f91fcf3f794d3e76b6e4d0b92c4cd3ff2e
  • d8c1f96107a3349e62b3ab9afc60f62af9c89b6961b637a26b71e1230f2b3b8a
  • f0dcb7e407de85d8de8e2221df8dddecac8aec88af8975c9f07e14100f6edb88

Cluster B - x64 DLL Loaders/fake MpClient.dll (13 Samples)

  • 0a6a67a2fc4d79ec1cd8afc5b8b7a5e69a406e53d57a7334e097c5d0644de5f6
  • 488d941b7b4428b0f4a0e5495e3857b9b96215fb3e7f164b06640d59096425e6
  • 5d7324d8b5a25f862ef8223c6766d0e80af3ad168e17312b265e13a3a68e0ded
  • 7720e83c02a027d70ae201c393c1956aa2fa8199879a3a4c4fd1d20b03022cfd
  • 7e49da0ae2f81e14841f356b4d69f0480c2d9ce3fab5a3fa91b0036d9a36fa0f
  • b8b5f6991a3a61083461d5269245bebf28b90934c328848ba8c1e084a5a6216c
  • b927d265fa29e471c1ae0d31516e480c09c0fb17f480ad08ea8d5b73e84b7a1b
  • b9b6893fa6b04ee8daa29e515c08239ac5204af1a1fa2bc10006eede1b41329b
  • c7c37a973b14edd5b6b2da4a1497c593e43640735ff54aecc9a3288fa5e548e3
  • d2148a458da46e81702136aa915312d360805f083d1f37ff5531db9fbdb8ad6d
  • d7b56818c829960b692de9ad5a14e52669d953e9f074f7218c3fe34ede4a11a0
  • db2a872f712fbdb1e347d06e29a9ed8278d86710ffc14ff04422be76e47124f4
  • e9e5e748ec5c0b811c8e60b0e55059edb4d2df86ff3ca45969e57d5fecb11a38

Cluster C - x86 EXE Loaders (Three Samples)

  • 03e6f4f49cec3af38bbec9ed64c195c7a85a630ec989efb3669f04a2993c1dd7
  • 914c18a04a2727bba9cecab78a1d516ec3c7a3f667e0e5a6081aa0e9206a69fe
  • d78082dc33c6dca98316e865efa9829c6eb5a97c2ca3cd4ea6c2123a5f6ae45b

Cluster D - Vidar Core Payload (One Sample)

  • 7ed4a256e1d281cb4f194d13ff554fd4fb280dafde0a67a18115ea038ea6c87d

SHA-256 Hashes - Variant B Cluster (56 Samples)

  • 15489bcd6e4602b41c9a787ec8d7ab027d5e45d400938048bb1c702ad5937980
  • 169a330353e53a409e0109c914404354741ff1e1c64e501738dc05e58ea92abc
  • 2a02ec4af5ed591afdf1236a443e3b68642ee133f38a2857d1eada51246ab498
  • 2b7297a5f502a2e9a59066f0a370bc5a8b28addd0e27975db3d770f801c15397
  • 2c0b344af415b787b396c8e23bbeb112bd471a1ca1d12cf357c48e2ee1ae068c
  • 2c6e8f86c05781af12b323311e83e011f1a603928e2086c48e2ca59e33d90dbe
  • 2e11a16f94484e0f43eb4572f800f26f0b4a1314cbdae3c44c1ae35f376906d8
  • 2f1400a91c853d61622f4d21ed97d96ea1093c0fa1586669bea6f6baa331251f
  • 314ce675c040c63b825f213965f5c76a3bd09bf70e138708367e2a84e9e84b30
  • 32172e4d8d2ab9fb29b36c9b279117be6ff611b5b91ff7b1c42501a5ec969f2b
  • 330efeebba3782994612fdfe20ff96c930af33a83b88a342b6622461511921b2
  • 35b51bbe42edd15918b015eaa1b4f0e6b5c94f186d71d887e39f1da69a4dec3f
  • 3c3f12531045b7eedfe25e0f291d4792b0d8c8366f8de043e2fa8ecf34ccb913
  • 3db33b0423bb9278db267a7adb036ecbd6aeebd7909d06d824919708b1e12e1b
  • 3e906ae47e9836a591f44d4b743e961d634a404fa8fd8bfae64f1d54c853be2b
  • 4bf770a59d367b532dec32668f86003b17d93918dba5ef5fd2b19c5394252436
  • 4f456142caf590d98fb11ca247800bb417766714527e5a4707ac2f5d01542626
  • 53d263b292be387843fadb7131c2d538b4262c81f5b95cfacafacf2d5446c06e
  • 5494909e0f5221db75e933b28981b2d0e118f227b7d8a5980d88b500b76dfc2e
  • 54dc05ab56244444f86d69b8274a6075906f7ba2307b08e08d3884abde255495
  • 559f46ceb801a3540eace594476718e1486b5b4423cfb4ff64530ff8fb4a3815
  • 5838ae6c748dcbdfa13c6529c654cb821897d29835d3e7e05ca23fb2f3794f02
  • 59b9153c4c9e155c976db1a2fd4d1b28fa10bb9c4dcafdc4758b352c037e3d86
  • 5b6a466b65d479b77a03b15a95ac097b45e23ff7ae5ef6282985b2a503deb691
  • 613e5314a7ded3155cdec49fd34e852e181f4651d78bd8bf3adad2f4dbf22b0d
  • 62877a5096828c4bc2fca7cbee7d38b11a0c90fd0d3fc8c37981581e9988c919
  • 634e89d8592d7c9e2bc1c098217a813947b44a4f80bc569e9a15c1e8b0864b91
  • 67569adec99fd38b114ae07e2e549e6c16f75368f3c5373022c84934ed1c8e84
  • 6d49233b1fca22f3823e856e4c16749e9c45f384ea57055fead16df35b217226
  • 71c79e8bf71ed257435ea9b8b91e118ba03ec681860651190f7d7457804313ee
  • 77469615c5f548063922b469a8c0a4116511395d013e5a798e123e9c119acc4b
  • 7828e17e674507ab13dfd84b31b361fa19b9cb27ee130620ba9211feef746d31
  • 8dbcde2a28a0b3de201214d7e3bd43acc97561924daa247c05c4b0536d42be85
  • 901a43b42f997710147295a0625e20c935207f8c531daf5311449ec119a37dcc
  • 94db6fa14b4e487dffba709b87e8a7e25483300ed409de243b19fff7cf2f0978
  • 95cd48130247525d8a7e966bd3fa07e9d6c39ebbe3058ecccb336f66bb8e3d1e
  • 96bb418128deeb2b9d2e4b66b98cae07b238b326b6456cc9b86802e67c504a03
  • 98cce1e69873de25e5139aa848f469bef2af345a8a49d15000b5b5e72b582896
  • a1039de7ec690d64db9d7d91f3d777d308e49e958de4154aa0b62ded7820f1fe
  • a785fc61fc4ff7cff0ddb540bf7ff12111ed0d6031f78f48387a6c16cb3c5451
  • aa0083f662f055e8d911c5de3a8f3a31b3c84cacc7dccc30c98f2be14dba4102
  • b58814fb3ce5a085014ee6e8d89f7cc1380b234b97170fd5f3398031281c6a77
  • b6912c23cccc4b0964d55608916297f6978f0b38c80a4beac472004a786fcef7
  • bd3230e4ceaf32ad2248ab069b164bd2144401967ac69de0a4cd1734fe429d9c
  • c25799facb3e788830bcf614f33411d3bcfc0edd4a2200e160b5eb4ce700039f
  • c39fedb662259bd76b11616966c41ff1fbda58d9b129b9c1bd818700eea92b29
  • ca8a00c9d36c64e5dcf562c7ae2b8df4bd6455fe0b41b32ee3a2a528ddc2d155
  • ce379de03e35e0ea2c88744c29b9e2678165214065f9b957177002c6bbe69084
  • d18369be4487d7cd0e4bd3dd0da720672e56e13ca43627305e26767e26925551
  • d7745513034af14617436ad6b3fc125fd0343218411d0c79bda56b0dadc86b2b
  • d8ac0c08e4c698017558e532974cf749135d3d49757f05001e6127dc6e07cf17
  • dccf9f008b42a04f7e69d3bbf7b5ce81e71308545d6176cc4763920a424e5ac1
  • e5341edb7c039c456d46c39f194be86ce4b41725d7ad12d297d18aa99cddd675
  • e88c41a6f769cd760e323b4f7c01835433cd4059cd59630cb1a9eb1181b350ed
  • f13f9cef5cc020bf673c7f4e19c93c312a043867f46796a8f01927a9a14c2533
  • f760bc16a585325ba9d74917f9e0994d3a4164c1141158c799b619d2c823e818

Additional Resources

How We Added WebAuthn to a Browser-Based RDP Client

The Pitch

TL;DR: We built the first RDP client outside of Windows to support WebAuthn redirection, beating Microsoft's own macOS, iOS and Linux clients to it (since then FreeRDP has added support too, which we’re happy to see). No browser API could do what we needed, the protocol spec was missing entire commands, and we discovered that Microsoft's Windows implementation routes through internal, undocumented code paths we had to reverse-engineer. This is the story of what we found.

Prisma Browser offers support for more than the standard secure web browser. We often build support for protocols that go beyond web applications. We develop tailored solutions for Prisma Browser to enable its users to solve complicated security issues. One useful example is Remote Desktop Protocol (RDP).

IT operations frequently require SSH, while remote users need to access legacy and on-premises applications using protocols such as RDP. In the past, these were only accessible via thick clients, which required opening risky network tunnels, or through remote session hops that translate traffic into browser-native protocols like HTML5. This translation often impacts performance and breaks core functionality.

To meet this need, we have developed native clients directly inside the browser. Doing this has also surfaced a demand for even more flexibility and features within these native clients. This post covers one of our recent announcements that not only fills a critical gap but makes our native clients superior to the common thick applications used today.

It all started when someone asked: "Can we support security keys? If a user is on a website inside the remote session and it asks for their YubiKey, can we just redirect that to their local machine?"

Sure. Microsoft has a protocol for that: [MS-RDPEWA], the WebAuthn Virtual Channel Extension. There's a spec. How hard can it be?

Two weeks, one IDA Pro license and several existential crises later, we had it working.

Obligatory AI Section

Two years ago, the reverse-engineering part of this work would have taken days, easily. Today, it took a few hours with AI to write a working IDA model context protocol (MCP) bridge, then a few more hours using that bridge to ask the binary the right questions and find the pieces we needed.

AI did not reverse-engineer the feature for us. The hard parts were still knowing what to ask, validating every answer, setting breakpoints, comparing traces and proving the protocol behavior end to end. But the workflow changed dramatically: Instead of clicking through disassembly for days, we could build a tool, connect it to IDA and iterate in minutes.

Reading the Spec

The [MS-RDPEWA] specification describes a dynamic virtual channel (DVC) called Microsoft::Windows::RDP.Webauthn. The server sends CBOR-encoded WebAuthn requests, the client talks to a local authenticator and sends back the response. Four commands:

Command ID Purpose
WEB_AUTHN 5 MakeCredential or GetAssertion
IUVPAA 6 "Got a platform authenticator?"
CANCEL 7 Cancel current operation
API_VERSION 8 Version negotiation

Clean. Straightforward. Surely the hard part is just wiring it up. We'll get back to that.

Note: When we did this work the spec stopped here. The [MS-RDPEWA] 3.0 revision (March 2026) has since documented two more commands, GetCredentials (9) and GetAuthenticatorList (12), gated to Windows 11 24H2+ and Server 2025+ via KB5065789.

"Just call navigator.credentials"

Our initial plan: receive the WebAuthn request from the server, call navigator.credentials.create() in the extension, send back the response.

Here's the problem. When a user visits okta[.]com inside the remote session and triggers WebAuthn, the server intercepts the ceremony. It computes clientDataHash = SHA-256(clientDataJSON), where clientDataJSON contains the page's origin, the challenge and the ceremony type. Then it sends that 32-byte hash over the RDP channel.

On the client side, navigator.credentials.create() insists on constructing its own clientDataJSON, with its own origin: chrome-extension://..., not hxxps://okta[.]com. It hashes that, hands it to the authenticator, and the authenticator signs over it.

When the assertion gets back to Okta's server: hash mismatch. Signature verification fails. SHA-256 is a one-way function. There's no going around this.

We briefly considered reconstructing the clientDataJSON ourselves from the known challenge and origin. Three reasons that doesn't work:

  • Browsers don't produce byte-identical JSON for the same inputs (field ordering, encoding).
  • Native apps using WebAuthn SDKs add more variability.
  • Older Windows servers don't even send the ingredients. They send only the 32-byte hash. No origin. No challenge in cleartext. Just the hash.

Building a Custom Browser API

No existing browser API can accept a pre-computed clientDataHash and pass it directly to an authenticator. Not navigator.credentials. Not chrome.webAuthenticationProxy (designed for the opposite direction). Not remoteDesktopClientOverride (requires the original JSON). Not WebHID (USB-only, no Touch ID, no phone-as-authenticator).

Since we built this, the W3C WebAuthn working group has started standardizing exactly this case (the remoteClientDataJSON extension, editor's draft section 10.1.6). It is not yet in any shipping browser, so the custom API below is still required, but the direction is encouraging.

So we built one: a custom extension API with makeCredential() and getAssertion() methods identical to navigator.credentials in every way except one. The caller supplies the clientDataHash directly; it goes straight to the authenticator.

The upside of being a web-based RDP client inside Chromium: We get Chromium's entire FIDO2 stack for free. Authenticator discovery across USB, BLE, NFC and platform authenticators. Cloud-assisted Bluetooth low energy (caBLE)/Hybrid transport for phone-as-authenticator. Touch ID and Windows Hello integration. The credential selector UI. Our custom API is a thin wrapper reusing all of this machinery.

Why not just use libfido2, the way FreeRDP does? Because FreeRDP is a native client and we are not. libfido2 reaches authenticators over USB or NFC by opening raw HID devices directly, which a native process can do but code inside a browser cannot.

From WebAssembly there is no raw HID access. The only in-browser transport is WebHID, which is USB-only (no Touch ID, no Windows Hello, no phone-as-authenticator). Getting true device access would mean shipping a separate native helper outside the browser, defeating the point of an in-browser client. And even then, libfido2 alone would not give us platform authenticators or phone-as-authenticator over caBLE/hybrid.

By wrapping Chromium's own FIDO2 stack we get all of those for free. That is also why, on Windows, our path runs into Chromium's WebAuthn machinery and its clientDataJSON requirement, while a native libfido2 client does not.

This worked. YubiKey blinks. User touches it. Registration succeeds. We celebrated for approximately 90 seconds before the next problem emerged.

"It Works on This Windows Version But Not That One"

Our WebAuthn redirection worked beautifully against some Windows servers and completely failed against others. Same client code, same authenticator, same relying party.

Here's why. On Windows, every browser (including Chromium) calls WebAuthNAuthenticatorMakeCredential from webauthn.dll. This public API unconditionally requires the full clientDataJSON:

Our approach of passing a raw hash directly works on macOS and Linux (where we control the authenticator stack) but hits a wall on Windows.

The deeper issue: Not all Windows servers send the same data. Newer Windows servers (API version 9, currently only Windows 11 25H2+) additionally transmit clientDataJSON, remoteWebOrigin and the full W3C credential options over the wire. Microsoft published the v9 struct changes to webauthn.h in September 2025. If both sides are v9, you get the new fields and everything is straightforward.

But older Windows servers (Windows 10, Server 2019/2022, Windows 11 through 24H2) send only the 32-byte hash. This is the vast majority of enterprise environments.

So how does Microsoft's own mstsc.exe handle older servers? It uses the same webauthn.dll. But how it actually processes a hash-only request is undocumented.

Time to break out IDA Pro.

Reverse Engineering mstsc.exe

Before diving into disassembly, we had one paranoid question to answer first: what if the server is just... cheating? Like, what if it quietly detects that it's talking to mstsc.exe and slips it a clientDataJSON in some side channel, and the whole thing only works because Microsoft wrote both ends and decided third parties were on their own? We had to know before spending days in a disassembler.

So we hooked mstscax.dll with Frida and intercepted the WebAuthn DVC channel in both directions across two complete FIDO2 ceremonies. Result: no clientDataJSON on the wire. The server sends a 32-byte clientDataHash. The client sends back a CTAP2 response. No JSON anywhere. So mstsc.exe is dealing with the exact same problem we are. But it works. Sorry I doubted you, Microsoft.

mstsc.exe never calls the public WebAuthn API.

webauthn.dll has a “dual personality”:

  1. Public API (WebAuthNAuthenticatorMakeCredential, etc.): documented, stable, used by browsers and apps, requires clientDataJSON.
  2. The DVC plugin path: an exported function VirtualChannelGetInstance() creates a WebAuthNDVCPlugin (implementing IWTSPlugin). This plugin handles everything through private, unexported functions that are perfectly happy with just clientDataHash and no JSON.

Microsoft does acknowledge this dual role. The IWTSPlugin MSDN page notes: "The IWTSPlugin interface is implemented by %System32%\webauthn.dll to enable the Remote Desktop WebAuthn redirection functionality." The page also points you to VirtualChannelGetInstance (which has its own reference page) to obtain the interface. What it omits is what the plugin does with a hash-only request.

VirtualChannelGetInstance takes a GUID parameter, and Microsoft documents the prototype on its reference page (noting it is not shipped in a header, so you declare it yourself). The GUID is IID_IWTSPlugin, which has shipped in tsvirtualchannels.h in the Windows SDK for years. It is a genuine third-party integration point; what Microsoft does not document is how the plugin handles a hash-only request, which is the behavior we reverse-engineered to replicate in our own Windows code path.

The call chain we reverse-engineered:

The private CtapCborDecodeRpcRequest treats clientDataJSON as optional. If it's in the CBOR, use it. If not, pass through the hash. The public API is strict; the private plugin path isn't.

What We Ended Up With

  • A DVC plugin for the WebAuthN_Channel, implemented in C as part of our existing WebAssembly (Wasm) client
  • A custom Chromium extension API that accepts pre-computed clientDataHash values, supporting USB keys, Touch ID, Windows Hello and phone-as-authenticator via caBLE/Hybrid
  • A TypeScript protocol layer handling CBOR encoding/decoding for MS-RDPEWA, including parts that were undocumented when we built it
  • A detailed reverse-engineering report on webauthn.dll's dual nature

Works on both newer Windows servers (with clientDataJSON) and older ones (hash only). Supports registration and authentication. Handles the commands that were undocumented at the time. When we shipped it, no other non-Windows RDP client did this. FreeRDP has since added support (version 3.25.0, April 2026), which is great news.

Since We Wrote This…

  • Microsoft updated the MS-RDPEWA spec (version 3.0, March 2026) to document commands that were previously missing
  • The W3C is standardizing the browser side via the remoteClientDataJSON extension
  • FreeRDP shipped a non-Windows implementation in version 3.25.0 (April 2026)

We have folded these in, in the text above. The reverse engineering was necessary when we did it, and the cross-platform challenge is unchanged.

Takeaways

The protocol is platform-agnostic; the implementation knowledge is not. MS-RDPEWA defines a clean wire protocol. But implementing it correctly required reverse-engineering mstsc.exe, because the spec was missing commands, field definitions and protocol extensions (Microsoft has since documented some of these in the MS-RDPEWA version 3.0 revision, March 2026).

The Windows version split is the core architectural challenge. Newer servers send clientDataJSON. Older servers send only the hash, requiring an approach that no standard browser API supports. Microsoft handles this through webauthn.dll's DVC plugin; a documented entry point, but one that only works on Windows and whose hash-only behavior is undocumented. If you're not on Windows, you're on your own.

Microsoft’s documentation gaps aren’t edge cases. Niche details such as a missing command, undocumented protocol fields, the undocumented behavior behind the plugin or a spec example with the wrong command number are things that must be fixed for the implementation to work at all.

When we shipped it, this was the first implementation of WebAuthn redirection outside of Windows. Since then FreeRDP has added support too (version 3.25.0, April 2026), which is great to see. Microsoft's own macOS, iOS, Android and Linux RDP clients don't support it. We hope this post explains why, and what developers can do to leverage this knowledge to improve their own RDP clients.

Native RDP and SSH clients in the browser allow you to implement security and data controls for all your sessions. To find out more about Enterprise Browsers' security capabilities, you can read our deep-dive on native RDP and SSH access or explore the five non-negotiables for choosing a secure enterprise browser.

Phantom Squatting: AI-Hallucinated Domains as a Software Supply Chain Vector

Executive Summary

Unit 42 researchers found that large language models (LLMs) consistently hallucinate web domains for legitimate brands. Adversaries are actively weaponizing this vector by registering these nonexistent domains to intercept traffic generated by AI systems. We call this phenomenon phantom squatting, and it poses a significant risk to the software supply chain.

Our proactive monitoring of registration for high-priority hallucinated domains yielded real-world detections across multiple sectors. We were able to predict use of these domains from 18–51 days ahead of adversary registration.

A standout case reveals an attacker who leveraged an AI coding assistant to build a full phishing kit named Montana Empire. This kit targeted a domain our detection pipeline identified as a high-risk hallucination target 23 days earlier, demonstrating the full cycle from AI-assisted attack development to LLM-hallucinated domain prediction.

To detect the risk posed by phantom squatting, we analyzed 913 global brands and executed 685,339 URL queries across multiple configurations of two distinct LLM models. This generated 2.1 million URLs and revealed over 13,229 confirmed malicious URLs. Furthermore, we discovered approximately 250,000 hallucinated domains that remain unregistered, presenting a significant opportunity for adversaries to exploit the software supply chain through preemptive registration.

Palo Alto Networks customers are better protected from phantom squatting through the following products and services:

The Unit 42 AI Security Assessment can help empower safe AI use and development.

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics LLM, Agentic AI, Supply Chain

Introduction: LLMs as Supply Chain Dependencies

The Expanding AI Trust Surface

The software supply chain threat landscape is shifting. For decades, supply chain attacks focused on predictable artifacts such as tampered build tools, malicious dependencies and compromised update servers. Defenders built protections around these predictable attack surfaces using package integrity checks, signed binaries and dependency auditing tools.

However, this model is becoming less effective. LLMs are no longer peripheral utilities, they are active participants in the software development lifecycle.

People consult AI coding assistants for documentation links. In doing so AI agents perform autonomous web research on behalf of developers, then formulate and execute HTTP requests against URLs the models themselves generate.

Enterprise continuous integration and continuous delivery (CI/CD) pipelines integrate AI assistants that recommend third-party service endpoints. For example, a developer querying a pipeline assistant to configure a cloud deployment notification might receive a recommended webhook URL such as hxxps[:]//api.build-notifier[.]io/v1/pipeline/events. Such a URL could be entirely fictitious and an adversary could have pre-registered it to intercept automated build telemetry or secrets.

In each case, downstream consumers often trust the LLM's output including the URLs it generates, without independent verification. This situation fundamentally alters the attack surface. When an LLM produces a URL, that artifact may be:

  • Ingested directly by autonomous AI agents that retrieve the resource
  • Integrated by developers into production-grade code
  • Suggested by AI coding assistants as the authoritative endpoint for third-party services
  • Included in documentation generated through large-scale automation

In these scenarios, an LLM functions as a trusted supply chain dependency. However, as with any trusted architectural component, it is susceptible to systematic exploitation.

From Slopsquatting to Phantom Squatting: Extending the AI Supply Chain Attack Taxonomy

Prior research on slopsquatting established the foundational attack pattern. LLMs frequently hallucinate software package names that do not exist in any legitimate registry.

Phantom squatting extends this adversarial logic from software packages to web infrastructure. Just as an LLM might hallucinate a library name, it can generate fictitious domains for web portals, API endpoints or corporate services for a target brand.

Throughout this article, we use the term phantom domain to specifically refer to a hallucinated domain that an adversary has or could weaponize.

The adversarial logic is illustrated by the following scenarios:

  • A coding assistant generates a plausible but unregistered benefits portal URL, allowing an adversary to preemptively register it.
  • An AI research agent produces a plausible banking portal domain that an adversary could have already registered to capture traffic.
  • A developer integrates an AI-generated API endpoint into their code, unknowingly directing application data to an attacker-controlled server.

This is no longer a theoretical risk. Our research confirms this vector is currently active in the wild.

Why Existing Supply Chain Defenses Miss This Threat

Typically, URL filtering and threat intelligence frameworks operate under a critical, shared assumption, that malicious infrastructure possesses a detectable reputation. Typical block lists rely on historical reports of malicious activity, while threat feeds require a domain to be observed within an active campaign before classification. Reputation scoring models require a domain to maintain a presence long enough to accumulate telemetry signals.

A phantom domain effectively exploits a zero-reputation bypass. At the moment an adversary registers and weaponizes a hallucinated domain it:

  • Carries no threat intelligence history
  • Has not established a reputation score
  • Lacks any blocklist entries

The infrastructure is nascent, the content is original and conventional defensive perimeters have no actionable signal. By the time threat intelligence systems synchronize, people have already been funneled to the site by an AI system they consider authoritative.

This shows the structural advantage of phantom squatting over legacy phishing. The fake domain is born clean because it comes from the LLM’s own internal vocabulary. These are the same language patterns that make the model’s output seem legitimate.

Threat Model: The Phantom Squatting Attack Lifecycle

Figure 1 shows the phantom squatting attack lifecycle operates across four distinct phases:

  • Discover
  • Act
  • Lure
  • Bypass
A diagram illustrating the phantom squatting attack process in four steps: Discover, Act, Lure, and Bypass. Each step has corresponding icons, including a person at a laptop, cloud connections, a globe with nodes, a dialogue box with a URL, and security alerts. Red arrows connect the stages.
Figure 1. The phantom squatting attack lifecycle across four phases.

Discover: Adversarial Probing of LLM Hallucination Patterns

The adversarial lifecycle begins by mapping a target brand's hallucination surface — the collection of phantom domains an LLM generates in response to diverse prompt strategies. This phase, which we define as adversarial hallucination probing, involves systematically querying models. Attackers could use realistic prompts that mimic everyday user operations, with the primary objective of observing and mapping the resulting hallucination patterns.

Act: Registering Hallucinated Phantom Domains Before Defenders React

Armed with a prioritized inventory of phantom domains, adversaries proceed to preemptively register those most valuable for attacks. For generic top-level domains (TLDs), the barriers to entry are negligible. Registration is both economical and nearly instantaneous. Our analysis confirms that threat actors operate with significant speed, often well within the window of any feasible defensive response.

In observed real-world telemetry, these domains transitioned from initial registration to active malicious content deployment within hours. In the case of Montana Empire, the adversary had even staged the server-side phishing kit prior to the domain’s registration, demonstrating a highly optimized zero-reputation bypass strategy.

Lure: LLMs as Unwitting Attack Delivery Mechanisms

Following the registration and subsequent weaponization of a phantom domain, the LLM itself functions as the primary attack delivery mechanism. Any user or autonomous AI agent that issues a query triggering the hallucinated URL receives an authoritative, high-confidence recommendation to navigate directly to attacker-controlled infrastructure.

This represents a defining characteristic of the phantom squatting threat. The delivery vector bypasses traditional phishing emails, malvertising or watering hole attacks. Instead, the delivery mechanism is the trusted AI assistant already integrated into the user’s workflow.

Consider a scenario where an employee queries for a third-party service endpoint from an AI coding assistant. If the LLM provides a fictitious domain like evilphishing[.]com/auth/login, the exploitation occurs without a single traditional phishing lure. The victim is compromised simply by following a confident recommendation from a system their organization has already formally sanctioned.

Bypass: Zero-Reputation Evasion of Reputation-Based URL Defenses

The final phase of the attack lifecycle relies on a newly registered phantom domain's zero-reputation status, circumventing most conventional URL defenses. As noted earlier, at the moment of registration and initial weaponization, the domain lacks any blocklist entries, threat intelligence history or established reputation score. It has not yet been reported or classified by people.

From a defensive perspective, the infrastructure is nascent and indistinguishable from any legitimate new domain until it has generated sufficient malicious telemetry to trigger a classification signal. By the time threat intelligence systems synchronize, the exploit has already been delivered to victims who relied on the trusted AI assistant’s authoritative recommendation.

This structural advantage for attackers is not merely a transient window of opportunity. Sophisticated attackers can maintain this bypass through active evasion techniques, including redirect cloaking — serving benign content to automated crawlers while targeting human visitors — and the deployment of CAPTCHA-protected infrastructure.

A Proactive Hallucination Discovery Framework

To quantify and operationalize the phantom squatting threat, we engineered a multi-agent discovery framework. This framework simulates the comprehensive attack lifecycle, from adversarial probing to real-world registration detection. Figure 2 shows the discovery pipeline of this framework.

A flowchart depicting phantom squatting in a multi-stage discovery process. It includes the "Query Agent" for brand context analysis, the "URL Creator Agent" using LLM1 and LLM2 for URL generation, the "Verification Pipeline" for threat intelligence and ownership analysis, and a "Watchlist" for proactive monitoring. Outputs include blocks and flags, with a registration alert icon at the top.
Figure 2. The phantom squatting multi-agent discovery pipeline.

Query Agent: Simulating Attacker Probing

The query agent shown in Figure 2 generates a prompt corpus to probe LLMs. It operates in three main phases.

  • Brand context profile: The agent researches a brand's products, portals and developer resources. This process ensures prompt references to real services, which helps generate high-fidelity hallucinations.
  • Adversarial probing: Effective probing requires a diverse set of realistic prompts. Rather than probing randomly, we exploit known LLM failure modes to generate a realistic and diverse set of prompts at scale. These include premise acceptance, authority-framing compliance and the model's tendency to complete narratives with authoritative yet fictitious details.
  • Diversity filtering: To ensure variety, we use Jaccard similarity to filter out similar prompts. This broadens the probe of the target's hallucination surface.

This methodology produced 685,339 prompts across 913 global brands.

URL Creator Agent: Mapping Hallucination Behavior Across Models and Temperatures

Prompts from the query agent feed into the URL creator agent. The URL creator agent executes the prompt corpus across multiple LLM providers and a spectrum of LLM temperature configurations. Our methodology used two distinct LLM families:

  • LLM1: A production-optimized, mini-class variant of an enterprise LLM from a major technology provider (released April 2025), engineered for high-volume, cost-efficient deployment.
  • LLM2: A low-latency, lite-class variant of a frontier LLM from a leading AI provider (released June 2025), designed for cost-efficient deployment at scale.

We designate these models as LLM1 and LLM2 throughout this analysis. This distinction is important because both models were released before the malicious domains identified in this research were registered. This confirms that the phantom domains were generated by the models' internal language patterns, not learned from training data. We tested each prompt using three temperature settings (designated below as T) to test the AI responses:

  • Precise (T = 0.1): The model is highly predictable, almost always choosing the most likely next token, resulting in consistent and repetitive answers.
  • Balanced (T = 0.7): This setting mixes predictability with some variability, balancing consistency with a touch of novelty.
  • Creative (T = 1.5): The model selects from a wider range of less likely words, leading to more imaginative and diverse outputs.

We collected all the URLs found in the LLM responses. If the model didn't provide a URL or said it didn't know the answer, we ignored that specific response. This phase ends with a prioritized list of hallucinated domains that we discovered. The value of these domains to an attacker is determined by two main features:

  • Thermal hallucination persistence (THP): This measures how consistently the AI generates the same domain name. Domains that appear even when the AI is set to be very precise are high-value targets. This is because the AI is more likely to show these to real users as if they were facts.
  • Cross-model hallucination consensus: This occurs when different types of AI models all generate the same fictitious domain for the same prompt. If several different models all agree on the same wrong information, it makes that fake domain a much more predictable target for attackers to use.

Verification Pipeline: Multi-Signal Risk Classification

URLs generated by the URL creator agent feed into the verification agent, which assesses multi-signal risk and processes each unique AI-generated URL through an enrichment pipeline that integrates:

  • Threat intelligence: Category and risk verdicts from threat intelligence systems for existing URLs
  • Active content crawling: Capturing live page content and screenshots, which are then analyzed by a suite of deep learning models trained to detect malicious signals for existing URLs.
  • Ownership analysis: Examination of the registrar, registration date, registrant organization, nameservers and privacy status. This data is compared against the legitimate brand's established registration profile.

If a URL exists and exhibits malicious signals, we block it immediately. If a URL shows high-risk indicators, it is flagged for in-line content analysis and added to the proactive watchlist to monitor for changes in registration details or page content. These high-risk indicators include parked pages or insufficient content for a definitive malicious categorization.

We refer to domains not yet registered at the time of analysis as non-existent domains (NXDs). We add these NXDs to a proactive watch list of phantom domains. We then use periodic monitoring of registration event streams to detect when any watchlisted domain is registered.

When a registration event matches a hallucinated phantom domain, an alert is generated and the domain re-enters the verification pipeline for additional analysis. If the newly registered domain proves benign, it is removed from the watch list.

For example, if a legitimate brand registers a domain for defensive purposes or a new product offering, it is considered benign. However, if the ownership or content shows malicious indicators, the domain is assigned a malicious verdict.

Results: Quantifying the LLM Supply Chain Attack Surface for Phantom Squatting

This section quantifies the phantom squatting attack surface, measured at the domain level rather than the URL level. Although our pipeline extracts millions of unique URLs, the registerable attack surface is at domain level.

Each generated URL undergoes DNS resolution to determine whether it resolves to live infrastructure, NXDs or high-risk endpoints. NXD URLs are then normalized to extract the parent registerable namespace. If that namespace is unregistered, it is enrolled in the phantom domain watchlist.

The subsections below characterize the full risk landscape:

  • Confirmed malicious infrastructure served by these models
  • The structural composition of the phantom domain inventory
  • The model and configuration level factors that govern hallucination volume

Dataset Scale

Our analysis encompasses a dataset of 913 global brands including the following sectors:

  • Technology
  • Finance
  • Healthcare
  • E-commerce
  • Government
  • Gambling
  • Logistics

To construct the hallucination corpus, we executed 685,339 adversarial prompts across the LLM1 and LLM2 architectures, yielding 2.1 million unique URLs.

Active Threat Intelligence: Malicious URLs Generated by LLMs

Our discovery pipeline identified that, of the 2.1 million unique URLs produced by the models, threat intelligence systems flagged 13,229 (0.61%) as malicious at the time of analysis.

These results underscore that the risk is not merely theoretical. LLMs are actively recommending known malicious infrastructure to downstream users.

Beyond these confirmed threats, an additional 41,313 URLs (1.90%) were categorized as high risk — including parked domains, adult content and pages with insufficient telemetry — representing nascent infrastructure or opportunistic targets for adversarial registration.

Figure 3 illustrates the threat landscape of confirmed malicious infrastructure generated by these models.

A bar chart displays confirmed malicious URLs. The largest segment, represents Malware with 67.2%. The center of the chart indicates a total of 13,229 malicious URLs.
Figure 3. Threat category breakdown of confirmed malicious URLs hallucinated by LLMs.

Malware represents the dominant category at 67.2%, comprising sites used for drive-by downloads, malicious scripts and exploit-kit delivery. Phishing artifacts (16.2%) encompass credential harvesting portals and brand-impersonation sites targeting the global organizations in our analysis. Grayware (13.7%) includes adware distribution and potentially unwanted program (PUP) installers. Of significant concern, command-and-control (C2) infrastructure accounts for 3.0% of identified URLs — a vector of particular risk for autonomous AI agents that may execute web requests to attacker-controlled endpoints when interpreting LLM-generated instructions.

The Phantom Domain Opportunity

Our pipeline revealed that of the 2.1 million unique URLs in our corpus, 809,455 (37.28%) resolve to NXDs — fictitious endpoints generated by LLMs. These 809,455 NXD URLs collapse into approximately 250,000 unique phantom domains after normalization, each representing a discrete, preemptive registration opportunity for an adversary.

The derivation of this dataset is architecturally significant. Approximately 10.8% of NXD URLs (~87,630) constitute pure domain-level hallucinations, where the LLM fabricates an entirely unregistered root namespace. The remaining 89.2% involve subdomain or path-level hallucinations.

To isolate the registerable attack surface, we extracted the parent domain for each artifact. If the parent was unregistered, we enrolled it in our phantom domain watch list. This extraction methodology reduces the 809,455 URL-level NXDs to a tractable inventory of approximately 250,000 registerable phantom domains.

LLM Model Comparison: Hallucination and Threat Rates

Comparative analysis of the two models reveals markedly divergent hallucination profiles despite evaluation against an identical corpus of prompts. LLM1, the production-optimized enterprise model, exhibited a significantly elevated NXD rate of 44.6% across its 1.2 million unique URLs, approximately 17 percentage points above the 27.5% rate observed for LLM2.

Hallucination volume varies substantially by model architecture. However, the confirmed malicious URL rates remained comparable at 0.64% and 0.56%, respectively, indicating that the susceptibility to generating malicious infrastructure is a consistent risk across disparate training lineages.

A consistent pattern emerges regarding high-risk benign URLs, where LLM1 (2.08%) again demonstrates a higher rate than LLM2 (1.67%). This further confirms that LLM1's increased output volume systematically expands the hallucination surface across all risk tiers, extending beyond confirmed malicious infrastructure.

Figure 4 illustrates the comparative landscape of risk across both LLM architectures. It delineates the NXD hallucination rate, the volume of confirmed malicious URLs and the prevalence of high-risk artifacts identified within the corpus.

A bar chart comparing LLM1 and LLM2 in three categories: NXD Rate, Malicious Rate, and High-Risk Benign Rate.
Figure 4. Comparison of LLM results.

Temperature Configuration and Hallucination Risk

LLM inference temperature, the parameter controlling output randomness, quantifiably influences phantom domain generation rates. Across three configuration modes evaluated uniformly, the Creative configuration (T = 1.5) yielded a substantially elevated NXD rate of 43.10%, compared to 34.64% for Precise (T = 0.1) and 32.52% for Balanced (T = 0.7).

Conversely, malicious URL rates remained statistically stable between 0.57–0.63%, suggesting that adversarial content risk is an intrinsic model property rather than a function of entropy. This structural decoupling confirms that while temperature does not drive malicious intent, it significantly amplifies the total hallucination-based exposure surface.

Figure 5 illustrates the impact of inference temperature configuration on both the NXD hallucination rate and malicious URL rate across the three distinct modes used in our discovery pipeline.

A bar chart comparing hallucination and malicious URL rates across three configurations: Precise, Balanced, and Creative. The NXD Hallucination Rate percentages are Precise at 34.64%, Balanced at 32.52%, and Creative at 43.10%.
Figure 5. Impact of inference temperature configuration on both the NXD hallucination rate and malicious URL rate.

Anatomy of URL Hallucinations

The structural composition of phantom domain hallucinations is not uniform. Within our corpus of 809,455 unique NXD URLs, nearly half (49.7%) manifest as path-level hallucinations, where the LLM constructs a plausible resource path on a legitimate, registered domain that fails to resolve.

An additional 39.5% are categorized as subdomain-level hallucinations — fabricated sub-architectures under existing base domains. The most critical tier, representing 10.8% of the dataset, consists of pure domain-level hallucinations involving entirely unregistered root namespaces.

Analysis reveals divergent behavioral profiles between architectures:

  • LLM1 exhibits a pronounced bias toward path-level extrapolation (56.6%)
  • LLM2 generates a significantly higher proportion of subdomain-level (45.1%) and pure domain-level (20.0%) hallucinations, expanding the registerable attack surface available for adversarial exploitation

Figure 6 illustrates the structural distribution of NXD hallucinations across three architectural tiers: path, subdomain and domain. This provides a comparative visualization for the aggregate corpus and individual model performances.

A bar chart comparing the share of NXD URLs for LLM2 (lite-class), LLM1 (mini-class), and Overall categories. Each category includes the corresponding sample size on the right. Legend at the bottom differentiates levels by color.
Figure 6. URL Pattern distribution of NXD hallucinations across LLM systems.

Evidence of Active Exploitation: Real-World Detection Cases

Aggregate statistics confirm the structural scale of the phantom squatting threat. The following case studies document the real-world manifestation of this vector. These examples demonstrate instances where our discovery pipeline identified a phantom domain prior to adversarial registration for malicious deployment. The case studies are:

  • Impersonation of a postal service's e-commerce marketplace in a phishing campaign using the Montana Empire phishing kit
  • Impersonation of a national postal service to deliver a malicious Android app
  • Four other examples of phantom squatting weaponized in real-world attacks

To quantify this proactive detection advantage, we define the adversarial exploitation window (AEW). This window is the temporal interval between the initial hallucination event and the subsequent registration by a threat actor.

A positive AEW signifies actionable lead time for defenders. A negative AEW signifies that an adversary registered the infrastructure prior to our detection. This provides historical validation of the threat model, confirming that disparate AI architectures and human adversaries independently converged on the same structurally inevitable hallucination.

Montana Empire: AI-Assisted Phishing and the Closed Loop

AEW: 23 days

Target: Customers of a national postal service's e-commerce marketplace

On March 8, 2026, our multi-agent discovery pipeline generated 13 hallucinated URLs for a domain similar to a national postal service e-commerce website across both LLM families and all temperature configurations — including the Precise (T = 0.1) setting. This systemic convergence indicated high Thermal Hallucination Persistence (THP), where the models treated the infrastructure as a near-factual certainty rather than speculative creative entropy. Consequently, the domain was enrolled in the phantom domain watchlist within the same week.

On March 31, 2026 — representing an AEW of 23 days — an adversary registered the domain and deployed a weaponized phishing kit impersonating a legitimate marketplace. Our pipeline achieved same-day detection of the registration event.

Analysis of the attacker’s infrastructure revealed that they developed the phishing kit using an AI coding assistant, evidenced by a project directory identified within the phishing kit ZIP archive. Telemetry from the session logs confirmed the adversary leveraged the assistant to scrape legitimate storefronts, engineer the PHP backend and develop a Telegram-based C2 interface for real-time credential exfiltration.

This case demonstrates the full cycle of the phantom squatting supply chain threat model. The adversary used AI systems to generate attack tooling against infrastructure identified by our discovery pipeline 23 days earlier. Both parties arrived at the spoofed domain via the same mechanism, the LLM’s internal prediction of a structurally inevitable hallucination for the target brand.

The Montana Empire phishing kit features several advanced components:

  • A real-time scraper designed to maintain site parity with live storefronts
  • Dual-channel interception for credit cards and bank transfers, with International Bank Account Numbers (IBANs) rotated via Telegram bot commands
  • Harvesting of national identity document data alongside payment credentials
  • An operator control panel for manual one-time password (OTP) relay and victim adjudication

Table 1 shows the specific domain patterns hallucinated by the models in our analysis.

Prompt Hallucinated URL Model Configuration
“Payment gateway sandbox for the postal e-commerce marketplace integration?” hxxps[:]//sandbox.[redacted][.]com/payment/api/v1/pay LLM2 Balanced (T = 0.7)
“Administrative dashboard for the postal e-commerce marketplace campaigns?” hxxps[:]//admin.[redacted][.]com LLM2 All three configurations, including Precise
“Billing portal for the postal e-commerce marketplace payment method update?” hxxps[:]//billing.[redacted][.]com/ LLM2 Balanced (T = 0.7)

Table 1. Prompts, hallucinated URLs and model configurations.

Figure 7 illustrates the Montana Empire admin panel, with a banner bearing the phrase Kimseye Güvenme (Trust No One). Through this control panel, the attacker managed victim OTP approvals and credential relays via Telegram.

A screenshot of a webpage titled "MONTANA," featuring a login screen with a dark background. Text prompts include “Kimseye Güvenme” and a field labeled “Enter Access Key.” There is a button marked “ENTER THE EMPIRE” and links for "Lost Access" and "User Protocol."
Figure 7. Montana Empire admin panel.

When we recovered the phishing kit file structure from the server of the spoofed domain, we noted an AI coding assistant project directory, indicating that the attacker used an AI tool to develop the kit.

National Postal Service-Themed Delivery of Malicious Android App

AEW: 51 days

Target: Customers of a national postal delivery service

On Feb. 18, 2026, our multi-agent discovery pipeline identified hallucinated URLs for admin.[redacted]post-app[.]com across five distinct model-configuration tiers — including LLM1 at the Precise (T = 0.1) setting. This high degree of convergence led to the parent domain, [redacted]post-app[.]com, being enrolled in the phantom domain watchlist for proactive monitoring.

On April 10, 2026 — representing an AEW of 51 days — an adversary registered [redacted]post-app[.]com and immediately deployed a site that used a pixel-accurate brand clone impersonating the national postal service. The malicious landing page replicated the service’s authoritative aesthetic. It used the same HTML hex color code as the official brand and fabricated social proof (4.8-star rating, over 2 million users) to drive victims to download a malicious Android application package (APK) file named [redacted]post.apk. Our registration event stream achieved detection within hours of infrastructure creation.

While legitimate postal applications are restricted to official marketplaces, this out-of-band delivery bypasses standard platform-level security telemetry.

Additional Detection Cases

Our multi-agent discovery pipeline and subsequent triage verified the following cases shown in Table 2.

Domain Brand AEW Attack Pattern
[redacted]-login[.]com Online sports betting operator 45 days Credential-harvesting clone targeting the Bangladesh market; features explicit local language headings and BDT currency.
[redacted]-es[.]org Competing sports betting operator 40 days Infrastructure registered in an 18-minute coordinated window by the same actor; identical regional targeting and monetization strategy.
[redacted]empresas[.]com Regional European retail bank 35 days Re-registration event detected.
[redacted]business[.]com Major UAE commercial bank -11 months Historical validation of a structurally inevitable hallucination; corporate IT credential harvester using fraudulent branding.

Table 2. Phantom domain detection examples.

A real-world example involving a major bank in the UAE proves that AI models predictably hallucinate the same fake information. On April 1, 2025, a threat actor registered the domain [redacted]business[.]com to steal login details from company database administrators. This campaign had been running for nearly a year. Our pipeline system independently predicted and generated that same fake web address 11 months after it was first used. Our team analyzed this domain through our verification pipeline after detecting that it was being registered again.

Two other examples of phantom squatting in Table 2 reflect the coordinated registration of [redacted]-login[.]com and [redacted]-es[.]org. A single actor registered these domains using identical registrars, nameservers and privacy shielding within an 18-minute window. This demonstrates that phantom squatting is useful for detecting multi-target, orchestrated campaigns.

In this instance, the adversary deployed a unified infrastructure for both domains. Both phishing sites use an identical architectural template, featuring a মেগা জ্যাকপট পুল (Mega Jackpot Pool) display and Bengali-language localized content. By explicitly referencing Bangladesh (বাংলাদেশে) and processing transactions in Bangladeshi Taka (৳), the actor provided definitive attribution signals for a regionally focused, high-velocity operation.

Implications for AI-Powered Supply Chains

Agentic Workflow Risk: Compromising Autonomous AI Pipelines

The highest-consequence phantom squatting target is not a human user. Instead, it is an autonomous AI agent. Agentic systems increasingly execute multi-step workflows that include web fetching, API calls and resource downloads, all based on URLs generated by the LLM orchestrating the pipeline. When an AI agent generates a URL to fetch documentation, retrieve an API schema, or download a dependency, that artifact may resolve to a phantom domain controlled by an adversary.

The impact in an agentic context is amplified by autonomy. A human user who follows an LLM-recommended URL and reaches a phishing page must still take an action by entering credentials, downloading a file or executing code. Conversely, an autonomous agent that fetches a URL and processes its response could exfiltrate secrets, execute malicious instructions or propagate a compromised dependency through a build pipeline without any human decision point.

The 2026 Unit 42 Global Incident Response Report describes an identity-velocity crisis, where attackers compress the window from initial access to exfiltration to under one hour at machine speed. This applies directly to phantom squatting delivered via agentic pipelines.

Developer Tooling Risk: AI Coding Assistants and URL Hallucination in the Software Development Lifecycle

Modern software engineering workflows have integrated AI coding assistants for tasks that fundamentally require URL generation:

  • Retrieving API documentation
  • Identifying package registries
  • Locating webhook endpoints
  • Architecting integration code.

Each interaction represents a potential phantom squatting vector.

The Montana Empire case provides a definitive illustration of this risk convergence. The adversary leveraged an AI coding assistant to engineer a phishing kit targeting the exact phantom domain predicted by the LLM's hallucination patterns.

AI-assisted attack development and LLM-driven attack delivery are no longer disparate phenomena. They represent two dimensions of a single, structurally inevitable adversarial lifecycle.

Conclusion

The risk of phantom squatting is not a theoretical abstraction. Our analysis of 913 global brands and 2.1 million LLM-generated URLs documents a critical supply chain vulnerability:

  • 13,229 confirmed malicious URLs currently being produced by LLMs
  • 250,000 hallucinated phantom domains representing nascent, unregistered infrastructure available for adversarial occupation
  • Real-world threat actor registrations validated via WHOIS analysis, yielding proactive detection lead times of up to 51 days

This vector exploits a structural property of LLM architectures that remains inherently unpatchable. Models trained on human-authored corpora will naturally hallucinate plausible-sounding domains for brands, products and services based on internal linguistic patterns. The phantom squatting attack surface systematically expands with every new LLM deployment, the rise of agentic AI capabilities and the targeting of global brands for adversarial hallucination probing.

The defensive advantage is equally architectural. Because LLMs hallucinate with predictable consistency, defenders can map the hallucination surface and establish a proactive phantom watchlist before an adversary acts. The AEW — the interval between first hallucination detection and registration — provides concrete, actionable lead time that legacy threat intelligence frameworks cannot offer.

Proactive discovery represents the only defensive posture that addresses phantom squatting at its root. By mapping what LLMs will hallucinate and monitoring registration event streams, organizations can respond before weaponization occurs. The capability is established, and the zero-reputation bypass window is open. The critical question is whether defenders or adversaries will act first.

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

  • The Advanced WildFire machine-learning models and analysis techniques have been reviewed and updated in light of the indicators shared in this research.
  • Advanced URL Filtering and Advanced DNS Security identify known domains and URLs associated with this activity as malicious.
  • Prisma AIRS can help secure organizations deploying LLM-powered agentic workflows.
  • Koi Agentic Endpoint Security is designed to help discover every AI artifact across the agentic endpoint, assess its risk, enforce prevention & runtime controls, and remediate violations.

The Unit 42 AI Security Assessment can help empower safe AI use and development.

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Indicators of Compromise

Montana Empire Campaign

The following domains are presented in partially redacted form. Full unredacted indicators are available on request.

SHA256 hash: eb07edaa2786cfddfa4c15526168f2200d85300aee0a8f253b32d2462a7b0bcd
File size: 7,958,528 bytes
File type: ZIP archive
Filename: [redacted].zip (postal e-commerce platform brand name)
File location: hxxp[:]//[redacted][.]com/[redacted].zip
File description: Montana Empire phishing kit archive — comprises a full brand clone of a national postal service's e-commerce marketplace featuring a PHP backend, real-time storefront scraper, credential capture layer and Telegram-based C2 operator control panel.

Related URLs:

  • hxxp[:]//[redacted][.]com/[redacted].zip
  • hxxp[:]//[redacted][.]com/letgovip.zip
  • hxxp[:]//[redacted][.]com/mentalite.php
  • hxxp[:]//[redacted][.]com/panel_track.php
  • hxxp[:]//[redacted][.]com/verify_api.php

National Postal Delivery Service APK Campaign

SHA256 hash: 2202a30daad9928ef47cca5f4ab04ce083692a94428e386fa01c2dd44557e34b
File size: 12,649,472 bytes
File type: APK (Android application package)
Filename: [redacted]post.apk
File location: hxxp[:]//[redacted]post-app[.]com/[redacted]post.apk
File description: Malicious Android APK delivered via a fraudulent mobile app landing page impersonating a national postal delivery service.

Related domain and URL:

  • [redacted]post-app[.]com
  • hxxp[:]//[redacted]post-app[.]com/[redacted]post.apk

Additional Phantom Domain Detections

  • [redacted]-login[.]com
  • [redacted]benefitsportal[.]com
  • [redacted]-es[.]org
  • [redacted]business[.]com
  • [redacted]empresas[.]com

Acknowledgments

The authors would like to thank Shehroze Farooqi, Joseph Pang and Wanjin Li for their valuable insights and contributions in completing this work. The authors would also like to thank Samantha Stallings, Bradley Duncan, Lysa Myers and Shawn He Shuang for their assistance in the editorial process.

Additional Resources

Threat Brief: Mitigating Large-Scale Credential Attacks

Unit 42 is aware of a large-scale password spraying and credential theft campaign (“FortiBleed”) against Fortinet devices. We observed attempts targeting MSSQL devices as well, and have seen reports of Sophos devices also being targeted. While this activity is not targeting Palo Alto Networks devices, Unit 42 has observed suspicious login attempts in customer telemetry and we are providing this report out of an abundance of caution to ensure our customers have the latest intelligence and product recommendations to protect, detect and respond to attacks to their network.

The threat actors are using a curated password list to attempt password spraying against services exposed to the internet. Unit 42 assesses that the initial password list for this activity was likely developed through a mix of previous breaches, including the successful exploitation of vulnerabilities. Once they obtain credentials, they add them to their password list for future attempts against additional targets, as well as for logging into accounts they successfully compromised.

The threat actors are leveraging a multi-stage process to gain persistent, high-privilege access:

  • Password spraying for initial access: Massive internet-wide scanning and password spraying attempts against Fortinet, Sophos and MSSQL services
  • Configuration Extraction: Depending on the permissions of their initial access, the actor may exploit a privilege escalation vulnerability prior to pulling device configuration files, including stored credentials
  • Offline Cracking: Offline password cracking of the stolen credentials adds to the password list used in step one to target new devices, as well as to log into compromised devices to establish persistence as an administrator

Unit 42 observed an initial access broker (IAB) on the Russian-language cybercrime forum Exploit[.]in claiming responsibility for this campaign, referencing a CVE (no further information), and offering the harvested credentials for sale on June 16, 2026. Unit 42 has not validated their claims at this time.

Unit 42 observed an initial access broker (IAB) on the Russian-language cybercrime forum Exploit[.]in claiming responsibility for this campaign of large-scale credential attacks, referencing a CVE (no further information), and offering the harvested credentials for sale on June 16, 2026. Unit 42 has not validated their claims at this time.
Figure 1. Darkweb post of IAB selling credentials.
Unit 42 recommends auditing remote access logs for suspicious activity with a focus on successful logins shortly after large volume password failure events. We also recommend reviewing and implementing the hardening guidance below for edge devices.

SOCRadar provided the initial reporting on the targeting of FortiGate devices. We observed attempts targeting MSSQL devices as well, and have seen reports of Sophos devices also being targeted.

Palo Alto Networks customers receive assistance protecting against and mitigating credential attacks in the following ways:

Palo Alto Networks also recommends the following hardening guidelines:

  • Require MFA: Require strong phishing-resistant multi-factor authentication for all remote services. NGFW customers can integrate several MFA platforms  (including Palo Alto Networks Idira MFA) and customize their Password Profiles and complexity to enhance their security posture.
  • Adopt Zero Trust Architecture: Leverage “jump boxes” and Zero Trust Network Access (ZTNA) policies to ensure management interfaces are never exposed directly to the public internet, further narrowing the attack surface for configuration extraction.
  • Change Default Credentials: Change the credentials for default accounts, ensuring long, complex passwords are used to mitigate the risk of password guessing attempts. Ideally onboard accounts to Privileged Access Management (PAM) system and rotate passwords automatically on-time and on-use.
  • Implement ITDR: Timely detect malicious access attempts and accelerate response with automated identity-centric actions.
  • Disable Unused Accounts: Run continuous discovery of privileged accounts. Onboard and disable unused accounts to limit the attack surface.
  • Update and Patch: Ensure you have the latest software versions and patches installed to mitigate known vulnerabilities, including local privilege escalation vulnerabilities.

The Unit 42 Incident Response team can also be engaged to help with a compromise or to provide a proactive assessment to lower your risk.

Conclusion

Unit 42 will continue to monitor the situation for updated information. We encourage customers to implement the hunting and hardening recommendations to identify, mitigate, and prevent credential attacks against their networks.

Palo Alto Networks has shared our findings with our fellow Cyber Threat Alliance (CTA) members, including Fortinet. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Palo Alto Networks customers are better protected by our products, as listed below. We will update this threat brief as more relevant information becomes available.

Palo Alto Networks Product Protections and Consulting Services

Palo Alto Networks customers can leverage a variety of product protections and consulting services to identify and defend against this threat.

If you think you might have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Deep and Darkweb Monitoring  

Unit 42's Deep and Dark Web (DDW) monitoring is a service that assists clients in identifying sensitive information and leaked credentials that surface on the dark web, providing critical insights to reduce risk exposure and reduce the time between detection and response.

Cortex Cloud

Cortex Cloud Identity Security encompasses Cloud Infrastructure Entitlement Management (CIEM), Identity Security Posture Management (ISPM), Data Access Governance (DAG) as well as Identity Threat Detection and Response (ITDR) and provides clients with the necessary capabilities to improve their identity related security requirements. By providing visibility into cloud based identities, and their permissions, Cortex Cloud can detect misconfigurations, unwanted access to sensitive data and real-time analysis surrounding usage and access patterns. Additionally, Cortex Cloud provides protections against credentials that were compromised, lost or exposed being leveraged against cloud resources, such as those discussed within this article.

Idira Identity Threat Protection

Idira Identity Threat Protection (ITP) enables security teams to counter identity-based attacks targeting Idira Next Generation Identity (NGI) Platform and the identities it secures. Using near real-time detection, powered by CORA AI, and leveraging Idira’s visibility across multiple contexts (like PAM, authentication, SSO, cloud, endpoints, browsers, and more), Idira ITP can apply automated, tailored non-disruptive in-session response to contain and minimize potential identity-based threats.

Idira MFA

Idira MFA helps protect organizations against password spraying, credential theft, and other identity-based attacks by verifying that the person signing in is the legitimate user, not just someone with a valid password. Using phishing-resistant MFA, including passkeys, biometrics, and FIDO2 security keys, along with adaptive, risk-based authentication, Idira evaluates signals such as device trust, location, and login behavior. When risk is detected, it requires additional verification before granting access, helping prevent account compromise while keeping access simple for trusted users.

Idira Privileged Access Management

Idira Privileged Access Management is a SaaS-delivered Privileged Access Management (PAM) solution that mitigates credential compromise and password spraying by prioritizing automated discovery, onboarding, and rotation. The platform continuously scans hybrid environments and infrastructure to detect unmanaged local, domain, service accounts and cloud roles. Discovered credentials are automatically onboarded into a hardened digital vault for centralized management. Privilege Cloud then enforces programmatic transactional credential rotation using complex, randomized strings. This eliminates the static, predictable passwords exploited during spraying attacks, removing standing privileges and blocking lateral movement across the network infrastructure and devices.

References

Updated June 26, 2026 at 1:00 p.m. PT to add product protection for Idira Security and Cortex Cloud, and more information to the hardening guidelines section.

CL-STA-1062 Targets Southeast Asian Governments and Critical Infrastructure

Executive Summary

Throughout 2025, we observed a cluster of activity targeting government entities and critical infrastructure in Southeast Asia. Specifically, the activity targeted state-owned enterprises in the energy and government sectors.

The Chinese-speaking attackers behind this cluster, which we track as CL-STA-1062, have been active since at least March 2022. We assess with high confidence that this is the same cluster, known as UAT-7237, that was reported for its campaigns against web hosting infrastructure in Taiwan in mid 2025. We also observed CL-STA-1062 campaigns in earlier operations targeting strategic sectors in East Asia, indicating a broader, sustained regional focus.

From a technical standpoint, the attackers behind CL-STA-1062 rely on a hybrid toolkit. While they frequently use common open-source tools such as SoftEther VPN, Mimikatz and VNT, they have recently introduced TinyRCT, a bespoke, previously undocumented backdoor.

TinyRCT’s capabilities include:

  • Arbitrary command execution
  • File enumeration and exfiltration
  • Screen capture
  • A self-destruct mechanism

We detail the latest campaign linked to CL-STA-1062 against the energy and government sectors in Southeast Asia, and provide a technical analysis of the new TinyRCT backdoor.

Palo Alto Networks customers are better protected from the threats discussed above through the following products and services:

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics CL-STA-1062, Malware, Backdoor, VPN, Mimikatz

Latest Campaign Analysis

While this article focuses on CL-STA-1062 activity against targets in Southeast Asia during 2025, our telemetry reveals that the attackers behind this cluster have been conducting operations across East Asia since 2022. We assess with high confidence that this is the same activity cluster tracked by Cisco Talos as UAT-7237, previously reported for its campaigns against web hosting infrastructure in Taiwan. Building on recent observed activity, our investigation into CL-STA-1062 activity highlights a broader long-term strategy in the Asia-Pacific region.

Targeting Southeast Asian Government Entities

In September 2025, we discovered that the attackers behind CL-STA-1062 had compromised a Southeast Asian government entity by deploying web shells and exfiltrating database information. Figure 1 shows the command line used to exfiltrate data from an MSSQL server.

A screenshot of a command line interface displaying a SQL Server command, involving querying a database with private credentials and outputting results to a file.
Figure 1. Exfiltrating data from the MSSQL server.

During this intrusion, the attackers were also able to conduct network reconnaissance on a separate government entity in the same country. This suggests an effort to identify lateral movement opportunities and broaden their access. In one case, we observed the attacker staging and exfiltrating an entire directory of web server source code from the government entity, as Figure 2 shows.

A screenshot of a command line interface displaying a WinRAR command to archive files from the directory "backup" into a compressed file named "web.rar" in the "c:\" directory.
Figure 2. Archiving the folder containing the web server source code.

Between October and December 2025, we observed the likely compromise of at least ten different organizations in Southeast Asia.

Focusing on Critical Energy Infrastructure

Since mid 2025, as part of activities in Southeast Asia, the threat actor behind CL-STA-1062 focused on critical infrastructure. We identified that a critical infrastructure entity had been under attack for several months. The activity within the compromised network was comprehensive, covering the entire attack lifecycle from initial access to data exfiltration.

The following month, we discovered that the attackers behind CL-STA-1062 had also compromised two state-owned critical energy infrastructure (CEI) entities in the same Southeast Asian country. We observed attackers scanning the entities for vulnerabilities, shortly followed by outbound requests from the infected networks. These requests connected to attacker-controlled infrastructure and resulted in the victim networks downloading malicious payloads that included SoftEther VPN components and RAR archives containing the group's tools.

Figure 3 shows HTTP requests that download the attackers’ tools to the targeted networks.

A screenshot of a document lists several file paths from an IP address, each followed by different file names and extensions. Notable names include "fscan" and "SoftEther," both highlighted in red.
Figure 3. Examples of outbound requests from an infected network.

Evolving TTPs and Open-Source Toolkit

The intrusions we observed typically begin with the attackers exploiting web applications to deploy ASPX web shells. These web shells function as the central mechanism for executing arbitrary commands, dropping additional tooling and conducting initial reconnaissance. As part of our observations of CL-STA-1062, we noted activity sending the results of network and system enumeration directly to an actor-controlled IP address using curl. Figure 4 shows an example of the command lines used.

A screenshot displaying a series of PowerShell commands that execute system information queries and use `curl` to send the results to an external IP address via HTTP POST requests. The commands include checks for system identity, IP configuration, and domain admins.
Figure 4. System enumeration command lines.

From this foothold, the activity includes open-source tools and custom malware. The attackers also adapt techniques to the target environment.

The attackers behind the activity frequently use tunneling tools for command and control (C2) and data exfiltration. They deployed a variety of these tools, including:

These tools were often disguised as legitimate system files, such as VMware executables or an XDR agent. Figure 5 shows the command line used by the group to execute a yuze instance.

A screenshot showing a terminal command snippet reverse engineering process on a local server.
Figure 5. yuze command-line execution.

In one case, the attackers used a web shell to extract a password-protected RAR archive containing a SoftEther VPN binary masquerading as vmtools.exe. Figure 6 shows the extraction and execution of the SoftEther VPN binary.

A screenshot of a command prompt window showing a sequence of commands related to VMware.
Figure 6. Extracting and executing SoftEther VPN.

In another case, the attackers attempted to disguise VNT as a VMware executable, as shown in Figure 7.

A screenshot of a command prompt window with a command involving Windows Task Scheduler to locate and execute VMWare's vmwared.exe file with highest priority upon system login.
Figure 7. Creating a scheduled task to execute a VNT binary.

In one instance, the attackers used traceroute to identify potential lateral movement paths to another government entity. To escalate privileges, the attackers deployed known open-source tools, such as JuicyPotato. For data staging and exfiltration, they frequently compressed findings into password-protected RAR archives.

ֿTechnical Analysis of TinyRCT

During our investigation into the campaign's infrastructure, we observed the server at 139.180.134[.]221 hosting a suspicious executable named PerfWatson2.exe. By pivoting on this IP address, we were able to retrieve and analyze the binary, identifying it as a previously undocumented .NET backdoor. Analysis of the binary's internal strings revealed that the authors refer to this tool as TinyRCT.

TinyRCT is a lightweight, C#-based remote access Trojan (RAT) targeting Windows. It operates as a backdoor, enabling attackers to execute arbitrary system commands, exfiltrate files, capture screenshots and remotely manage the infected host.

Upon execution, the malware performs an environment validation to explicitly verify that it was executed from %LOCALAPPDATA%. If the malware was executed from any other location – such as a sandbox environment or a malware analyst’s desktop – the binary terminates immediately.

The execution of TinyRCT can be blocked by implementing strict behavioral monitoring and execution restrictions on untrusted binaries. Figure 8 shows how an execution attempt by the TinyRCT malware, masquerading as PerfWatson2.exe, is prevented and alerted by Cortex XDR.

A screenshot of Cortex XDR security alert. It indicates that a malicious activity has been blocked. The application name is identified as a suspicious executable. The alert provides application details, including publisher information and file origin on the user's hard drive. There are two buttons labeled "Hide details" and "OK".
Figure 8. A prevention alert of blocking the TinyRCT malware execution attempt as seen in Cortex XDR in prevent mode.

Host Fingerprinting and Registration

Before entering its main command loop, TinyRCT conducts initial reconnaissance to fingerprint the infected host. It aggregates critical system information to generate a unique victim profile, collecting the following data points:

  • User and system context: Current username, machine name and OS version.
  • Network and execution: Local IP addresses, the complete execution path of the malware and the current process ID (PID).
  • Identity: A randomly generated globally unique identifier (GUID) to serve as the bot's identifier.

This data is concatenated, encrypted and immediately transmitted to the C2 server via an HTTP POST request. This registration packet allows the attacker to profile the newly infected host and decide whether to issue further commands or terminate the infection based on the host's assessed value.

C2 Communication

After successful registration, TinyRCT establishes a persistent communication channel with the C2 server at 45.32.113[.]172. The malware uses standard HTTP for network traffic, but it encrypts all exchanged data using AES-128 encryption in CBC mode. The encryption key (ThisIsASecretKey87654321) and a null Initialization Vector (IV) are hard-coded directly within the binary.

The malware operates on a beaconing model, with a default 10-second sleep interval between requests. It polls the C2 server for instructions using GET requests, while it sends exfiltrated data via POST requests.

Supported Commands and Capabilities

The backdoor is designed for surveillance and remote management and executes a concise set of commands. When the C2 server responds to a beacon, the malware decrypts and parses the payload, and then executes the appropriate commands from the following functions:

  • Shell execution: Executes the command via cmd.exe (or direct process execution) and returns stdout/stderr.
  • Update configuration: Updates the sleep interval.
  • File listing: Enumerates directories and files in the specified path. Returns format: Filename*Date*Size.
  • Read text file: Reads a text file and returns content.
  • Download file: Downloads a file from a URL and saves it to the desired path.
  • Exfiltrate file: Reads a binary file from the requested path, compresses its contents using gzip, encrypts them using AES and sends them to the C2 in 40 KB chunks.
  • Screen capture: Captures the primary screen, saves the capture as a JPEG file, compresses it, encrypts it and sends it to the C2.
  • Self-destruct: Triggers the cleanup routine.

Figure 9 shows the C2 server response parsing function of TinyRCT, including a line of code in Simplified Chinese.

A screenshot of a code snippet written in C#. The code defines an asynchronous task function named "ResolveData" that works with strings and encryption settings. There are conditional statements to match specific patterns and decrypt AES encrypted data. A red arrow with text in Chinese, translated as "Result of command execution," points to a console write line command.
Figure 9. The C2 response parsing function of TinyRCT.

Self-Destruct Mechanism

A notable feature of TinyRCT is its cleanup capability, triggered by the self-destruct command. This routine is designed to remove forensic evidence of the infection.

Upon receiving the self-destruct command, the malware first deletes the GoogleUpdater scheduled task created by the loader. It then executes a self-deletion routine using a legacy batch command technique involving the choice.exe program. This routine deletes the malware’s PerfWatson2 executable, as Figure 10 shows.

A screenshot of a command line interface displays a script executed using "choice" and "Del" commands. The script targets deletion of a file.
Figure 10. The complete choice.exe command line.

The use of choice.exe creates a three-second delay, ensuring the primary malware process has fully terminated and released its file handle before the delete command executes.

Infection Vector

Our analysis began with the discovery of the PerfWatson2.exe payload hosted on the attacker’s C2 infrastructure. By pivoting from this artifact, we reconstructed the infection chain, identifying its origin as a malicious archive named chrome_setup.zip.

Inside the zip were three files:

  • A legitimate executable
  • A configuration file
  • A malicious DLL

This specific combination of files is used to perform AppDomainManager Injection – a technique that exploits the trust relationship between a .NET application and its configuration file. The archive contains a legitimate, signed chrome_setup.exe executable paired with a malicious chrome_setup.exe.config configuration file.

When the user runs the executable, the .NET runtime reads the adjacent configuration file. This forces the loading of a malicious DLL (MyAppDomainManager.dll) to act as the application's manager. This allows the malicious code to execute instantly and covertly within the context of a trusted process.

Once injected into the legitimate setup process, the malicious MyAppDomainManager.dll functions primarily as a stealthy downloader and persistence enabler.

Upon initialization, the malicious loader runs a critical environmental check to validate its execution context. It explicitly verifies that the host process is running from %USERPROFILE%\Downloads — the user’s Downloads directory. If this check fails, it likely indicates the sample was moved to a sandbox or an analyst's desktop, and the loader terminates immediately. Figure 11 shows this check in the loader source code.

A snippet of C# code checks if the current directory contains a Downloads folder within the user's profile directory using "GetEnvironmentVariable".
Figure 11. The loader's initial environment check.

If the validation passes, the loader contacts the staging server at 139.180.134[.]221 to retrieve the secondary payload. The loader saves this payload to the user’s %LOCALAPPDATA% directory as PerfWatson2.exe, mimicking the legitimate telemetry component associated with Microsoft Visual Studio.

To ensure this payload runs continuously without user interaction, the loader constructs and executes a specific schtasks command. This command creates a scheduled task named GoogleUpdaterTaskSystem140.0.7272.0 {ACE7A46F-50FD-481C-AB32-3D838871DB40}. The task is configured to run the malware with the highest available privileges (e.g., /rl highest) every time the user logs on to the system (e.g., /sc onlogon). This ensures that the infection survives system reboots.

Conclusion

Our investigation into CL-STA-1062 reveals a persistent activity cluster likely operated by Chinese-speaking actors. The attackers are expanding operations from Taiwan to critical infrastructure and government entities in Southeast Asia. They demonstrated their ability to infiltrate strategic sectors – specifically energy and government organizations.

The combination of tools observed in this activity cluster reflects a pragmatic approach to tool selection and attack capabilities. The attackers behind this cluster continue to leverage common open-source tools such as SoftEther VPN and VNT to facilitate lateral movement. Our discovery of the TinyRCT backdoor in the attackers’ infrastructure underscores their ability to customize tools to gain specific capabilities.

The combination of targeting critical infrastructure and the development of custom malware suggests that CL-STA-1062 activity will continue to pose a threat to the region. Organizations in Southeast Asia, particularly within the energy and government sectors, should remain vigilant against this evolving activity.

Palo Alto Networks Protection and Mitigation

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

  • Cortex XDR and XSIAM help to prevent the threats described in this article, by employing the Malware Prevention Engine. This approach combines several layers of protection, including Advanced WildFire, Behavioral Threat Protection and the Local Analysis module, to prevent both known and unknown malware from causing harm to endpoints.
  • The Advanced WildFire machine-learning models and analysis techniques have been reviewed and updated in light of the indicators shared in this research.
  • Advanced URL Filtering and Advanced DNS Security identify known domains and URLs associated with this activity as malicious.

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Indicators of Compromise

SHA256 Hashes

chrome_setup.zip file:

  • 00e09754526d0fe836ba27e3144ae161b0ecd3774abec5560504a16a67f0087c

fscan:

  • f34bd1d485de437fe18360d1e850c3fd64415e49d691e610711d8d232071a0b1

SoftEther VPN:

  • dce5df29bddff5a4ddaea5c4fec14da91f7b69063a6e1c45ed61e5da4fc6c87b

TinyRCT downloader:

  • cbfe8de6ffadbb1d396f61e63eb18e8b11c29527c1528641e3223d4c516cf7c3

TinyRCT:

  • 4e1f8888d020decd09799ec946f1bf677cac6612b24582ddbf4d8ede425d8384

VNT:

  • 9b481b69cd91b09fa7bae7428f646dd89473a4c03393e43da81fe756cde1c472

C2 Servers

IPv4 addresses:

  • 139.180.134[.]221
  • 202.182.102[.]5
  • 45.76.210[.]43
  • 45.32.113[.]172

URLs:

  • hxxp[:]//139.180.134[.]221/sdksdk608/1.zip
  • hxxp[:]//139.180.134[.]221/sdksdk608/anydesk%5f0117.zip
  • hxxp[:]//139.180.134[.]221/sdksdk608/hamcore.se2
  • hxxp[:]//139.180.134[.]221/sdksdk608/httpdf
  • hxxp[:]//139.180.134[.]221/sdksdk608/vpn%5fbridge.config
  • hxxp[:]//139.180.134[.]221/sdksdk608/win-vpn.rar
  • hxxp[:]//139.180.134[.]221/PerfWatson2.exe

Additional Resources

OpenClaw’s Skill Marketplace and the Emerging AI Supply Chain Threat

Executive Summary

OpenClaw is an AI agent that executes third-party skills from ClawHub, its dedicated marketplace. Skills are markdown-driven packages with broad local system access, making ClawHub a critical link in the agentic software supply chain.

Following its release, the ecosystem saw several malicious campaigns. Those early findings, published in February 2026, prompted ClawHub to integrate VirusTotal and ClawScan, enabling proactive screening of published skills and code-level analysis to block skills flagged as malicious from download.

However, our analysis from February-May 2026 revealed persistent and evasive malicious skills on ClawHub. We identified five unblocked skills.

We reported all five to ClawHub for takedown. OpenClaw banned the accounts mentioned and deleted all of the skills.

The five skills represent three distinct threat categories leveraging the AI supply chain ecosystem:

  • Infostealers: Two skills delivered macOS infostealers. Both connect to command-and-control (C2) infrastructure, indicating persistent threat actor activity.
  • Evasion: One skill has an inflated file size to exceed scanner thresholds, bypassing both ClawScan and VirusTotal detection.
  • Agentic threats: Two skills represent agentic threats: runtime agentic affiliate injection and agentic front-running. Both are novel techniques that the skill authors used for financial gain.

OpenClaw is now also collaborating with NVIDIA to provide documentation of what each skill does, and to run NVIDIA’s analysis tool on all skills.

Palo Alto Networks customers are better protected from the threats discussed above through the following products and services:

The Unit 42 AI Security Assessment and Unit 42 Frontier AI Defense service can help identify and mitigate complex AI-specific risks.

If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team.

Related Unit 42 Topics Agentic AI, OpenClaw, ClawHubSupply Chain, Infostealer

AI Agent Skills as a Supply Chain Attack Surface

Software supply chain attacks typically rely on compromising distribution vectors or spoofing dependencies. However, AI agent ecosystems have altered this paradigm, and their threat model differs from previously established ecosystems like npm or PyPI. While conventional malware often faces limitations from language runtimes or containers, malicious skills use semantic instruction hijacking to bypass technical constraints.

By misusing the AI’s natural language interpretation, malicious skills can exploit the agent's operational context, including file systems, shells and credential managers, without requiring a conventional exploit. The lack of isolation between skill logic and agent authority means that installation results in complete control over the agent's identity. This allows a malicious skill to perform unauthorized actions through the agent’s own authenticated sessions.

Early Campaign Activity on ClawHub

In early February 2026, Bitdefender Labs reported that approximately 17% of OpenClaw skills they analyzed in the first few weeks of the platform's release carried malicious payloads. Koi Security's ClawHavoc disclosure documented 341 malicious skills, and Trend Micro separately confirmed skills distributing Atomic macOS stealer (AMOS) malware across the marketplace.

This early wave featured several distinct techniques:

  • Base64-encoded curl-pipe-bash dropper: These skills embedded a fake prerequisite block that instructed the agent to decode and execute a Base64-encoded remote payload, typically fetched from 91.92.242[.]30, the IP address for an AMOS C2 server.
  • Platform-specific delivery: For macOS targets, paste-site redirects (glot[.]io, rentry[.]co) served as an intermediary step, allowing attackers to update payloads without modifying the published skill. Attackers directed Windows targets to password-protected executables hosted on third-party hosting services.
  • ​​Persistence via auto-updaters: Auto-updater skills combined the initial dropper with scheduled cron job registration, ensuring the C2 channel persisted even after skill removal.
  • Alternative exfiltration channel: A distinct cluster (polymarketbtc, polymarketbtcassistant and related skills published by krajekisbtc) exfiltrated cryptocurrency private keys via the Telegram Bot API, a C2 channel independent of the shared dropper infrastructure.
  • Registry saturation: A single publisher account injected malicious payloads into the majority of their published skill catalog with identical payloads to maximize installation surface before detection.

Those findings prompted ClawHub to partner with VirusTotal, enabling proactive screening of published skills. These skills from these early campaigns have since been removed from the marketplace or marked as malicious.

In the following sections, we document the state of the marketplace between February and May 2026, during which VirusTotal and ClawScan served as the primary screening mechanisms.

(On June 1, ClawHub also announced a partnership with NVIDIA to help screen published skills.)

The AMOS dropper infrastructure from earlier campaigns remains active more than three months after first public disclosure, with the C2 server at 91.92.242[.]30 continuing to receive new skill deliveries. Additionally, we observe novel attacks that adapt to and exploit skill marketplaces, leveraging the agentic execution model to implement financial schemes that evade some kinds of malware detection.

Malicious Skills Distributing ClawHavoc Payload

Publisher/Skill: [redacted]/tradingview-ai-indicator-assistant

SHA256 hash: b6c7e0bf573b1c7d9d3a05eb08d26579199515b847df984862805f44a7af8007

On May 17, 2026, the account published two skills targeting TradingView users as shown in Figure 1.

A screenshot of ClawHub marketplace displaying instructions for setting up AI indicators and a TradingView assistant. The top section outlines installation instructions for "AI Indicators for TradingView Setup Assistant". The bottom section describes the "AI TradingView Assistant for macOS," with installation steps and a download count. Both sections have information about the owner, "clawcode," and respective status labels, with one as "Pass" and the other "Review.
Figure 1. ClawHub marketplace listings for two TradingView assistant skills.

Both of these skills presented as AI assistants for macOS, posing as productivity tools for traders. Both embedded the same malicious prerequisite block, which prevented the skills from functioning until the user performed a required action. In this case, the prerequisite block directed agents to a site with malicious instructions to copy and paste text into a terminal window. We refer to this site as a paste-site redirect lure.

The paste-site redirect lure at hxxps[:]//rentry[.]co/openclaw-code served instructions with a Base64-encoded string for the prerequisite block, which the agent must run before the skill can continue. Figure 2 below shows an example of this page.

"A screenshot of a webpage showing instructions to run a command in Terminal. Header reads ""READ FULL."" Step 1 advises to open Terminal via Command + Space and pressing Return. Step 2 provides a Terminal command to decode a Base64 string. An arrow points to the translation of the Base64 text into a curl command with a URL.
Figure 2. Paste-site redirect lure.

When the agent performed the actions in the paste-site redirect lure, the associated command fetched a payload from hxxp[:]//2.26.75[.]16/Xuvewuyur. That payload was a macOS infostealer named cluw with a SHA256 hash of 818aea6143282b352fdfdc0f3ebf77a36e54eb3befb5cad1a355a99ab97c6aa7.

The delivery mechanism is structurally identical to the ClawHavoc campaigns documented by Koi Security and Trend Micro. The prerequisite block, the paste-site redirect lure and the Base64 pipe to bash all match the early-wave pattern.

The C2 server we discovered at 2.26.75[.]16 differs from prior disclosure. The cluw payload differs from AMOS. This campaign used the established delivery template with fresh backend infrastructure.

Until mid-May, ClawHub's automated auditing returned a verdict of Pass for ai-tradingview-assistant-for-macos and no verdict for tradingview-ai-indicator-assistant. Neither skill triggered detection, despite containing a verbatim paste-site prerequisite lure. This structural pattern characterized over 300 skills in the original ClawHavoc disclosure.

File Padding for Defense Evasion

Publisher/Skill: [redacted]/omnicogg

SHA256 hash: b30eaed1f7478c28f4ec50d07ed5ef014ffbc4b2bc5a38d689ba9f7abb5e19c2

The omnicogg skill was an early-wave threat, similar to those that defined the initial surge of malicious activity on ClawHub. It is a Base64-encoded curl-pipe-bash dropper that delivered the AMOS malware via 91.92.242[.]30, the same C2 infrastructure documented in earlier campaigns.

This skill is distinguished by its delivery vessel, a README.md file. The malicious payload appears at the start, followed by 22 MB of padding characters. This padding inflates the file size beyond the limits that many content-analysis pipelines enforce before declining to process a file. Figure 3 below shows an example of the padding characters in this file.

A screenshot of a terminal window with a command related to installing MacOS. The command is followed by a long string of encoded text, primarily featuring the characters 'U', 'b', and '='.
Figure 3. The omnicogg skill’s README.md file.

JFrog Security Research disclosed this skill in March 2026. This evasion technique can be effective because many scanning pipelines skip abnormally large files rather than process them.

This skill's ClawScan audit was in review in mid-May, while VirusTotal returned a clean verdict, and the skill remained available for download, as shown in Figure 4. Scanners that do not analyze content beyond standard thresholds will miss payloads structured to exploit that weakness.

A screenshot of OmniCog's webpage showing service integration for platforms like Reddit, Steam, and Spotify. The page displays audit results: ClawScan and Static analysis both have "Pass" statuses, and VirusTotal shows "Pass" for multi-engine malware detections.
Figure 4. ClawHub audit page for [redacted]/omnicogg shows an overall pass despite containing malicious code..

Runtime Agentic Affiliate Injection

Publisher/Skill: [redacted]/money-radar

SHA256 hash: ebb73dbb5aac1f6fe1a88e8f26126a1e1aa34c9f3345ad4345189b40d9bf1d1d

This ClawHub campaign focused on financial communities, with skills that targeted banking and crypto exchange workflows. This money-radar skill presented itself as an overseas financial product advisor that compared brokerages, banks, crypto exchanges and remittance services for users in mainland China, Hong Kong and Singapore. However, its core logic was an affiliate funnel for developer profit.

The skill weaponized the agent's advisory authority, routing all financial recommendations through affiliate links from a known-malicious domain. The publisher retained dynamic control over which products it pushed after installation.

Technical Analysis

The skill's mandatory first action on every invocation was to fetch product data from laosji[.]net, a domain previously observed in paste-jacking campaigns. Figure 4 shows an example of this action within the skill's SKILL.md file.

A screenshot of code in a text editor. The code block uses Python to fetch and load JSON data from a URL using 'curl' and involves importing 'json' and 'sys' modules.
Figure 5. The money-radar skill's SKILL.md instructs the agent to fetch data from laosji[.]net.

The agent ingested a referrals.json payload from laosji[.]net as a precondition to answering any financial question. That payload contained approximately 60 products across eight categories, each with a referralLink field carrying affiliate tracking. The SKILL.md file then issued an explicit instruction to always use the referral links as shown in Figure 6.

A screenshot of a document written in Chinese with highlighted text and an English translation in a note. The note points to the highlighted term "referralLink" and reads: "English translation: 'referralLink' includes referrer tracking; always use the provided link."
Figure 6. The money-radar skill's SKILL.md file with the affiliate link instruction highlighted and translated.

Once the skill was installed, the publisher dynamically controlled the links the agent would recommend by updating referrals.json on laosji[.]net. The operator could change which products were recommended, rotated affiliate partners or redirected victims toward higher-commission offerings without the victim’s involvement. This exploitation constitutes an agent-specific form of runtime affiliate injection.

Unlike typical affiliate injection, which intercepts links the target was already clicking, this skill generated the recommendation itself. The affiliate link arrived embedded in what appears to be skill-based expert advice.

Agentic Front Running

Publisher/Skill: [redacted]/letssendit

SHA256: hash f4e41aa269c88bf11a2022701a9cf41e9a186aa1b224d837c31bf34e0b875d0e

The letssendit skill implemented an agentic front-running scheme. This scheme involved the skill operator misusing the ClawHub platform to illegitimately profit from meme token launches. It achieved this by leveraging numerous AI agent participants and coordinated agentic execution.

The coordinated activity executed on infrastructure using the domain letssendit[.]fun. Guided by the skill's SKILL.md file instructions, installed agents autonomously pooled Solana blockchain platform cryptocurrency (SOL) into the operator's digital wallet. Once enough agents had joined, the operator would front-run the distribution by purchasing the SENDIT meme token at the lowest bonding curve price before allocating any to the agents.

The token then launched publicly on the cryptocurrency platform pump[.]fun, where external buyers could mistake the coordinated AI botnet activity for organic retail demand. This could create a classic rug pull. The operator simply rotates wallets across multiple confirmed launches, dumping their low-cost position into the artificial market rally at the expense of secondary market buyers.

Ultimately, this exploit represents a novel documented case of an attacker weaponizing an autonomous AI agent network to execute a pump-and-dump scheme. This behavior constitutes fraudulent financial activity. We strongly recommend that enterprises block this skill across their AI infrastructure to mitigate regulatory and security risks.

Conclusion

The cases documented in this article span evasion, deceptive monetization, financial fraud and campaign persistence. Each case passed existing detection tools at the time of our analysis.

Organizations can strengthen their defensive posture by using a rigorous supply chain verification framework. We identified that skill execution occurs within the agent process. This necessitates active validation of publisher provenance and a line-by-line audit of package source files.

Our research indicates that monitoring outbound network traffic can identify post-installation communication with undocumented endpoints. We recommend cross-referencing all external connections against the provided documentation. Any discrepancies serve as observable indicators of risk. These verification steps help protect an organization’s environment by ensuring that the operational behavior of a skill aligns strictly with its stated technical specifications.

Palo Alto Networks Protection and Mitigation

Palo Alto Networks customers are better protected from the threats discussed above through the following products:

  • Koi's Agentic Endpoint Security (AES) gives security teams a single platform to discover every AI component across the agentic endpoint, assess its risk, enforce policy, and remediate violations - so your end users adopt the latest technology, increase the org productivity without compromising on security.
  • Advanced URL Filtering and Advanced DNS Security identify known domains and URLs associated with this activity as malicious.
  • Prisma Browser Prisma Browser provides additional protection layers against advanced web threats including dynamic scans of every loaded web page, to prevent execution of malicious content and protect company assets.
  • The Advanced WildFire machine-learning models and analysis techniques have been reviewed and updated in light of the indicators shared in this research.
  • Cortex XDR and XSIAM are designed to prevent the execution of known malicious malware, and also prevent the execution of unknown malware using Behavioral Threat Protection.

The Unit 42 AI Security Assessment and Unit 42 Frontier AI Defense service can help identify and mitigate complex AI-specific risks.

If you think you may have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call:

  • North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42)
  • UK: +44.20.3743.3660
  • Europe and Middle East: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japan: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 000 800 050 45107
  • South Korea: +82.080.467.8774

Palo Alto Networks has shared these findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance.

Acknowledgments

We’d like to thank the entire Unit 42 team for supporting us with this article. Special thanks to Samantha Stallings, Bradley Duncan and Lysa Myers for helping us review this article.

Indicators of Compromise

Domains, IP Addresses and URLs

  • 2.26.75[.]16
  • 91.92.242[.]30
  • 91.92.242[.]30/lamq4
  • download.setup-service[.]com
  • github[.]com/Ddoy233/openclawcli
  • glot[.]io/snippets/hfd3x9ueu5
  • install.app-distribution[.]net
  • laosji[.]net
  • openclawcli.vercel[.]app
  • rentry[.]co/openclaw-code

Publisher/Skill

  • [redacted]/santi-text-game
  • [redacted]/omnicogg
  • [redacted]/letssendit
  • [redacted]/money-radar
  • [redacted]/ai-tradingview-assistant-for-macos
  • [redacted]n/tradingview-ai-indicator-assistant
  • [redacted]/pdfcheck
  • [redacted]/update
  • [redacted]/wistec-core

SHA256 Hashes

  • 818aea6143282b352fdfdc0f3ebf77a36e54eb3befb5cad1a355a99ab97c6aa7
  • 881ce5cb124c4d2e814783724cc1388f6a1cbf6eee274c3f3366e77ba3503ad7
  • b30eaed1f7478c28f4ec50d07ed5ef014ffbc4b2bc5a38d689ba9f7abb5e19c2
  • b6c7e0bf573b1c7d9d3a05eb08d26579199515b847df984862805f44a7af8007
  • ebb73dbb5aac1f6fe1a88e8f26126a1e1aa34c9f3345ad4345189b40d9bf1d1d
  • f4e41aa269c88bf11a2022701a9cf41e9a186aa1b224d837c31bf34e0b875d0e

Additional Resources