Happy 9th Anniversary, CTA: A Celebration of Collaboration in Cyber Defense

The Genesis of Collective Defense

At certain moments in a career, you get the rare opportunity to look back and say, this work mattered. Not because of an individual accomplishment, but because it contributed to something larger — something that changed how an industry thinks and operates. The Cyber Threat Alliance (CTA) is one of those efforts.

When the CTA was first conceived in 2014, the cybersecurity industry looked very different than how it does today. Threat intelligence was widely viewed as a competitive advantage, tightly guarded and rarely shared beyond company walls. Collaboration between major security vendors — especially direct competitors — was almost unheard of. The prevailing mindset was simple: information was power, and power was proprietary.

Against that backdrop, a bold idea emerged: What if competitors worked together for the collective defense of customers and the broader digital ecosystem? What if sharing high-fidelity threat intelligence could raise the cost for adversaries and make everyone safer? As Mark McLaughlin, then CEO of Palo Alto Networks, famously put it at the time, the importance of the future CTA was clear: “Don’t let this fail.”

With that charge, four industry leaders — Palo Alto Networks, Fortinet, McAfee (Intel Security) and Symantec — came together on a handshake agreement to prove that collaboration at scale was not only possible, but necessary. It was, by any measure, a radical idea. Yet those early conversations laid the foundation for what would become the Cyber Threat Alliance.

The Architecture of Trust: Turning Vision into Reality

Turning that vision into reality required more than shared intent. A small working group representing each founding company was tasked with answering hard questions: what the CTA should be, what it should not be and how it could operate independently while earning trust across the industry. With guidance from experts familiar with the ISAC and ISAO landscape, the group worked through governance models, legal frameworks and operational structures. This involved reading more bylaws and legal documents than anyone ever hoped to encounter, but it was essential work. The CTA needed to be built deliberately, with integrity and clarity of purpose.

As the organization took shape, strong leadership became critical. That need was met when Michael Daniel, fresh from serving as Cybersecurity Coordinator for President Obama, stepped in to lead the CTA. His experience, credibility and ability to navigate both policy and industry realities helped propel the organization forward during its formative years.

Fast forward to 2026. As the CTA marks its ninth anniversary, the mission that sparked its creation remains relevant and urgent. The CTA has grown its influence beyond data sharing.

The CTA stands in a unique position to provide oversight and technical influence as a global leader in cybersecurity policy by representing the member companies in one place. With the expanding membership that spans across the globe, the CTA is now an essential piece of global cybersecurity infrastructure. Adversaries continue to evolve, borders remain irrelevant to cyber threats and no single organization can defend alone. What has changed is our proof point: collaboration works.

Reflecting on Nine Years and the Road Ahead

For those of us who have had the privilege of being involved since the earliest days, it has been remarkable to watch a bold idea turn into a trusted global institution. What began as a handful of competitors agreeing to try something different has grown into an organization that meaningfully influences how the industry shares intelligence, engages on policy and works together to protect customers worldwide.

Being part of that journey — helping shape the foundation, watching it mature and continuing to support its growth — has been one of the most professionally rewarding experiences of my career.

The CTA’s success is not defined solely by years or membership numbers, but by the collective commitment of its members to act in the interest of the broader ecosystem. Every shared indicator, every technical contribution and every policy engagement strengthens not just individual companies, but the security of communities across the globe.

As we look ahead, the call to action is simple: stay engaged, stay committed and continue to collaborate. Whether through sharing intelligence, contributing technical expertise or helping shape global cybersecurity policy, each member plays a role in ensuring the CTA remains a trusted and effective force against today’s most pressing cyber threats.

The work is far from done. Together, we are better positioned than ever to meet what comes next.

Happy 9th Anniversary, CTA!

Dark blue and orange graphic celebrating the 9th anniversary of the Cyber Threat Alliance with a large orange circular "9" and a red "ANNIVERSARY YEARS" ribbon.
Figure1. Celebrating 9 Years of the CTA

Additional Resources

Sharing Threat Intelligence Makes Everyone Safer – Michael Sikorski, Palo Alto Networks

More About The Author

Kathi Whitbey is the Lead Principal Program Manager for Unit 42 at Palo Alto Networks, where she has spent more than a decade driving strategic programs and initiatives. She played a pivotal role in the formation and incorporation of the Cyber Threat Alliance (CTA), including leading early efforts to design and operationalize the CTA Platform for secure intelligence sharing among member companies.Deeply committed to the mission of Unit 42,

Kathi is a strong advocate for the team’s work and a dedicated mentor to emerging professionals in cybersecurity and risk management. Her career includes leadership roles in software development management and technical training across multiple U.S. government organizations, including the Department of State, where she traveled globally to deliver training on custom software applications. In addition to her professional work, Kathi has served as a volunteer Emergency Medical Technician, including a 12-month deployment supporting the U.S. Navy at Camp Lemonnier in Djibouti, Africa. She holds a Master’s degree in Information Systems and brings together technical expertise, operational leadership and a deep commitment to service and collaboration.

The Next Frontier of Runtime Assembly Attacks: Leveraging LLMs to Generate Phishing JavaScript in Real Time

Executive Summary

Imagine visiting a webpage that looks perfectly safe. It has no malicious code, no suspicious links. Yet, within seconds, it transforms into a personalized phishing page.

This isn't merely an illusion. It's the next frontier of web attacks where attackers use generative AI (GenAI) to build a threat that’s loaded after the victim has already visited a seemingly innocuous webpage.

In other words, this article demonstrates a novel attack technique where a seemingly benign webpage uses client-side API calls to trusted large language model (LLM) services for generating malicious JavaScript dynamically in real time. Attackers could use carefully engineered prompts to bypass AI safety guardrails, tricking the LLM into returning malicious code snippets. These snippets are returned via the LLM service API, then assembled and executed in the victim's browser at runtime, resulting in a fully functional phishing page.

This AI-augmented runtime assembly technique is designed to be evasive:

  • The code for the phishing page is polymorphic, so there’s a unique, syntactically different variant for each visit
  • The malicious content is delivered from a trusted LLM domain, bypassing network analysis
  • It is assembled and executed at runtime

The most effective defense against this new class of threat is runtime behavioral analysis that can detect and block malicious activity at the point of execution, directly within the browser.

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

The Unit 42 AI Security Assessment can help empower safe AI use and development across your organization.

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

Related Unit 42 Topics JavaScript, LLMs, Phishing

LLM-Augmented Runtime Assembly Attack Model

Our previous research shows how attackers can effectively use LLMs to obfuscate their malicious JavaScript samples offline. Reports from other sources have documented campaigns that leverage LLMs during runtime execution on compromised machines to tailor attacks (e.g., LLM-powered malware and ransomware).

Anthropic researchers have also published reports indicating that LLMs have aided cybercriminals and played a role in AI-orchestrated cyberespionage campaigns. Motivated by these recent discoveries, we researched how threat actors could leverage LLMs to generate, assemble and execute phishing attack payloads within a webpage at runtime, making it challenging to detect with network analysis. Below we outline our proof of concept (POC) for this attack scenario and offer steps to help mitigate the impact of this potential attack.

Attack Model For Our PoC

The attack scenario begins with a seemingly benign page. Once loaded in the victim's browser, the initial webpage makes requests for client-side JavaScript to popular and trusted LLM clients (e.g., DeepSeek and Google Gemini, though the PoC could be effective across a number of models.).

Attackers can then trick the LLM into returning malicious JavaScript snippets using carefully engineered prompts that circumvent safety guardrails. These snippets are then assembled and executed in the browser's runtime to render a fully functional phishing page. This leaves behind no static, detectable payload.

Figure 1 shows how we developed our PoC to leverage LLMs to enhance existing attacks and bypass defenses. The first two steps involve initial preparation, while the final step details the generation and execution of phishing code within the browser at runtime.

Flowchart demonstrating a cybersecurity threat involving phishing. The process includes selecting a phishing page, translating malicious code into LLM prompts to circumvent security, and executing scripts in the browser to display a benign-looking page while malicious content is processed in the background. Icons represent coding, engineering, and trusted API endpoints, focusing on a 'SecureBank Login' example.
Figure 1. Workflow of the PoC. The first two steps are initial preparation, and the third is an example of generating malicious content to be rendered in the browser.

Step 1: Select a Malicious or Phishing Webpage

The attacker’s first step would be to select a webpage from an active phishing or malicious campaign to use as a model for the type of malicious code that would perform the desired function. From there, they can create JavaScript code snippets that will be generated in real-time to dynamically render the final page displayed to the user.

Step 2: Translate Malicious JavaScript Code Into LLM Prompts

The attacker’s next step would be to craft prompts describing the JavaScript code's functionality to the LLM in plain text. They could iteratively refine prompts, generating malicious code that bypasses existing LLM guardrails. These generated snippets could differ structurally and syntactically, allowing attackers to create polymorphic code with the same functionality.

Step 3: Generate and Execute Malicious Scripts at Runtime

From there, attackers could embed these engineered prompts inside a webpage, which would load on the victim's browser. The webpage would then use the prompt to request a popular, legitimate LLM API endpoint to generate malicious code snippets. These snippets could then be transmitted over popular, trusted domains to bypass network analysis. Subsequently, these generated scripts could be assembled and executed to render malicious code or phishing content.

How This Attack Technique Helps with Evasion

This technique builds upon existing evasive runtime assembly behaviors that we often observe on phishing and malware delivery URLs. For example, 36% of malicious webpages we detect daily exhibit runtime assembly behavior, such as executing constructed child scripts with an eval function (e.g., retrieved, decoded or assembled payloads). Leveraging LLMs during runtime on a webpage gives attackers the following benefits:

  • Evading network analysis: The malicious code generated by an LLM could be transferred over the network from a trusted domain, as access to domains of popular LLM API endpoints is often allowed from the client side.
  • Increasing the diversity of malicious scripts with each visit: An LLM can generate new variants of phishing code, leading to higher polymorphism. This can make detection more challenging.
  • Using runtime assembly and executing JavaScript code to complicate detection: Assembling and executing these code snippets during runtime enables more tailored phishing campaigns, such as selecting a target brand based on the victim's location or email address.
  • Obfuscating code in plain text: Translating code into text for subsequent concealment within a webpage can be viewed as a form of obfuscation. Attackers commonly employ various conventional techniques (e.g., encoding, encryption and code fragmenting) to visually conceal malicious code and evade detection. While advanced analyses often identify conventional obfuscation methods by evaluating expressions, it will be more challenging for defenders to evaluate text as executable code without subjecting each snippet to an LLM.

PoC Example

In researching the PoC we were able to demonstrate how this augmentation could be applied to a real-world phishing campaign, illustrating its ability to enhance evasion techniques through the steps we outline above. A brief overview of this PoC is provided below.

Step 1: Selecting a Malicious/phishing Webpage

For our PoC, we replicated a webpage from an advanced real-world phishing campaign known as LogoKit. The original phishing attack uses a static JavaScript payload to transform a benign-looking web form into a convincing phishing lure. This script performs two key functions: personalizing the page based on the victim’s email in the address bar and exfiltrating captured credentials to an attacker's web server.

Step 2: Translating Malicious JavaScript Code Into LLM prompts

Our PoC uses a popular LLM service, accessible via a chat API query from within the browser's JavaScript. To mitigate potential misuse by attackers, we are not disclosing the name of this specific API. We used this LLM API to dynamically generate the code necessary for credential harvesting and impersonate target webpages. Because the malicious payload is generated dynamically in the browser, the initial page transmitted over the network is benign, allowing it to inherently bypass network-based security detectors.

The attack's success hinged on careful prompt engineering to bypass the LLM's built-in safeguards. We found simple rephrasing was remarkably effective.

For instance, a request for a generic $AJAX POST function was permitted (shown in Figure 2), while a direct request for "code to exfiltrate credentials" was blocked. Furthermore, indicators of compromise (IoCs) (e.g., Base64-encoded exfiltration URLs) could also be hidden within the prompt itself to keep the initial page clean.

Screenshot displaying a document containing text instructions on coding. The text includes a red underlined URL and several coding commands and explanations related to AJAX requests. The document has a plain white background with red and black text. At the top of the image is the Base64 encoded URL. The second paragraph is the ask to make the AJAX request instead of credential exfiltration.
Figure 2. Example of prompt engineering to bypass LLM guardrails and generate JavaScript code for phishing content.

The non-deterministic output of the model provided a high degree of polymorphism, with each query returning a syntactically unique yet functionally identical variant of the malicious code. For example, Figure 3 shows differences in code snippets highlighted in red. This constant mutation makes detection more difficult.

Screenshot of two side-by-side code comparisons in an IDE, focusing on different methods of extracting and handling URLs and domain data in JavaScript. The left code extract uses requests while the right code analyzes email-based URLs for domain extraction, highlighted with annotations and marked steps.
Figure 3. Polymorphism creating multiple variants of dynamically generated JavaScript code.

Of note, LLM-generated code can include hallucinations but we mitigated this through prompt refinement and increased specificity, effectively reducing syntax errors. As a result, the final, highly specific prompt successfully generated functional code in most instances.

Step 3: Executing Malicious Scripts at Runtime

The generated script was assembled and executed at runtime on the webpage to render the phishing content. This process successfully constructed a functional, brand-impersonating phishing page, validating the attack's viability (shown in Figure 4). The successful execution of the generated code, which rendered the phishing page without error, confirmed the efficacy of our PoC.

Screenshot collage showing a phishing attack process. Top image: a fake login page. Middle image: a fake login page for Palo Alto Networks for detecting the phishing page. Bottom image: a phishing code generator interface.
Figure 4. Example of a phishing page rendered by assembling dynamically generated JavaScript on runtime in-browser.

Generalizing the Threat and Expanding the Attack Surface

Alternate Methods to Request LLM API

Our attack model, demonstrated through a PoC, could be implemented in various ways. However, each methodology described in the PoC speaks to how an attacker connects to LLM APIs for transferring malicious code as snippets that are executed in the browser at runtime.

As shown in our PoC, attackers could bypass security measures by directly connecting to a well-known LLM service API endpoint from a browser to execute code-generation prompts. Alternatively, they might use a backend proxy server on trusted domains or content delivery networks (CDNs) to connect to the LLM service for prompt execution. A further tactic could involve connecting to this backend proxy server via non-HTTP connections such as WebSockets, a method we have previously reported in phishing campaigns.

Other Abuses of Trusted Domains

Attackers have abused the trust of legitimate domains to circumvent detections in the past, as seen in instances like EtherHiding. In EtherHiding, attackers concealed malicious payloads on public blockchains associated with reputable and trusted smart contract platforms.

The attack detailed in this article uses a combination of diverse, LLM-generated malicious code snippets and the transmission of this malicious code through a trusted domain, to evade detection.

Translation of Malicious Code Into Text Prompts for More Attacks

This article focuses on the conversion of malicious JavaScript code into a text prompt to facilitate the rendering of a phishing webpage. This methodology presents a potential vector for malicious actors to generate diverse forms of hostile code. For example, they could develop malware or establish a command-and-control (C2) channel on a compromised machine that generates and transmits malicious code from trusted domains associated with popular LLMs.

Attacks Leveraging In-Browser Runtime Assembly Behaviors

The attack model presented here exemplifies runtime assembly behaviors, where malicious webpages are dynamically constructed within a browser. Prior research has also documented different variants of runtime assembly for crafting phishing pages or malware delivery. For example, this article mentions a technique where an attacker breaks down malicious code into smaller components, subsequently reassembling them for execution at runtime within the browser (termed by SquareX as last mile reassembling attack). Various reports describe attackers using HTML smuggling techniques to deliver malware.

The attack model outlined in this post goes further, as it involves the runtime generation of novel script variants that are later assembled and executed, posing a significantly elevated challenge to detection.

Recommendations for Defenders

The dynamic nature of this attack in combination with runtime assembly in the browser makes it a formidable defense challenge. This attack model creates a unique variant for every victim. Each malicious payload is dynamically generated and unique, transmitted over a trusted domain.

This scenario signals a critical shift in the security landscape. Detection of these attacks (while possible through enhanced browser-based crawlers) ​​requires runtime behavioral analysis within the browser.

Defenders should also restrict the use of unsanctioned LLM services at workplaces. While this is not a complete solution, it can serve as an important preventative measure.

Finally, our work highlights the need for more robust safety guardrails in LLM platforms, as we demonstrated how careful prompt engineering can circumvent existing protections and enable malicious use.

Conclusion

This article demonstrates a novel AI-augmented approach where a malicious webpage uses LLM services to dynamically generate numerous variants of malicious code in real-time within the browser. To combat this, the most effective strategy is runtime behavioral analysis at the point of execution through in-browser protection and by running offline analysis with browser-based sandboxes that render the final webpage.

Palo Alto Networks Protection and Mitigation

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

Prisma AIRS customers can secure their in-house built GenAI applications against inputs that attempt to circumvent guardrails.

Customers using Advanced URL Filtering and Prisma Browser (with Advanced Web Protection) are better protected against various runtime assembly attacks.

Prisma Browser customers with Advanced Web Protection are protected against Runtime Re-assembly attacks from the first attempt, or "patient zero" hit, because the defense uses runtime behavioral analysis directly within the browser to detect and block malicious activity at the point of execution.

The Unit 42 AI Security Assessment can help empower safe AI use and development across your organization.

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

DNS OverDoS: Are Private Endpoints Too Private?

Executive Summary

We discovered an aspect of Azure’s Private Endpoint architecture that could expose Azure resources to denial of service (DoS) attacks. In this article, we explore how both intentional and inadvertent acts could result in limited access to Azure resources through the Azure Private Link mechanism. We uncovered this issue while investigating irregular behavior in Azure test environments.

The risk is present in three scenarios:

  • Accidental - internal: A network administrator deploys Private Endpoints to improve network security within an Azure environment.
  • Accidental - vendor: A third-party vendor deploys Private Endpoints as part of its solution, for example to enable resource scanning by a security product.
  • Malicious - attacker: A threat actor who gained access to an Azure environment intentionally deploys Private Endpoints as part of a DoS attack.

Our research indicates that over 5% of Azure storage accounts currently operate with configurations that are subject to this DoS issue. In most environments, at least one resource in each of the following services is susceptible:

  • Key Vault
  • CosmosDB
  • Azure Container Registry (ACR)
  • Function Apps
  • OpenAI accounts

This issue has the potential to affect organizations in multiple ways. For example, denying service to storage accounts could cause Azure Functions within FunctionApps and subsequent updates to these apps to fail. In another scenario, the risk could lead to DoS to Key Vaults, resulting in a ripple effect on processes that depend on secrets within the vault.

Microsoft provides fallback to internet advice that partially addresses this and other known issues associated with Private Endpoints.

We discuss these issues, provide potential solutions and suggest ways that defenders can scan environments for resources that are susceptible to DoS attacks.

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

Unit 42 Cloud Security Assessment is a strategic evaluation service that reviews your organization's cloud infrastructure to identify misconfigurations and security gaps, enabling teams to strengthen their posture against cloud-based threats.

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

Related Unit 42 Topics Microsoft Azure, Cloud Research

Azure Private Link Key Components, Concepts and Flows

As part of Azure’s networking offering, Microsoft created Azure Private Link. This mechanism offers a private, secure way to connect to supported Azure resources and Azure-hosted custom services using Azure’s backbone network.

Definitions

To understand the solution and the secure connection process of resources using it, let’s first define the key components and concepts.

  • Service: Destination to which a connection is made
  • Private Link: Azure implementation that allows and handles the connections
  • Private Endpoint: A network interface within a customer’s virtual network that allows connectivity to the service
  • Private DNS zone: The default Domain Name System (DNS) service that is used with Private Endpoints
  • Virtual network link: The link created by default between a Private DNS zone and a virtual network
  • DNS A record: A DNS record that maps a domain or hostname to an IP address
  • Network ACL: Network access control lists (ACLs) define rules that allow or restrict traffic to a service, separate from the Private Link solution

Azure resources expose public endpoints by default. These endpoints resolve through standard DNS infrastructure — either public Azure DNS, or customer-managed DNS resolvers. When a client queries a service name such as mystorageaccount.blob.core.windows[.]net, the DNS resolver returns a public IP address owned by Microsoft. The IP address allows connectivity over the public internet or Azure service endpoints, depending on the network access controls that are applied.

When Azure Private Link is introduced, DNS resolution behavior changes. A Private DNS zone — for example, privatelink.blob.core.windows[.]net — can be linked to one or more virtual networks. If a virtual network has a link to a Private DNS zone for a given service type, Azure’s DNS resolution logic prioritizes that zone when resolving matching service names. If a matching record exists, the name resolves to the private IP address of the Private Endpoint, instead of the public endpoint.

Organizations commonly deploy one of the following architectures:

  • Public-only architecture: Resources are accessed using their public endpoints and standard DNS resolution. Network ACLs, firewalls or service endpoints restrict access.
  • Private-only architecture: All access to the resource occurs through Private Endpoints. Public network access is disabled, and DNS resolution is fully controlled through Private DNS zones.
  • Hybrid architecture (public and private): Some virtual networks or workloads access the resource through Private Endpoints, while others continue using the public endpoint. This model is frequently used during migrations, phased rollouts, third-party integrations, or shared service environments.

We use the example of storage accounts to demonstrate how Private Endpoints are used in Azure networking. However, the same concepts apply to any Private Link-supported service. By default, when a network administrator or a user with appropriate Azure Role-Based Access Control (RBAC) permissions creates a Private Endpoint linked to a resource, a Private DNS zone is created with a virtual network link to the same virtual network as the Private Endpoint.

The DNS zone’s name has a predetermined structure that is based on the Private Endpoint’s destination service (e.g., privatelink.blob.core.windows[.]net for blob storage). Additionally, an A record is created in the DNS zone, linking the name of the destination resource and the IP address of the Private Endpoint.

There are two ways to connect between a virtual machine VM and a storage account with a Network ACL:

  • Without a Private Endpoint (using public or service endpoints)
  • With a Private Endpoint

Connection Flows

Figure 1 shows how a connection is made to a resource that does not use the Private Link solution.

Diagram showing network architecture with four main components: VNET1 containing VM1, connected to a DNS Resolver and a Storage Account with a Network ACL listing two rules: 1. Allow VNET1, 2. Deny *. The connections are numbered to indicate the flow of interaction.
Figure 1. Connection flow without the Private Link solution.

The flow in this case is as follows:

  1. When trying to access the storage account, the VM attempts to resolve the account’s name to an IP address. This usually occurs through an external DNS resolver, and the traffic traverses the public internet.
  2. If the resolver has a record for the storage account, it returns the corresponding IP address.
  3. Once the address is obtained, the VM tries to connect to the storage account.
  4. The storage account then evaluates the virtual machine’s IP address against its Network ACL. If the connection is allowed, the storage account responds with the requested information.

Figure 2 shows how the same connection is made when a Private Endpoint is used.

Diagram showing network communication within Azure. VNET1 connects to a VM1 and a Private DNS Zone labeled as "privatelink.blob.core.windows.net." A Private Endpoint interacts between VM1 and a Storage Account, illustrating the flow of data marked with numbers 1 to 6, indicating the sequence of communication.
Figure 2. Connection flow with the Private Link solution.
  1. Initially, the VM attempts to resolve the account’s name to an IP address. If a virtual network link exists in the virtual network (VNET) to a Private DNS zone that points to a Private Link service, Azure’s Private Link mechanism forces resolution using the Private DNS zone. This occurs when the connection is to a Private Link service of the same type (e.g., blob storage).
  2. When the DNS resolver identifies a matching A record, it provides the VM with the corresponding IP address.
  3. The VM then connects to the IP address, which belongs to the Private Endpoint.
  4. The Private Endpoint acts as a network interface for the storage account, evaluating the traffic and then forwarding it to the storage account.
  5. The storage account evaluates the request and supplies a response through the Private Link solution.
  6. The response is presented to the VM, which essentially accesses the storage account using Azure’s backbone network.

Potential Private Link DNS Dangers

As outlined above, interactions with a Private Link service from a virtual network configured with a Private DNS zone for that service type are forced to resolve through the Private DNS zone.

Consider an environment where VM1 in VNET1 successfully accesses a storage account using its public endpoint. DNS resolution occurs through the default public DNS infrastructure, and access is permitted by the storage account’s Network ACLs. At this stage, the workload is operating normally.

Later, a Private Endpoint is created for the storage account in VNET2 — either intentionally, accidentally, or by a third-party deployment. As part of this process, a Private DNS zone for blob storage (privatelink.blob.core.windows[.]net) is linked to VNET1 or shared across virtual networks.

Once this DNS zone is linked, Azure’s DNS resolution logic forces all blob storage name resolution in VNET1 through the Private DNS zone. However, because no “A” record exists in the zone for the storage account within the context of VNET1, DNS resolution fails. VM1 can no longer resolve the storage account hostname and is unable to connect — even though the public endpoint remains accessible and unchanged.

This configuration change effectively creates a denial-of-service condition for workloads in VNET1 that previously functioned correctly. The outage is triggered solely by a DNS resolution side effect introduced by the Private Link configuration, without any change to the target resource itself.

Figure 3 demonstrates this example.

Diagram showing two virtual networks, VNET1 and VNET2, connected by a storage account. VNET1 includes a VM1 and a private DNS zone. The storage account is positioned between both networks. This setup may result in failed connections, as indicated by red crosses on paths from VM1 to the storage account. VNET2 contains a private DNS zone and a linked private endpoint.
Figure 3. Potential issue caused by using the Private Link solution.

The figure above shows that VM1 attempts to connect to the storage account. This storage account has a Private Endpoint in VNET2 and does not have a Private Endpoint in VNET1. Hypothetically, VM1 could try to connect using the storage account’s public endpoint. This would work if the VM’s virtual network did not have a Private DNS zone resolving to the same resource type. In this case, however, the Private DNS zone and the service are Private Link registered, so Private Link forces resolution through the Private DNS zone.

The process shown in Figure 3 occurs as follows:

  1. Private Link recognizes the blob storage Private DNS zone in VNET1 and identifies that the storage account is Private Link registered. Private Link forces DNS resolution through the Private DNS zone.
  2. The configuration in Figure 3 shows that no record was created for the storage account in the Private DNS zone linked to VNET1. As such, the virtual machine cannot resolve the service.
  3. Due to the DNS resolution issue in step 2, the subsequent steps – in which VM1 sends a request to the storage account and receives a response from it – do not occur.

This scenario causes a partial denial of service: any resource in VNET1 that tries to access the storage account will not be able to.

This risk can also be present when using local DNS resolvers, depending on the configurations and the records added. Additionally, although our example relates specifically to blob storage, any service that supports Azure Private Link is potentially at risk.

Mitigations and Recommendations

Azure Private Link was originally intended as a binary solution, to be either fully enabled, or disabled. When the service is implemented as intended, users can only access resources that use Private Link through those resources' Private Endpoints. This approach eliminates the need to use a combination of private, public and service endpoints. However, as over 5% of Azure storage accounts are configured in a way that is subject to this issue, we recognize the need to provide solutions that address the risks introduced by these implementations.

Mitigations

Microsoft acknowledges that the binary nature of the solution is a known issue and mentions it in their documentation. Microsoft also provides a partial solution: enabling a fallback to internet option when creating a virtual network link. Using this fallback solution, when the DNS Resolver cannot find a record that matches the requested service, it falls back to the public internet. While this solution solves the issue, it does not necessarily match the main concept of Azure Private Link, which is to traverse Azure’s backbone network rather than the public internet.

A second, partial solution is to manually add a record for the affected resource in the necessary Private DNS zone. This option is less appropriate for large production environments, as it creates additional operational overhead.

Although neither fallback nor manually adding a record is a definitive solution, combining the above approaches with comprehensive discovery will help with mapping, finding and remediating affected configurations.

Comprehensive Discovery and Scanning

There are two ways to scan and identify resources that are potentially at risk:

  1. Scanning for resources with each service individually
  2. Using Azure Resource Graph Explorer

The second scanning method is more efficient and can easily be modified to match most resource types. We created a graph query that retrieves a list of all the virtual networks in the environment that are linked to a blob storage Private DNS zone (privatelink.blob.core.windows[.]net). These virtual networks are forced to resolve blob storage resources through their Private Endpoints when communicating with Private Link registered resources.

In addition, it is important to identify which virtual networks interact with blob storage resources that do not have Private Endpoint connections. We created the following query for this purpose. This query retrieves storage accounts that allow access to their public endpoint and do not have a Private Endpoint connection.

This query identifies allowed virtual networks and also retrieves resources that allow specific IP addresses. This is useful when there is limited visibility into the DNS configurations for virtual networks, making it difficult to determine whether or not the configurations are affected.

Defenders should be aware that even resources that do not have Network ACLs could still be at risk. However, there is no way to use the configurations to determine which virtual networks, if any, attempt to communicate with such resources. To address this risk, use network logs to identify connections made from Azure network ranges to susceptible resources.

Defenders can change and match the resource and the Private DNS zone details in the above Resources query to detect Private Link-supported resources that are at risk.

Conclusion

Fully understanding the limitations of Azure Private Link is vital to securing networks that rely on it. With certain configurations of components and architecture, the binary nature of Azure Private Link can lead to connectivity loss and in some cases, could enable DoS attacks.

Two of the possible solutions to secure Private Endpoints against this risk include:

  • Enabling fallback to public DNS resolution
  • Manually adding DNS records for affected resources

Defenders can increase the effectiveness of these solutions by querying resources, conducting comprehensive network scanning to identify resources at risk, and implementing the necessary protections.

Palo Alto Networks Protection and Mitigation

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

  • Cortex Cloud customers are better protected from the misuse of the Azure Private Endpoints discussed within this article through the proper placement of Cortex Cloud XDR endpoint agent and serverless agents within a cloud environment. Cortex Cloud is designed to protect a cloud’s posture and runtime operations against these types of threats. It helps detect and prevent the malicious operations or configuration alterations or exploitation discussed within this article.

Unit 42 Cloud Security Assessment is a strategic evaluation service that reviews your organization's cloud infrastructure to identify misconfigurations and security gaps, enabling teams to strengthen their posture against cloud-based threats.

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

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

Anatomy of an Attack: The Payroll Pirates and the Power of Social Engineering

No employee wants their paycheck to go missing. One organization learned about an incident when they started hearing exactly this complaint. It turned out that an attacker had modified direct-deposit details in order to redirect an organization’s paychecks into attacker-controlled accounts.

What happened to this organization started with nothing more than a phone call.

In fact, findings in our 2025 Unit 42 Global Incident Response Report: Social Engineering Edition suggest that 36% of all incidents Unit 42 engaged with began with a social engineering tactic. This includes phishing, vishing, search engine optimization (SEO) poisoning, fake system prompts and help desk manipulation.

In spite of technical protection tools available, attackers find that old-fashioned exploitation attempts still work. Instead of breaching networks, dropping malware or exploiting cloud misconfigurations, some threat actors are bypassing technical controls altogether and going straight for the humans who run them.

The Attack: Social Engineering in Action

The threat actor's initial access was not gained through a technical breach but rather through a social engineering campaign. The attacker impersonated employees to manipulate multiple help desks, including those for payroll, IT and HR shared services. They then tricked the help desk personnel by successfully circumventing the challenge/response authentication into performing password resets and re-enrolling multi-factor authentication (MFA) devices.

Social platforms provide easy access to publicly available information needed for threat actors to bypass help desk authentication. In many cases, attackers even call back multiple times to probe for the types of verification questions being asked, thereby allowing them to gather the necessary data for a successful subsequent attempt. As social platforms continue to expand the amount of personal and professional data available, this reconnaissance has become easier than ever.

In addition, the threat actor tried to establish persistence by registering an external email address as an authentication method for a service account within the client's Azure AD environment. This demonstrates a clear intent for long-term access beyond the immediate payroll diversion.

Once authenticated into the payroll system, the attacker moved quickly. In total, they compromised multiple employee accounts, each one granting access to sensitive payroll information. The attacker then proceeded to modify direct-deposit details for multiple individuals, redirecting their paychecks into bank accounts under the attacker’s control. Because the credentials were valid and MFA appeared legitimate, the activity blended in with normal operations. The incident was discovered only when employees reported missing paychecks. That triggered an internal investigation, which traced suspicious account changes dating back weeks. The organization engaged legal counsel, who referred them to Unit 42 to conduct a full-scope investigation.

How Unit 42 Helped

Once Unit 42 was engaged, we conducted a thorough investigation. Our team performed extensive threat hunting by deploying Cortex XSIAM and correlating telemetry from various sources, including the payroll system, HR system and the client's Next-Generation Firewall (NGFW) logs. This in-depth analysis allowed Unit 42 to confirm the incident and limit its impact. Our investigation confirmed that the incident was limited to the payroll diversion and account compromises, with no evidence of broader lateral movement or data exfiltration from the internal network.

But, unrelated to the payroll incident, our threat hunting effort identified evidence of an ongoing compromise related to the WannaCry ransomware in the client’s legacy OT environment. (Yes, you read that right! Given when it came out, WannaCry has been lurking in their environment for years!)

The Outcome: How We Closed Critical Security Gaps

Unit 42 worked with the customer to quickly contain the account compromises, reverse fraudulent payroll changes and regain control over impacted cloud identities.

At the same time, the team began advising on hardening measures across both IT and OT environments, including:

  • Enhancing help desk verification procedures
  • Strengthening MFA enforcement and recovery workflows
  • Improving logging, including forwarding application logs into Cortex XSIAM
  • Addressing the WannaCry foothold within OT systems

Despite the initial compromise, the impact was contained to just three employee accounts. This is largely because the organization acted quickly. Additionally, the attacker’s objective was financial gain rather than deeper network access. We were able to accelerate incident resolution and strengthen their security posture with stronger help desk protocols and identity governance.

What This Investigation Revealed

This incident highlights how modern attackers are increasingly bypassing traditional technical controls and focusing on operational processes, especially help desks. Human-driven workflows like password resets and MFA enrollment can become high-impact vulnerabilities if not tightly governed. It also illustrates how narrowly scoped fraud investigations can reveal deeper systemic issues, such as the discovery of a long-standing WannaCry presence in OT systems.

As attackers continue to refine their social engineering tactics, organizations must treat help desk and similar interactions with the same rigor as technical authentication flows. The case underscores the importance of:

  • Unified visibility across the environment
  • Security team skillset
  • Strong verification procedures for all identity-related requests

Interested in learning more about the latest attack trends? If so, take a look at our 2025 Unit 42 Global Incident Response Report: Social Engineering edition, which distills the most critical findings based on our direct experience responding to real-world cyberattacks at over 500 organizations across 38 countries.

Additional Resources

About Unit 42

Unit 42 strengthens your team with the tools and expertise needed to stay ahead of threats and protect your business. With our proven strategies and insights from thousands of engagements, we’ll help your team handle the toughest situations with confidence.

Threat Brief: MongoDB Vulnerability (CVE-2025-14847)

Executive Summary

On Dec. 19, 2025, MongoDB publicly disclosed MongoBleed, a security vulnerability (CVE-2025-14847) that allows unauthenticated attackers to leak sensitive heap memory by exploiting a trust issue in how MongoDB Server handles zlib-compressed network messages. This flaw occurs prior to authentication, meaning an attacker only needs network access to the database's default port to trigger it.

Key details of the threat are summarized below:

  • Vulnerability: CVE-2025-14847 is a critical, unauthenticated memory disclosure vulnerability in MongoDB Server's handling of zlib-compressed messages (CVSS 8.7).
  • Impact: This memory can contain sensitive data such as cleartext credentials, API keys, session tokens and personally identifiable information (PII).
  • Status: Confirmed active exploitation in the wild. A public proof-of-concept (PoC) exploit is available. The U.S. Cybersecurity and Infrastructure Security Agency (CISA) added this vulnerability to the Known Exploited Vulnerabilities (KEV) Catalog on Dec. 29, 2025, based on evidence of active exploitation.

Cortex Xpanse identified approximately 146,000 instances of MongoDB exposed to the internet.

Palo Alto Networks customers are better protected from activity related to CVE-2025-14847 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.

Vulnerabilities Discussed CVE-2025-14847

Details of CVE-2025-14847

The MongoBleed vulnerability originates in the way MongoDB processes zlib-compressed wire-protocol messages, a feature that is enabled by default. Communication is handled via an OP_COMPRESSED header, which wraps the original message payload and includes a field specifying the expected size of the uncompressed data.

The execution of the attack mechanism occurs in the following manner:

  • An unauthenticated attacker sends a specially crafted, compressed message to a vulnerable MongoDB server.
  • The attacker manipulates the uncompressedSize field within the OP_COMPRESSED header, setting it to a value significantly larger than the actual compressed payload.
  • The server fails to validate this value and allocates an oversized memory buffer based on the attacker-specified size. This buffer is populated with uninitialized heap memory, remnants of previously processed data.
  • The leak is further amplified by MongoDB’s error-handling logic. When the attacker's malformed BSON object is sent without a null terminator, the server attempts to parse memory until it encounters a null terminator. When parsing ultimately fails, the server returns an error response that includes both the original malicious message and the contents of the leaked heap memory.

It’s important to note that MongoDB automatically applied the patch to managed MongoDB Atlas customers, meaning self-hosted MondoDB servers require manual patching.

This process allows an attacker to progressively leak large portions of the server's memory by sending repeated malformed requests.

Attack Vector and Impact

The attack vector is fully remote, unauthenticated, and requires no user interaction. An adversary only needs network access to the default MongoDB port (TCP/27017) to exploit the flaw.

The primary impact is a high-confidentiality data loss. Although MongoBleed is limited to being a read-only memory disclosure vulnerability and does not allow for remote code execution, the strategic significance of the information that can be leaked is vast. Attackers could leverage the leaked secrets to enable further system compromise, data exfiltration and lateral movement.

This vulnerability affects the following MongoDB versions:

  • Version 8.2: 8.2.0 – 8.2.2
  • Version 8.0: 8.0.0 – 8.0.16
  • Version 7.0: 7.0.0 – 7.0.27
  • Version 6.0: 6.0.0 – 6.0.26
  • Version 5.0: 5.0.0 – 5.0.31
  • Version 4.4: 4.4.0 – 4.4.29

End-of-life (no fix available):

  • All v4.2 versions
  • All v4.0 versions
  • All v3.6 versions

Current Scope of the Attack Using CVE-2025-14847

The threat posed by MongoBleed is not theoretical. A working public PoC exploit was published on GitHub on Dec. 26, 2025. Security researchers observed active exploitation in the wild shortly after the vulnerability's disclosure.

Official confirmation of active exploitation came on Dec. 29, 2025, when the U.S. CISA added CVE-2025-14847 to its KEV Catalog, mandating that federal agencies patch the flaw.

Cortex Xpanse identified approximately 146,000 vulnerable instances of MongoDB exposed to the internet, providing a tangible metric for the global attack surface.

Interim Guidance

If immediate patching is not feasible, the following temporary measures should be considered to help reduce risk:

1. Network Segmentation: Reduce exposure by blocking all inbound internet access to MongoDB instances on port TCP/27017. Connections should be restricted at the network level to explicitly trusted sources only.

2. Disable zlib Compression: As a temporary workaround, disable zlib compression support within the MongoDB configuration. This action prevents the vulnerable code path from being triggered. Safe alternatives include snappy, zstd or fully disabling compression.

Please refer to the issues tracker maintained by MongoDB for additional suggestions and updates.

Unit 42 Managed Threat Hunting Queries

The Unit 42 Managed Threat Hunting team continues to track any attempts to exploit this CVE across our Managed Services customers, using telemetry available within Cortex XDR. Cortex XDR customers who don’t leverage Unit 42 Managed Services can also use the following XQL query to search for signs of exploitation.

The following query attempts to identify a high number of network connections to MongoDB servers. Results of this query may not explicitly indicate exploitation but could be used to signal systems for further review.

Conclusion

While MongoBleed carries a Critical severity rating, successfully weaponizing it against a monitored enterprise is operationally difficult. Due to the return of unstructured, random fragments of data from an exploited server, capturing valuable data requires an attacker to barrage the server with thousands of requests.

This makes any worthwhile exploitation of MongoBleed a loud intrusion, creating a fingerprint that standard heuristics and rate-limiting controls should be well designed to detect and block long before significant data exfiltration typically occurs.

Palo Alto Networks customers are better protected by our products, as listed below.

Palo Alto Networks Product Protections for CVE-2025-14847

Palo Alto Networks customers can leverage a variety of product protections and services to help 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 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 signature 96856 and 96857.

Cortex XDR and XSIAM

Cortex XDR and XSIAM help protect against post-exploitation activities using the multi-layer protection approach.

Cortex Xpanse

Cortex Xpanse is designed to identify exposed MongoDB devices on the public internet and escalate these findings to defenders. Customers can enable alerting on this risk by ensuring that the MongoDB Server and Insecure MongoDB Server Attack Surface Rules are enabled.

Cortex Attack Surface Testing (AST) can also validate whether exposed MongoDB instances are vulnerable to exploitation by executing benign PoC checks.

Identified findings can either be viewed in the Threat Response Center or in the incident view of Expander. These findings are also available for Cortex XSIAM customers who have purchased the attack surface management (ASM) module.

Cortex Cloud

Cortex Cloud can help detect cloud-hosted resources vulnerable to CVE-2025-14847 through the proper placement of Cortex Cloud XDR endpoint agent and serverless agents within a cloud environment.

While MongoDB’s managed service offering was automatically patched by the MongoDB Security Engineering team, self-hosted cloud instances can still be vulnerable. Cortex Cloud is designed to provide discovery of self-hosted MongoDB instances across Amazon Web Services (AWS), Azure and Google Cloud (GCP). This allows organizations to gain visibility into cloud-hosted assets, a critical first step in mitigating threats like MongoBleed.

Furthermore, Cortex Cloud has detection rules specifically designed to identify and alert on any self-hosted MongoDB instances that are publicly accessible.

Lastly, if cloud identities were leaked from a compromised MongoDB instance, Cortex Cloud Identity Security can help detect common post-exploitation identity-based techniques used to gain and maintain persistence resulting in further exploitation of cloud platforms.

Updated Jan. 14, 2026, at 1:05 p.m. PT to remove the word "vulnerable" from the sentence about exposed servers.

Updated Feb. 6, 2026, at 4:47 p.m. PT to add protection information about Advanced Threat Prevention.

Remote Code Execution With Modern AI/ML Formats and Libraries

Executive Summary

We identified vulnerabilities in three open-source artificial intelligence/machine learning (AI/ML) Python libraries published by Apple, Salesforce and NVIDIA on their GitHub repositories. Vulnerable versions of these libraries allow for remote code execution (RCE) when a model file with malicious metadata is loaded.

Specifically, these libraries are:

  • NeMo: A PyTorch-based framework created for research purposes that is designed for the development of diverse AI/ML models and complex systems created by NVIDIA
  • Uni2TS: A PyTorch library created for research purposes that is used by Salesforce's Morai, a foundation model for time series analysis that forecasts trends from vast datasets
  • FlexTok: A Python-based framework created for research purposes that enables AI/ML models to process images by handling the encoding and decoding functions, created by researchers at Apple and the Swiss Federal Institute of Technology’s Visual Intelligence and Learning Lab

These libraries are used in popular models on HuggingFace with tens of millions of downloads in total.

The vulnerabilities stem from libraries using metadata to configure complex models and pipelines, where a shared third-party library instantiates classes using this metadata. Vulnerable versions of these libraries simply execute the provided data as code. This allows an attacker to embed arbitrary code in model metadata, which would automatically execute when vulnerable libraries load these modified models.

As of December 2025, we have found no malicious examples using these vulnerabilities in the wild. Palo Alto Networks notified all affected vendors in April 2025 to ensure they had a chance to implement mitigations or resolve the issues before publication.

  • NVIDIA issued CVE-2025-23304, rated High severity, and released a fix in NeMo version 2.3.2
  • The researchers who created FlexTok updated their code in June 2025 to resolve the issues
  • Salesforce issued CVE-2026-22584, rated High severity, and deployed a fix on July 31, 2025

These vulnerabilities were discovered by Prisma AIRS, which is able to identify models leveraging these vulnerabilities and extract their payloads.

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

Related Unit 42 Topics Python, LLMs, Machine Learning

AI/ML Model Formats

AI/ML training and inference pipelines depend on saving complex internal states, such as learned weights and architecture definitions. These internal states are saved as model artifacts, and the artifacts must be shared between producers and consumers. Libraries provide built-in mechanisms to serialize these artifacts.

Python libraries for AI/ML have long depended on functionality from the pickle module in the Python standard library to store and load Python objects to and from files. This module serializes Python objects by creating a simple program to reconstruct the objects, and the pickle module is executed when the Python objects are loaded. Because the pickle module executes code when loading files, using it brings significant security risks.

The PyTorch library’s file format simply embeds .pickle files in a container format. Other libraries like scikit-learn use .pickle or other extensions used for pickle (like .joblib) on their own. Most popular AI/ML libraries clearly document these risks and provide mature mitigations to prevent the execution of unexpected code by default.

Security Issues in New Model Formats

Newer formats have been developed to address the security issues of these pickle-based formats. These “safe” formats largely achieve this by only supporting the serialization of model weights or by representing pipelines as data instead of code, using formats like JSON. For example, HuggingFace’s safetensors format only allows for the storage of model weights and a single JSON object to store model metadata.

Older formats have also moved away from relying on the pickle module. For example, PyTorch will only load model weights by default. If pickle loading is enabled, PyTorch will only execute functions from a predefined allow list that should prevent the execution of arbitrary code.

While these newer formats and updates remove the ability to serialize pipelines as code, they do not make applications and libraries using these models impervious to traditional exploits. Security researchers at JFrog have identified vulnerabilities in applications that use these formats using well-known techniques such as XSS and path traversal.

Technical Analysis

While newer formats have removed the ability to store model state and configurations as code, researchers still have use cases for serializing that information. Because these libraries are large and the configurations of their classes can be complex, many libraries use third-party tools to accomplish this.

Hydra is a Python library maintained by Meta that is a tool commonly used to serialize model state and configuration information.

We identified three open-source AI/ML Python libraries used by models on HuggingFace that leverage Hydra to load these configurations from model metadata in a way that allows for arbitrary code execution:

  • NeMo: A PyTorch-based framework created for research purposes designed for the development of diverse AI/ML models and complex systems created by NVIDIA
  • Uni2TS: A PyTorch library created for research purposes used by Salesforce's Morai, a foundation model for time series analysis that forecasts trends from vast datasets
  • FlexTok: A Python-based framework created for research purposes that enables AI/ML models to process images by handling the encoding and decoding functions, created by researchers at Apple and the Swiss Federal Institute of Technology’s Visual Intelligence and Learning Lab

Hydra

All the vulnerabilities we identified use the hydra.utils.instantiate() function, which is intended to “instantiate different implementations of an interface.”

The Hydra API takes as arguments a configuration object (like a Python dictionary or an OmegaConf object) that describes the target interface to instantiate and optional *args and **kwargs parameters to be passed to that interface. This configuration expects a _target_ value specifying the class or callable to instantiate, and an optional _args_ value defining arguments for _target_.

In each of the cases we identified, hydra.utils.instantiate() is only used to instantiate instances of library classes with simple arguments stored in metadata. Figure 1 shows an example of the metadata NeMo passes to the instantiate() function.

A screenshot of computer code containing configuration parameters for a machine learning model.
Figure 1. Metadata from a NeMo file.

What these libraries appear to have overlooked is that instantiate() doesn’t just accept the name of classes to instantiate. It also takes the name of any callable and passes it the provided arguments.

By leveraging this, an attacker can more easily achieve RCE using Python's built-in functions like eval() and os.system(). In all the proofs of concept we used to test these vulnerabilities, we employed a payload using builtins.exec() as the callable and a string containing Python as an argument.

Since these issues were first identified, Hydra has been updated to add a warning to its documentation stating that RCE is possible when using instantiate() and to add a simple block-list mechanism. This mechanism works by comparing the _target_ value against a list of dangerous functions like builtins.exec() before it is called.

Because this mechanism uses exact matches against import targets before they are imported, it is trivially evaded by using implicit imports from the Python standard library (e.g., enum.bltns.eval) or from the target application (e.g., nemo.core.classes.common.os.system). However, the Hydra documentation clearly states that this mechanism is not exhaustive and shouldn’t be relied on solely to prevent the execution of malicious code. As of January 2026, this block-list mechanism is not yet available in a Hydra release.

NeMo

NVIDIA has been developing the NeMo library since 2019, as a “scalable and cloud-native generative AI framework.” NeMo uses its own file formats with the .nemo and .qnemo file extensions, which are simply TAR files containing a model_config.yaml file that stores model metadata along with a .pt file or a .safetensors file, respectively.

The main entry points for loading these .nemo model files are restore_from() and from_pretrained(). There are several layers of abstraction, but ultimately, the serialization mix-in is used to handle loading the model configuration once it has been loaded from the embedded model_config.yaml file. Figure 2 shows the vulnerable call to hydra.utils.instantiate().

A screenshot of computer code from the Hydra API, showing conditional statements written in Python for handling configuration-based instantiation.
Figure 2. Call to hydra.utils.instantiate() in NeMo.

At no point is any sanitization done on the metadata before it is passed to instantiate(). Because the call is made before the target model class begins its initialization, it is easy to create a model_config.yaml file with a working payload, as shown in Figure 3.

A screenshot of code in a text editor, featuring lines written in Python. The code includes a print statement with "Hello world".
Figure 3. Example metadata triggering the NeMo vulnerability.

NeMo also integrates with HuggingFace and supports passing the name of a model hosted on HuggingFace to from_pretrained(), which is the way most NeMo models on HuggingFace appear to be used. This call is also vulnerable because once the model is downloaded from HuggingFace, the same code paths are followed.

As of January 2026, over 700 models on HuggingFace from a variety of developers are provided in NeMo format NeMo. Many of these models are among the most popular on HuggingFace, such as NVIDIA’s parakeet. This vulnerability appears to have existed since at least 2020.

The PyTorch format that NeMo extends supports code execution with embedded .pickle files, but it clearly documents this. This PyTorch format also disables arbitrary execution by default and offers several safeguards, such as allowlisting usable modules during the loading of .pickle files. NeMo does allow for the loading of embedded .pickle files inside of the PyTorch files embedded in .nemo files, but the built-in allow list mechanism in PyTorch should prevent arbitrary code execution.

NVIDIA acknowledged this issue, released a CVE record CVE-2025-23304 rated High severity and issued a fix in NeMo version 2.3.2.

To address this issue, NeMo added a safe_instantiate function to validate the _target_ values from Hydra configurations before they are executed. This function recursively looks for _target_ values in the configuration and validates each one, which prevents using nested objects for RCE. A new _is_target_allowed function first checks each _target_ value against an allow list of prefixes containing package names from NeMo, PyTorch and related libraries.

This prefix check alone would not be sufficient to prevent implicit imports of dangerous modules, as is the case for Hydra’s new block-list mechanism. However, NeMo additionally imports each target using Hydra and checks to see whether:

  • It is a subclass of an expected class
  • The import has a module name from an allow list of expected modules

By checking the actual imported value against these allow lists, NeMo ensures only expected targets are executed. For example, the target nemo.core.classes.common.os.system resolves to the posix module, which is clearly not part of the NeMo library.

Uni2TS

In 2024, Salesforce’s AI research team published an article titled Unified Training of Universal Time Series Transformers, which introduced a set of models that were published on HuggingFace. This research and the use of these models depend on uni2TS, an open-source Python library that accompanied the Salesforce article.

The uni2TS library exclusively works with .safetensors files, which were explicitly designed to provide a safe alternative to model formats that allow for code execution. The safetensors format also does not explicitly support storing model or pipeline configurations.

To facilitate storing these configurations, libraries such as HuggingFace’s huggingface_hub use a config.json file stored in a model’s repository. For models using classes in one of HuggingFace’s core ML libraries, this is done securely because only parameters that can be stored directly in JSON primitive types are used. These values are then passed to a predefined, hard-coded set of classes.

However, huggingface_hub provides a PyTorchModelHubMixin interface for creating custom model classes that can be integrated with the rest of their framework. As part of this interface, values are read from the packaged config.json file and passed to the model class.

This interface provides a little-used mechanism for registering functions called coders, which process specific arguments before they are passed to the class. The uni2TS library leverages this mechanism to decode the configuration of a specific argument using a call to hydra.utils.instantiate() before it is passed to the target class, shown in Figure 4.

Screenshot of Python code including a function to decode distribution output and a class definition using PyTorch.
Figure 4. Call to hydra.utils.instantiate() in uni2TS.

This code is executed when one of the published models is loaded using either MoraiModule.from_pretrained() or MoraiMoEModule.from_pretrained(). By adding our payload to the config.json file packaged with models using uni2TS as shown in Figure 5, RCE can be achieved when the model is loaded.

Screenshot of a JSON script containing a Python print function code that displays "Hello world".
Figure 5. Example config.json metadata triggering uni2TS vulnerability.

The Salesforce models using these libraries have hundreds of thousands of downloads so far on Hugging Face. Several adaptations of these models have also been published on HuggingFace by other users. No evidence of malicious activity involving these models has been discovered.

Salesforce has acknowledged this issue, released a CVE record CVE-2026-22584, rated High severity, and issued a fix on July 31. This fix implements an allow list and a strict validation check to ensure only explicitly permitted modules can be executed.

ml-flextok

Early in 2025, Apple and the Swiss Federal Institute of Technology’s Visual Intelligence and Learning Lab (EPFL VILAB) published research that introduced a supporting Python library called ml-flextok. Like uni2TS, ml-flextok works exclusively with the safetensors format and extends PyTorchModelHubMixin. It can also load metadata from a config.json file included in the model repository. This library also supports loading configuration data from the .safetensors file directly, storing this information in the metadata section of the file under the __metadata__ key.

Because the safetensors format represents metadata as a dictionary with string keys and string values, and because the model configuration depends on lists of parameters, a secondary encoding must be used. Ml-flextok leverages Python as this secondary encoding and uses ast.literal_eval() in the Python standard library to decode the metadata.

As documented, this function does not allow for arbitrary code execution but is susceptible to attacks causing memory exhaustion, excessive CPU consumption and process crashes. After the metadata has been decoded, ml-flextok directly passes it to hydra.utils.instantiate().

If the model is loaded from HuggingFace, this metadata is read from config.json and is not double-encoded since complex structures are supported. This JSON data is loaded as a dictionary, and specific sections are passed directly to instantiate().

In both cases, payloads are created with names matching instantiate() arguments. Depending on whether the payload is added to the .safetensors file directly or in the packaged config.json file, the encoding and placement of the payload differ slightly, but the payload is still straightforward. Figure 6 shows a payload placed in a .safetensors file's metadata.

A line of code displayed on a dark background that includes the text "payload", "target", and "builtins."
Figure 6. Example of .safetensors metadata triggering uni2TS vulnerability.

As of January 2026, no models on HuggingFace appear to be using the ml-flextok library other than those models published by EPFL VILAB, which have tens of thousands of downloads in total.

Apple and EPFL VILAB have updated their code to resolve these issues by using YAML to parse their configurations and adding an allow list of classes they will pass to Hydra’s instantiate() function. They have also updated their documentation to indicate that strings stored in model files are executed as code and only models from trusted sources should be loaded.

Conclusion

Palo Alto Networks has not identified any model files leveraging these vulnerabilities for attacks in the wild. However, there is ample opportunity for attackers to leverage them.

It is common for developers to create their own variations of state-of-the-art models with different fine-tunings and quantizations, often from researchers unaffiliated with any reputable institution. Attackers would just need to create a modification of an existing popular model, with either a real or claimed benefit, and then add malicious metadata.

Prior to this finding, there was no indication that these libraries could be insecure or that only files from trusted sources should be loaded. HuggingFace does not currently make the contents of the metadata for these files easily accessible to users as it does in other cases (e.g., APIs referenced in .pickle files). Neither does it flag files using the safetensors or NeMo formats as being potentially unsafe.

Because the latest advances in this space often require code and not just model weights, there is a proliferation of supporting libraries. In October 2025, we identified over a hundred different Python libraries used by models on HuggingFace, almost 50 of which use Hydra in some manner. While these formats on their own may be secure, there is a very large attack surface in the code that consumes them.

Palo Alto Networks Protection and Mitigation

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

  • Prisma AIRS is able to identify models leveraging these vulnerabilities and extract their payloads.
  • Cortex Cloud’s Vulnerability Management identifies and manages base images for cloud virtual machine and containerized environments. This allows for identification and alerting of vulnerabilities and misconfigurations, then provides remediation tasks for identified base level container images. The Cortex Cloud Agent can also detect the runtime operations discussed within this article.
  • The Unit 42 AI Security Assessment can help organizations reduce AI adoption risk, secure AI innovation and strengthen AI governance.

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

Securing Vibe Coding Tools: Scaling Productivity Without Scaling Risk

Vibe Coding and Vulnerability: Why Security Can’t Keep Up

The promise of AI-assisted development, or “vibe coding,” is undeniable: unprecedented speed and productivity for development teams. In a landscape defined by complex cloud-native architectures and intense demand for new software, this force multiplier is rapidly becoming standard practice. However, this speed comes at a severe, often unaddressed cost. As AI agents generate functional code in seconds, they are frequently failing to enforce critical security controls, introducing mass vulnerabilities, technical debt and real-world breach scenarios.

This challenge is magnified by the rise of citizen developers (personnel without development backgrounds) who lack the literacy to review or secure the code being generated. Due to this lack of development background, citizen developers may not have a full understanding of the security requirements required in the application life cycle, which may require application security training and/or experience. For every leader from the CEO to the CISO, as well as technical practitioners, understanding this gap is critical. This blog introduces the SHIELD framework (see below in the What Unit 42 is Seeing section) to put necessary governance back into the coding process, ensuring we scale productivity without scaling risk.

Identifying and Addressing Vibe Coding Risks

A user types a simple prompt: // Write a function to fetch user data from the customer API. In seconds, a dozen lines of functional code appear.

This is the new reality of vibe coding. The productivity gains are undeniable. Development teams, already stretched thin by complex software development life cycles (SDLCs) and cloud-native pressures, now have a powerful force multiplier.

But let’s examine the unexpected outcomes vibe coding creates.

What happens when that AI-generated function correctly fetches the data, but neglects to include vital authentication and rate-limiting controls? What happens when the AI agent is tricked by a malicious prompt into exfiltrating sensitive data?

As organizations rapidly adopt these tools, a gap is widening between productivity and security. The "nightmare scenarios" are no longer hypothetical; they are documented, real-world incidents.

The accelerated demand for software, increasing reliance on cloud-native technologies and widespread adoption of DevOps have intensified the complexity and resource requirements of the SDLC. Vibe coding offers a silver lining, enabling teams to do more with less. However, in the wake of wider adoption, Unit 42 has observed that real-life catastrophic failures have occurred:

  • Insecure application development leading to breach: A sales lead application was successfully breached because the vibe coding agent neglected to incorporate key security controls, such as those for authentication and rate limiting, into the build
  • Insecure platform logic leading to code execution: Researchers discovered a critical flaw via indirect prompt injection that allowed malicious command injection via untrusted content, executing arbitrary code and enabling exfiltration of sensitive data
  • Insecure platform logic leading to authentication bypass: A critical flaw in the authentication logic for a popular program allowed a bypass of controls by simply displaying an application’s publicly visible ID in an API request
  • Rogue database deletion leading to data loss: An AI agent, despite explicit instructions to freeze production changes, deleted the entire production database for a community application

Understanding the Root Causes of Vibe Coding Risk

These incidents are symptoms of predictable, fundamental gaps in how AI models operate. From our analysis, these risks cluster into a few key categories:

  • Models prioritize function over security: AI agents are optimized to provide a working answer, fast. They are not inherently optimized to ask critical security questions, resulting in a nature that is insecure by default. Use of security scanning or “judge agents” in many of these tools is elective, leaving potential security gaps.
  • Critical context blindness: An AI agent lacks the situational awareness a human developer possesses (e.g., distinguishing between production and development environments).
  • The "phantom" supply chain risk: AI models often hallucinate helpful-sounding libraries or code packages that do not exist, leading to unresolvable dependencies.
  • Citizen developers and developer over-trust: Personnel without a development background lack training in how to write secure code. The democratization of code development is thus accelerating the introduction of security vulnerabilities and long-term technical debt. Additionally, the code looks correct and it works. This creates a false sense of security, accelerating vulnerabilities due to a lack of traditional change control and secure code review.

What Unit 42 Is Seeing

Through its AI visibility and security assessment engagements, Unit 42 has found that most evaluated organizations allow employees to use vibe coding tools due to the absence of hard blocks (e.g., blocking tools at the firewall). However, very few of these organizations have performed a formal risk assessment on the use of these tools, and very few are monitoring inputs, outputs, and security outcomes.

Addressing Risk Through the SHIELD Framework

The proliferating threat landscape may seem unmanageable, but returning to the first principles of security controls is the answer. Unit 42 works with clients to implement the SHIELD framework for vibe coding, placing properly designed security controls back into the coding process.

  • S - Separation of Duties: Vibe coding platforms may over-aggregate privileges. Ensure that incompatible duties (e.g., access to development and production) are not granted to AI agents. Restrict agents to development and test environments only.
  • H - Human in the Loop: Vibe coding platforms may fail to enforce human review. For any code impacting critical functions, ensure a mandatory secure code review performed by a human and require a pull request (PR) approval prior to code merge. This is vital when non-developers are involved.
  • I - Input/Output Validation:
    • Input: Sanitize prompts by separating trusted instructions from untrusted data via guardrails (prompt partitioning, encoding, role-based separation).
    • Output: Require the AI to perform validation of logic checks and code through Static Application Security Testing (SAST) after development and before merging.
  • E - Enforce Security-Focused Helper Models: Develop external/independent helper models (specialized agents designed to provide automated security validation for vibe-coded applications) to perform SAST testing, secrets scanning, security control verification, and other critical validation functions to identify vulnerabilities and hard-coded secrets prior to deployment.
  • L - Least Agency: Implement the principle of least agency for all vibe coding platforms and AI agents. Only grant the minimum permissions and capabilities required to perform their role. Restrict access to sensitive files and guardrail any destructive commands.
  • D - Defensive Technical Controls: Employ defensive controls around supply chain and execution management, such as performing Software Composition Analysis (SCA) on components before consumption, and disabling auto-execution to allow for human-in-the-loop and helper agent involvement in deployment.

Securing Vibe Coding: A Non-Negotiable for the AI Era

Ultimately, the age of vibe coding has arrived, but the vibes will benefit from careful tuning. Speed without security rigor can quickly lead to irreversible outcomes. Identifying tactical security controls that adequately address the risk ensures we can take the safe path to vibe coding bliss and avoid the difficult path to catastrophic scenarios we cannot take back.

The Unit 42 AI Security Assessment can help empower safe AI use and development across your organization.

Additional Resources

VVS Discord Stealer Using Pyarmor for Obfuscation and Detection Evasion

Executive Summary

This article details our technical analysis of VVS stealer, also styled VVS $tealer, including its distributors’ use of obfuscation and detection evasion.

The stealer is written in Python and targets Discord users, exfiltrating sensitive information like credentials and tokens stored in Discord accounts. This stealer was once in active development and marketed for sale on Telegram as early as April 2025.

VVS stealer's code is obfuscated by Pyarmor. This tool is used to obfuscate Python scripts to hinder static analysis and signature-based detection. Pyarmor can be used for legitimate purposes and also leveraged to build stealthy malware.

Malware authors are increasingly leveraging advanced obfuscation techniques to evade detection by cybersecurity tools, making their malicious software harder to analyze and reverse-engineer. This article shows how we deobfuscated VVS stealer samples to better understand its operations.

Because Python is easy for malware authors to use and the complex obfuscation used by this threat, the result is a highly effective and stealthy malware family.

Palo Alto Networks customer are better protected 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 Infostealer, Anti-analysis

Introduction

Discord is a social messaging and communications platform that has become a popular target for malware, like VVS stealer. VVS stealer is designed to steal a victim's Discord information and browser data.

Figure 1 shows VVS stealer's advertised capabilities, including:

  • Stealing Discord data (tokens and account information)
  • Intercepting active Discord sessions via injection
  • Extracting web browser data (cookies, passwords, browsing history and autofill details)
Screenshot collage of a computer screen displaying information about "VS Stealer on Telegram," talking about its use as a hacking tool, with features listed and pricing details. Also visible is a Telegram contact link for further communication.
Figure 1. VVS stealer advertisement, focused on Telegram.

The stealer also achieves persistence by automatically installing itself on startup. It operates stealthily by displaying fake error messages and capturing screenshots. For a deeper investigation into the operation, please refer to the article by DeepCode, Investigating VVS $tealer: A Python-Based Discord Malware.

Technical Analysis

This section analyzes a Pyarmor-protected VVS stealer malware sample with the following SHA-256 hash:

  • c7e6591e5e021daa30f949a6f6e0699ef2935d2d7c06ea006e3b201c52666e07

Figure 2 shows a summary diagram illustrating the entire sample analysis workflow.

Flowchart showing the process of extracting Python bytecode from a PyInstaller executable, decompiling it to Python source code, and decrypting Pyarmor bytecode to ELF.
Figure 2. Overview of the workflow for analyzing the VVS stealer malware sample.

Step One: Extracting From the PyInstaller Binary

The sample we analyzed is distributed as a PyInstaller package. PyInstaller is a tool that bundles a Python application and its dependencies into a package to allow execution of a packaged app without installing additional modules.

Any standard PyInstaller installation ships with the built-in utility pyi-archive_viewer. We used this utility to extract and inspect the following files from our sample:

  • The Python bytecode file named vvs
  • The Pyarmor runtime dynamic-link library (DLL) file named pyarmor_runtime.pyd, located under subfolder pyarmor_runtime_007444
    • The accompanying __init__.py file within this same subfolder, which includes the following information:
      • Pyarmor version: 9.1.4 (Pro)
      • Unique license number: 007444
      • Timestamp: 2025-04-27T11:04:52.523525
      • Product name: vvs
  • Python 3.11 DLL file named python311.dll
    • The file version information indicates the Python version is 3.11.5

PyInstaller stores Python bytecode (listed as 1.) in its raw form. This raw form refers to the bytecode sequence beginning with the value e3. The value e3 is a combination of both flag and type, combined via the constant FLAG_REF.

The type represented by the value e3 is computed as: type = e3 & ~FLAG_REF. This means the value e3 is actually the type 0x63 (the letter c), also known as the enumeration constant TYPE_CODE. The full implementation of this derivation can be found in the CPython 3.11 codebase.

Figure 3 below shows this code object serialized by the marshal module is bare, missing an accompanying 16-byte header (marked in blue). To provide enough Python for the decompiler not to reject the file, we need to restore at least one of the header values (Python 3.11.5 magic number in 4-byte, little-endian format) prior to decompilation, because the Python decompiler expects a valid Python bytecode (.pyc) file as its input.

Hexadecimal data visualization showing rows of hex codes with some values highlighted.
Figure 3. Python bytecode (.pyc) file named vvs, with its header restored.

We begin our analysis by decompiling the Python bytecode .pyc) file named vvs to recover its equivalent Python source code (.py).

Step Two: Decompiling to Python Source Code

Pycdc is a Python bytecode decompiler written in C++. It is part of the Decompyle++ project. It supports decompiling Python 3.11 bytecode “back into valid and human-readable Python source code.” (Source: GitHub.) PyLingual is another Python bytecode decompiler.

After cloning the code repository and compiling the codebase, the generated executable can be invoked as follows to decompile Python bytecode to Python source code via Pycdc:

  • pycdc.exe -c -v "3.11.5" "vvs.pyc" > "vvs.py"

This will produce the decompiled Python source code shown in Figure 4.

Screenshot of a line of Python code involving an import statement from a library named "pyarmor," with obscured additional text.
Figure 4. Decompiled vvs Python source code.

We then analyze the last function argument, which can be extracted via Python 3's ast.NodeVisitor.

Step Three: Unraveling Pyarmor Obfuscation

The payload begins with the Pyarmor header shown in Figure 5.

A screenshot displaying a section of a hexadecimal code with ASCII characters on the right side, including a visible string "PY00744...
Figure 5. Pyarmor header, with particular fields of interest highlighted.

Cryptography is performed throughout using the Advanced Encryption Standard (AES) algorithm with a 128-bit key, operating in Counter (CTR) mode with an initial value of two (i.e., AES-128-CTR). Table 1 shows the breakdown of the fields.

Offsets Values Description
0x00 … 0x07 PY007444 File signature containing the unique license number
0x09 03 Python major version
0x0a 0b Python minor version
0x14 09 Protection type:

  • 09 if Pyarmor BCC mode (briefly explained in the next section) is enabled
  • 08 otherwise
0x1c … 0x1f 40 00 00 00 Start of the ELF payload, in little-endian format
0x24 … 0x27 12 c9 06 00 First four bytes of the AES-128-CTR nonce
0x2c … 0x33 dc d2 98 a1 ea 11 fd f4 Remaining eight bytes of the AES-128-CTR nonce
0x38 … 0x3b a0 7f 02 00 End of the ELF payload, in little-endian format

Table 1. Breakdown of fields present in the Pyarmor header.

This same pattern (highlighted in yellow) repeats itself once again after the end of the ELF payload, for extracting and decrypting the Pyarmor bytecode payload.

BCC Mode

BCC (likely an abbreviation of ByteCode-to-Compilation) mode converts most “functions and methods in the scripts to equivalent C functions. Those C functions will be compiled to machine instructions directly, then called by obfuscated scripts.” (Source: Pyarmor documentation.)

BCC mode is invoked as follows: pyarmor gen --enable-bcc script.py.

These converted C functions are stored in a separate ELF file, produced alongside the Pyarmor-marshaled bytecode.

The mapping of Python constants to BCC functions can be obtained using this implementation. For instance, in the Python method get_encryption_key(browser_path), the constant __pyarmor_bcc_58580__ maps to the BCC function bcc_180, whose function body is located at offset 0x4e70 of the ELF file.

Referencing this analysis of the ELF file contents, especially the bcc_ftable structure, Figure 6 shows part of the BCC function bcc_180 decompiled:

Screenshot depicting two side-by-side images of complex Python code examples on a computer screen.
Figure 6. Decompilation of the BCC function bcc_180.

We can roughly recover an equivalent of the original code of the Python method get_encryption_key, as shown in Figure 7.

Screenshot of Python code in a text editor, showing a function to retrieve the decryption key for Chromium browsers with highlighted syntax.
Figure 7. Equivalent Python code of the get_encryption_key method.

Marshaled Bytecode Format

Pyarmor 9 marshaled bytecode differs from standard Python 3.11 bytecode in several ways. Firstly, the 0x20000000 bit is set in the co_flags field to indicate that it is Pyarmor obfuscated. Secondly, there is an extra data field, whose length is denoted by the value of its first byte.

Moreover, deopt_code() needs to be disabled for the bytecode sequence to be successfully decrypted. We will discuss the cryptographic parameters in a later section of this article.

Code Object Structure

Pyarmor code objects are specially crafted, in that they should contain certain artifacts. It is common to expect to find the LOAD_CONST __pyarmor_enter_*__ instruction in the preamble and the LOAD_CONST __pyarmor_exit_*__ instruction in the trailer of the disassembly. These two instructions would wrap the encrypted bytecode, as shown in Table 2.

Operation Argument
LOAD_CONST __pyarmor_enter_58592__
LOAD_CONST \x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x20\x16\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
… encrypted bytecode sequence (to be examined in the next section) …
LOAD_CONST __pyarmor_exit_58593__
LOAD_CONST \x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x20\x16\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

Table 2. Pyarmor-related instructions in the disassembly listing of <module>.

Once the encrypted bytecode sequence is decrypted, it could reveal encrypted strings or BCC function invocations. Encrypted strings (reviewed in a later section of this article) are preceded by a LOAD_CONST __pyarmor_assert_*__ instruction. There is also the LOAD_CONST __pyarmor_bcc_*__ instruction to invoke a BCC function (reviewed earlier in this article).

Code Object Encryption

Bytecode sequences between the start marker (__pyarmor_enter_*__) and the end marker (__pyarmor_exit_*__) are AES-128-CTR encrypted. The associated AES key (273b1b1373cf25e054a61e2cb8a947b8) is extracted from the Pyarmor runtime DLL linked to the unique license number.

On the other hand, the corresponding AES nonce exclusive OR (XOR) key (2db99d18a0763ed70bbd6b3c) is only specific to the Pyarmor bytecode payload, for which there is an implementation of the logic for extracting this value. This key is XORed with the 12 bytes at the end marker (__pyarmor_exit_*__) to produce the correct AES nonce used in the decryption.

String Encryption

Similarly, string constants longer than eight characters are AES-128-CTR encrypted (known as "mixed" in Pyarmor terminology”). The associated AES key is also 273b1b1373cf25e054a61e2cb8a947b8, but this time, the corresponding AES nonce (692e767673e95c45a1e6876d) is computed from the Pyarmor runtime DLL linked to the unique license number.

Additionally, a 0x81 prefix value denotes that the string constant is encrypted. Otherwise, a 0x01 prefix value is used instead.

Now that the Pyarmor protection is disarmed, we shall proceed to cover some of the key capabilities of the VVS stealer in the next section.

Malware Capabilities

With the layers of Pyarmor obfuscation — including the BCC mode and AES-128-CTR string encryption — successfully stripped away, we were able to expose the underlying Python logic. This deobfuscated code revealed a stealer designed not just for data exfiltration, but for active session hijacking and persistence. The following section details the specific operational capabilities of the VVS stealer that were uncovered during this analysis.

The malware sample expires after 2026-10-31 23:59:59. It will stop working by terminating itself prematurely.

The malware sample performs all HTTP requests by sending the fixed User-Agent string Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36.

We shall now provide an overview of the main malware capabilities, as advertised on Telegram.

Discord Data

The malware sample first searches for potential encrypted Discord tokens. Encrypted Discord tokens are strings beginning with the prefix dQw4w9WgXcQ:. The malware sample uses regular expressions to form a pattern from this string prefix. It then uses this pattern to search inside the contents of files with the .ldb or .log file extensions, stored within the LevelDB directory.

Next, the malware sample decrypts the encrypted_key value in the Local State file, via the Data Protection Application Programming Interface (DPAPI). With this decrypted encrypted_key value as the AES key parameter, the malware sample applies the AES algorithm, operating in Galois/Counter Mode (GCM) mode, on the encrypted Discord tokens, to decrypt them.

The malware sample then uses the decrypted Discord tokens to query various Discord application programming interface (API) endpoints for user information, including:

  • Nitro subscription (Discord Premium features)
  • Payment methods
  • User ID
  • Username
  • Email
  • Phone number
  • Friends
  • Guilds
  • Multifactor authentication (MFA) status
  • Locale
  • Verification status
  • Avatar image
  • IP address (via the ipify service)
  • Computer name

After gathering all this information, the malware sample proceeds to exfiltrate it in JavaScript Object Notation (JSON) format. The exfiltration takes place via HTTP POST requests to the predefined webhook endpoints (%WEBHOOK% environment variable and hard-coded fall back URLs).

Webhooks are “a low-effort way to post messages to channels in Discord. They do not require a bot user or authentication to use.” (Source: Discord Developer Portal.)

Discord Injection

The code responsible for this functionality is in class Inj, likely an abbreviation of Injection.

In this class, the malware sample first kills running Discord application processes, if any are running. It then downloads the JavaScript (JS) payload from a remote file named injection-obf.js (the -obf suffix likely stands for an obfuscated version of the script), replacing the webhook endpoint URL and discord_desktop_core, into the Discord application directory. This JS file is obfuscated by the JavaScript Obfuscator Tool and can be deobfuscated via the Obfuscator.io Deobfuscator.

Some of the main functionality of the injected JS code is highlighted in the following screenshots, starting with its configuration and exfiltration code snippets, shown in Figure 8.

Screenshot of a JavaScript configuration file involving URLs and paths related to a Discord API and a remote authorization gateway. The code is displayed in a text editor with syntax highlighting.
Figure 8. Injected JS configuration and exfiltration.

Figure 8 shows the injected JS code responsible for establishing persistence in the Discord application, based on the Electron framework. This framework uses Atom Shell Archive Format (ASAR) archives to bundle the entire application's codebase into a single file, shown in Figure 9.

Screenshot of a code snippet related to a software initialization function, mentioning paths and configuration for "app.js", "index.js", and "discord.js". The code is written in JavaScript.
Figure 9. Injected JS code to perform persistence.

Figure 10 shows the injected JS code responsible for monitoring network traffic via the Chrome DevTools Protocol (CDP).

Screenshot of software code in an editor, displaying a network-related JavaScript function.
Figure 10. Injected JS code to monitor network traffic.

Figure 11 shows supporting utility functions and event hooks in the injected JS code. Event hooks are callback functions that execute upon the Discord application user performing a specific action. The actions of interest are when the user views their backup codes, changes their password or adds a payment method. The callback functions linked to these actions are capable of collecting Discord user account and billing information.

Screenshot of a computer code editor displaying multiple lines of JavaScript code, involving functions related to user data handling and API requests.
Figure 11. Injected JS code of utility functions and event hooks.

Thereafter, the malware sample restarts a compromised Discord application process via Update.exe, which it does with the command-line switch --processStart.

Web Browser Data

The malware sample targets a list of web browser applications, including:

  • Chrome
  • Edge
  • 7Star
  • Amigo
  • Brave
  • CentBrowser
  • Discord
  • Epic Privacy Browser
  • Iridium
  • Kometa
  • Lightcord
  • Mozilla Firefox
  • Opera
  • Orbitum
  • Sputnik
  • Torch
  • Uran
  • Vivaldi
  • Yandex

To these targets, the malware sample extracts the following data, where present:

  • Autofill
  • Cookies
  • History
  • Passwords

Once these data are extracted, the malware sample prepares it for exfiltration by compressing it into a single ZIP archive file named <USERNAME>_vault.zip. It then exfiltrates this file via HTTP POST requests to the predefined webhook endpoints, similar to the Discord data exfiltration process.

Startup Persistence

The malware sample copies itself to the %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup folder to achieve startup persistence. The malware remains on the user’s device, enabling it to continue exfiltrating data if, for example, the user attempts to install a fresh copy of the Discord application.

Fake Error

The malware sample uses the Win32 API, specifically the MessageBoxW function in the User32.dll library, to display a modal message box about a fake fatal error that requires restarting the computer. A modal message box is a small dialog window requiring user interaction before the application can continue, as shown in Figure 12.

Error message dialog box displaying "Fatal Error" with error code 0x80070002 and a suggestion to restart the computer. An "OK" button is present for acknowledgement.
Figure 12. A fake message box instructing the victim to restart the computer.

Conclusion

VVS stealer demonstrates how tools like Pyarmor, which can be used for legitimate purposes, can also be leveraged to build stealthy malware aimed at hijacking credentials for popular platforms such as Discord. Its emergence signals a need for defenders to strengthen monitoring around credential theft and account abuse.

Palo Alto Networks Protection and Mitigation

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.

Cortex XDR and XSIAM prevents 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.

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

SHA-256 hashes of malware samples:

  • 307d9cefa7a3147eb78c69eded273e47c08df44c2004f839548963268d19dd87
  • 7a1554383345f31f3482ba3729c1126af7c1d9376abb07ad3ee189660c166a2b
  • c7e6591e5e021daa30f949a6f6e0699ef2935d2d7c06ea006e3b201c52666e07

Discord webhook URLs

  • hxxps[://]ptb.discord[.]com/api/webhooks/1360401843963826236/TkFvXfHFXrBIKT3EaqekJefvdvt39XTAxeOIWECeSrBbNLKDR5yPcn75uIqKEzdfs9o2
  • hxxps[://]ptb.discord[.]com/api/webhooks/1360259628440621087/YCo9eVnIBOYSMn8Xr6zX5C7AJF22z26WljaJk4zr6IiThnUrVyfWCZYs6JjSC12IC8c0

Additional Resources

Who Does Cybersecurity Need? You!

Dispelling Stereotypes in the Field

All industries have their stereotypes. For instance, the adversaries of cyber intelligence analysts carry the stereotype of a hacker in a hoody, hunched over their laptop in the dark. Are there other stereotypes or assumptions about those who work in the field cyber intelligence?

To those outside of the industry, hearing “I work in cybersecurity” may sound cool – or intimidating. Outsiders may envision people in the field as:

  • Solely consisting of STEM majors: perhaps the super smart who double-majored in computer science and network engineering
  • People who learn programming languages easily and would be polyglots in another life
  • Single-minded nerds interested in computers from an early age, who were building their first computer before they hit high school
  • Those who effortlessly bootstrapped their way in, starting in a help desk role and quickly gaining momentum

Regardless of an individual’s path, there is an aura around cybersecurity that glows with the rigor of hard sciences. It isn’t helped by the fact that hacker stuff is downright neat.

From Art School to Threat Intelligence Research

When I was in art school in the late aughts, I never considered that I would end up in cybersecurity as I walked around listening to Animal Collective or buying secondhand clothes in the more punk neighborhoods of Chicago. A course in advanced typography wasn't going to fling me into the realm of malware. Taking attentive notes at a lecture by Chip Kidd wasn’t going to be a stepping stone to pentesting.

However, the cybersecurity field is big. Just as NASA isn’t populated with only astronauts, cybersecurity isn’t populated with only threat intelligence analysts. While astronauts do have one of the most imagination-stirring roles in existence, they need support from engineers, news chiefs and more, all the way down to the graphic designers who design the collectable mission patches. Take the case of Dr. Sian Proctor: She is a geologist who taught in higher education for years, and through a passion for planetary science and space became an analog astronaut, meaning she conducted simulated space missions on earth. Her research lays groundwork for future visits to Mars. (She did, eventually, become an astronaut on a SpaceX mission, but not before publishing a cookbook of the food she ate on these earthside Mars missions.)

Like Dr. Proctor, in my role as a Technical Writing Manager, my skills are needed to make the threat research we publish shine. To continue my analogy, I may not be an astronaut myself, but I still support the “astronauts” of threat intelligence and make sure their work launches high above the stratosphere…maybe even into cyberspace (wink, wink).

Cybersecurity's Strength Is People Like You

The bottom line is that if you’re a marketer, cybersecurity needs you. If you’re a copywriter, a product manager or a social media wiz, cybersecurity needs you. If you’re told you’re “terminally online” in your professional capacity, then cybersecurity needs you.

This field is for people who are excited by what’s just over the horizon as technology continues to change. You’re more than welcome to join us.

From Linear to Complex: An Upgrade in RansomHouse Encryption

Executive Summary

RansomHouse is a ransomware-as-a-service (RaaS) operation run by a group that we track as Jolly Scorpius. Recent samples of the associated binaries used in RansomHouse operations reveal a significant upgrade in encryption. This article explores the upgrade of RansomHouse encryption and the potential impact for defenders.

Jolly Scorpius uses a double extortion strategy. This strategy combines stealing and encrypting a victim's data with threats to leak the stolen data.

The scale of the group's operations is significant. At the time of this article, at least 123 victims were listed on the RansomHouse data leak site as having their data disclosed or sold since December 2021.

This group has disrupted critical sectors including healthcare, finance, transportation and government. The consequences of these intrusions include significant financial losses, major data breaches and erosion of public trust in the affected organizations.

To better understand RansomHouse operations, we review its attack chain. We also examine the upgrade to this ransomware's encryption from a simple, single-phase linear technique to a more complex, multi-layered method.

Palo Alto Networks customers are better protected from the threats described in this article 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 Ransomware, ESXi

Actor Roles and the Attack Chain

Despite Jolly Scorpius positioning itself as a group that exposes corporate vulnerabilities, its actions reveal a straightforward extortion business. To better understand its RansomHouse operations, we can identify the specific actor roles, discern separate phases of the attack chain and determine how the roles and phases relate to each other.

Figure 1 illustrates these roles and their positions in the attack chain.

Diagram of the RansomHouse attack chain with two sections titled "Roles and Attack Chain". Under "Roles," there are icons representing an Operator, an Attacker, and a Victim. Below, the "Attack Chain" is divided into four steps: 1. Develop, showing icons for Tools and Leak website. 2. Infiltrate, indicating Initial access and Lateral movement. 3. Exfiltrate & Deploy, with icons for MrAgent and Mario alongside VMWare. 4. Extort is symbolized by a server and communication between two persons.
Figure 1. Actor roles and how they relate to phases of the RansomHouse attack chain.

The RansomHouse attack chain involves three distinct roles:

  • Operator: Operates the RaaS
  • Attacker: Deploys the ransomware
  • Victim: Targeted by the attacker

Operators are responsible for establishing and maintaining the RaaS, including the development of tools for data encryption and other functions. Individuals in this role manage the data leak site and architecture for victims to negotiate ransom payments. This includes managing the cryptocurrency wallets for ransom collection and laundering.

Attackers are typically known as affiliates because they are separate threat actors from the operators. As ransomware services rise and fall, attackers can switch their affiliation to different RaaS groups. Attackers are responsible for gaining initial access, moving laterally, exfiltrating data and deploying the ransomware.

Attackers for RansomHouse are known for targeting VMware ESXi infrastructure, a common enterprise-grade hypervisor platform. RansomHouse attackers specifically target ESXi because compromising this platform allows them to encrypt dozens or hundreds of virtual machines at once, causing maximum operational disruption.

The attack chain reflects a multi-faceted strategy to pressure RansomHouse victims. This strategy involves harvesting sensitive information, encrypting select data, publishing victim identities and threatening to release their sensitive data. The RansomHouse attack chain can be broken into four phases:

  1. Develop
  2. Infiltrate
  3. Exfiltrate and deploy
  4. Extort

Each phase involves at least one of the three roles.

Phase 1: Develop

In this phase, RansomHouse operators function as the backend providers, responsible for developing all aspects of the RaaS. Crucially, the operators typically do not conduct the initial intrusions. Instead, they rely on their affiliates (i.e., the attackers) to leverage the RaaS services developed in this phase.

Phase 2: Infiltrate

In this phase, attackers compromise victims through spear phishing emails or other social engineering techniques. In addition to email, initial access vectors include vulnerable systems in a victim's environment that attackers can compromise through zero-day or other exploits.

After achieving initial access, attackers typically use third-party tools and frameworks to explore the victim's network. The remainder of the infiltration phase includes reconnaissance to map the environment, privilege escalation, lateral movement and identifying valuable or sensitive information.

Phase 3: Exfiltrate and Deploy

Once attackers affiliated with RansomHouse have infiltrated a victim's environment, they exfiltrate sensitive data and deploy the ransomware. Typical data exfiltration techniques involve file compression and file transfer utilities, and attackers usually send data to servers under their control.

The RansomHouse RaaS uses a modular architecture that consists of two components:

  • Management tool
  • Encryptor

RansomHouse uses a management tool called MrAgent, designed to automate and track ransomware deployments across different hypervisor systems in an ESXi environment.

RansomHouse uses an encryptor known as Mario. After encrypting files, Mario drops a ransom note that contains instructions on how victims can recover their data.

Phase 4: Extort

Once a victim's data has been stolen and encrypted, the attack chain transitions to the extortion phase. RaaS operators are generally responsible for this phase, which often involves negotiations via dedicated chat rooms. Operators validate their threats through strategic information disclosure on platforms like Telegram and the RansomHouse data leak site.

Now that we better understand the RansomHouse attack chain, let's review how the components of this ransomware are used in attacks.

RansomHouse Components Used in Attacks

The two components of this ransomware (i.e., MrAgent and Mario) are specifically engineered to compromise virtualized environments. Figure 2 illustrates how these tools are used in a RansomHouse attack in an ESXi network.

Flowchart showing a cybersecurity attack process. Includes an "Attacker (RansomHouse) C2 Server" connecting and sending commands, which deploy deployment tools and ransomware via "VMware ESXi Hypervisor" to target "Virtualized Datastores" including "VM Files" like .vmdk and .vmx, affecting VMs designated as Web Server, Database, and Domain Controller.
Figure 2. Flow chart of how RansomHouse components are used in an ESXi environment.

After infiltrating the environment, an attacker deploys MrAgent onto the victim's ESXi hypervisor. MrAgent establishes a persistent connection to the attacker's command-and-control (C2) server.

Attackers then issue commands from the C2 server to MrAgent for further operations like data exfiltration. After the data is exfiltrated, attackers instruct MrAgent to download and execute the Mario encryptor, which runs directly on the hypervisor to encrypt virtual machine (VM) files.

Since MrAgent is the first component in the attack, let's review how it works.

MrAgent: The RansomHouse Deployment Tool

As the primary tool for RansomHouse operations, MrAgent provides attackers with persistent access to a victim's environment and simplifies managing compromised hosts at scale. This management is accomplished through various functions of the tool.

Functions

The main functions of MrAgent are:

  • Acquiring host identifiers
  • Acquiring the host's IP address
  • Disabling the firewall
  • Communicating with the attacker's C2 server

While an analysis by Trellix has documented the commands MrAgent uses for these functions, we can review them to better understand its operations.

Commands for acquiring host identifiers are as follows:

  • For the hostname: uname -a
  • For the MAC address: esxcli --formatter=csv network nic list

The command to acquire the host's IP address is:

  • esxcli --formatter=csv network ip interface ipv4 get

The command to disable the firewall is:

  • esxcli network firewall set --enabled false

MrAgent's function to check for connectivity to the C2 server runs in an infinite loop. During these connectivity checks, MrAgent can receive various instructions from the C2 server. Table 1 lists examples of these instructions and their function.

Instruction Function
Abort Aborts the start of encryption if the hypervisor is in its delay phase after a reboot
Abort_f Kills threads spawned by MrAgent
Config Overwrites the local configuration used for ransomware deployment
Exec Starts the ransomware deployment, changing the root password, disabling vCenter remote management via /etc/init.d/vpxa stop and starting the encryption of VMs
Info Retrieves ESXi host information
Run Executes arbitrary commands on the ESXi host by writing to the file ./shmv
Remove Removes content from the ESXi host by executing the command rm -rf [filename or path]
Quit Kills and removes the MrAgent binary using rm -f
Welcome Sets the ESXi welcome message on the host via esxcli system welcomemesg set -m="[text of message]"

Table 1. Examples of MrAgent instructions from an attacker's C2 server.

These functions enable MrAgent to deploy the Mario encryptor.

Characteristics

To impede reverse engineering, the MrAgent binary is sometimes modified with junk code, but this basic obfuscation does not alter its fundamental operations. For state management of the compromised environment, MrAgent uses two internal JSON structures to store its runtime configuration and status, with access synchronized by a mutex.

Mario: The RansomHouse Encryptor

MrAgent deploys Mario to accomplish the operation's core function of encrypting critical VM files in the ESXi hypervisor. Our research uncovered two distinct versions of Mario that reveal an evolution in its encryption methods.

Both versions follow the same overall execution flow:

  1. Create the ransom note
  2. Target file extensions
  3. Encrypt files
  4. Report statistics

Creating the Ransom Note

The first step in Mario's execution flow is creating a ransom note. The ransom note is named How To Restore Your Files.txt and is located in the directory of any files that Mario encrypts.

Mario opens the ransom note in write mode and saves text to the file that provides instructions for victims to recover their files. Figure 3 below shows an example of this note.

RansomHouse ransom note. Image of a text file titled "How To Restore Your Files.txt" open in Notepad with ASCII art depicting Super Mario alongside instructions for contacting a provided email and Telegram channel, indicating a ransomware notice from the group named "RansomHouse."
Figure 3. Example of a ransom note generated by a Mario sample.

Targeting File Extensions

The next step is directory traversal and extension targeting. Mario requires attackers to specify the directory path of the files to encrypt. Within the specified directory, Mario targets virtualization files based on the filename extensions listed in Table 2.

Extension File Description
ova Open Virtual Appliance (OVA): a single-file distribution of the OVF file package
ovf Open Virtualization Format (OVF): an open standard for packaging and distributing virtual software
vbk Veeam Backup (VBK) file: stores backup copies of a VM's data at a specific point in time
vbm Veeam Backup Metadata (VBM) file: stores metadata about a VBK file
vib VMware Installation Bundle (VIB): a package file for installing or upgrading ESXi hosts
vmdk Virtual Machine Disk (VMDK) file: used in virtual machines like VMware and VirtualBox
vmem VMware Memory (VMEM) file: a backup of a VM's RAM content from the host system
vmsd VMware Snapshot Metadata (VMSD) file: stores metadata about each VM snapshot
vmsn VMware Snapshot State (VMSN) file: stores the running state of a VM at the time of snapshot
vswp VMware Swap (VSWP) file: swaps memory pages to the hard drive when a host is low on physical memory

Table 2. File extensions targeted by Mario.

Mario iterates through each of the files in the specified directory path, checking for the targeted extensions. During this iteration process, Mario ignores various entries in the directory, like . (current directory) and .. (parent directory).

The encryptor also ignores files with the following strings anywhere in the filename, even if the filename has a targeted extension:

  • .marion
  • .emario
  • .lmario
  • .nmario
  • .mmario
  • .wmario

This exclusion is likely to avoid double-encrypting files, to avoid the possibility of the files becoming corrupted and unrecoverable.

Figure 4 shows the extensions from Table 2 when we tested a Mario sample discovered earlier this year.

Terminal screen showing a program named 'e_mario.out' running an encryption process on various files with extensions such as vmsn, vbm, vmdk, vmxf, vsv, vmsd, and vswp.
Figure 4. Mario sample targeting file extensions associated with virtualization.

Targeting an organization's virtual infrastructure and backups is a known RansomHouse tactic. Both approaches are intended to inhibit data recovery if a victim does not pay the ransom.

Encrypting Files

While encrypting targeted files, Mario displays its progress, as Figure 4 above shows. Encrypted files are renamed, appending the existing filename with an extension that includes the string mario. Figure 5 shows an example of .emario as the extension for encrypted files after running a Mario sample.

A screenshot of a terminal window displaying the output of the "ls -a" command, listing various files including ones with the suffix ".emario". Highlighted in blue is the directory named "test_subdirectory".
Figure 5. Listing the directory content reveals encrypted files with the .emario extension.

Reporting Statistics

After Mario finishes encrypting targeted files, it displays statistics of the encryption results. These statistics, in order, are:

  • The number of files that could not be encrypted
  • The number of files that were encrypted
  • The number of skipped files
  • The total file count
  • The amount of data that was encrypted

Figure 6 shows an example of a statistics report after running a Mario sample.

Screen capture of a terminal displaying the output of a file decryption process, listing statistics including encrypted files processed, skipped files, and total data tested.
Figure 6. Example of a Mario sample reporting its encryption statistics.

While all known samples of Mario follow the same execution flow, the process is more complex in recent Mario samples. The next section reviews the differences between the earlier and later Mario samples, revealing an upgrade in Mario's encryption methods.

Mario's Upgraded Encryption

We identified two versions of Mario based on the differences in encryption routines among currently known samples. Comparing these two versions reveals that developers have updated Mario to use a substantially more complex encryption method. We refer to these two versions as:

  • Original version
  • Upgraded version

Comparing blocks of disassembled code for the encryption routine, there is a noticeably more complex block of functions in the upgraded version. Figure 7 compares the encryption code blocks for these two versions, showing noticeably more sections in the upgraded version on the right than in the original version on the left.

Comparison of encryption code blocks from a sample of original Mario (left) and upgraded Mario (right), with lines and blocks highlighted in green.
Figure 7. Comparison of encryption code blocks between the original and upgraded versions of Mario.

To demonstrate the upgrade in Mario's encryption, we compare code from samples of the two versions across the following functions:

  • Encryption
  • Memory layout and buffer management
  • File processing
  • Output format

Improvements in these functions make the upgraded version of Mario significantly more efficient and resilient to analysis than the original version.

Encryption

The original version of Mario has a straightforward and basic encryption routine. Figure 8 shows disassembled code from the original version. This code performs a single pass to transform a file's data from unencrypted to encrypted.

Screenshot of programming code in an IDE, featuring multiple lines of assembly language with annotations explaining each part of the code. The code includes operations like memory setting and transformation setup.
Figure 8. Disassembled code for the original version's single-pass file transformation.

In contrast, the upgraded version of Mario features a two-stage file transformation that includes a secondary encryption key. Figure 9 shows disassembled code from a sample of the upgraded version of Mario, revealing this more complex encryption process.

Screenshot of a computer screen displaying code in an IDE with annotations explaining key encryption steps, and a flowchart diagram illustrating data processing steps on the lower right corner.
Figure 9. Disassembled code revealing the upgraded version's more complex file transformation.

The upgraded version's code reveals a two-factor encryption scheme where the file is encrypted with both a primary key and a secondary key. Data encryption is processed separately for each key. This significantly increases the difficulty of decrypting the data without both keys.

Figure 10 shows that the upgraded version of Mario uses random values to generate a 32-byte primary encryption key and an 8-byte secondary encryption key.

A screenshot of a computer code snippet displaying various assembly language instructions related to cryptographic operations such as entropy generation and key management. The code includes comments for clarification on the functionality of each line.
Figure 10. Disassembled code showing key generation used by Mario's upgraded version.

These changes represent a significant upgrade in Mario's encryption.

Memory Layout and Buffer Management

When discussing memory layout and buffer management, we must understand stack frames and buffers. In this case, buffers are portions of the stack frame specified by an offset value.

The original version of Mario uses the following stack frames and buffer values during its encryption process:

  • Upgraded version stack frame size: 0x1408 bytes
  • Key buffer offsets: var_1400 (primary), var_130 (transformation)
  • Chunk size: Fixed at 0xA00000 with no dynamic adjustments

This indicates a relatively straightforward, simple process for transforming files to an encrypted state. In contrast, stack frame and buffer values for the upgraded version of Mario show a more complex structure that is smaller and more efficient:

  • Upgraded version stack frame size: 0x1268 bytes
  • Multiple buffer offsets:
    • var_1150: Primary encryption context
    • var_A0: Intermediate transformation buffer
    • var_20: Secondary key storage (8 bytes)
    • var_40: Header storage for encrypted files

These stack frame and buffer values are used in a process where:

  • Initial data is read into the primary buffer (ptr)
  • The data is transformed using the primary key at var_1150
  • It is further processed with the secondary key at var_20
  • Final encrypted data includes a header from var_40

The careful organization of these buffers confirms the layered approach of Mario's upgraded version.

File Processing

Mario's original version uses a straightforward approach to file processing. It's a linear process that encrypts the files as sequential fixed-size segments in a loop. After encrypting each segment, the code checks if the combined size of the processed segments exceeds a specified threshold. Once it passes that threshold, the code jumps from the loop to a different function.

Figure 11 illustrates this linear process in the disassembled code.

Screenshot of a computer code in an IDE, displaying lines for file size comparison and conditional jumps with comments.
Figure 11. Disassembled code showing a linear process for encryption in Mario's original version.

Code in Mario's upgraded version reveals an encryption method that uses chunk processing with dynamic sizing. Figure 12 shows an example.

A screenshot of assembly language code displayed in a text editor with highlighted syntax. The code includes various operations such as move, shift, and multiply with registers and constants.
Figure 12. Disassembled code showing chunked processing with dynamic for encryption in Mario's upgraded version.

Comparing the processing logic between these two versions, we find significant differences.

Mario's original version uses a simpler programming loop that processes files in fixed segment lengths up to a threshold of 536,870,911 bytes, as noted in Figure 11. This version simply reports when the encryption is complete without showing any progress.

In comparison, Mario's upgraded version implements a more robust file processing scheme for encryption that uses:

  • Variable segment lengths, with a size threshold of 8 GB
  • Calculations to determine chunk size and offsets
  • A sparse encryption technique where it encrypts only certain blocks of a file at specific offsets

In addition, the upgraded version of Mario displays the progress of encrypting chunks of each file, as noted below in Figure 13.

A screenshot of computer code on a dark background with syntax highlighting, indicating variables and a string that includes 'Processed chunk."
Figure 13. Disassembled code in the upgraded version of Mario to display the progress of chunk processing.

The chunked processing of Mario's upgraded version makes static analysis more difficult because:

  • It processes files non-linearly
  • It uses complex mathematical formulas to determine processing order
  • It employs different strategies based on file size

Output Format

In addition to displaying the processed chunks of files when encrypting them, Mario's upgraded version also provides a more detailed summary when the encryption of each file is finished.

As previously stated, the original version simply reports that the encryption of a file is finished. Figure 14 shows this in the disassembled code.

A screenshot of computer code with syntax highlighting, displaying various commands and a variable named 'aDoneS'. The text has a dark background and includes colors such as purple and orange for highlighting.
Figure 14. Code from the original version of Mario to report when a file is finished processing.

Mario's upgraded version includes more information when each file is finished processing, as Figure 15 below shows in the disassembled code.

Screenshot of computer code in an IDE, highlighting the command 'aDoneSLdLdLdLd' in a purple box.
Figure 15. Code from the upgraded version of Mario to report when a file is finished processing.

Ultimately, the core functionality of these two Mario samples (the original version and the upgraded version) remains the same. Both samples encrypt files and rename them by adding .emario extension. But the upgraded version implements a more complex and potentially more secure encryption methodology with selective file processing.

Conclusion

The upgrade in encryption used by RansomHouse RaaS, going from a simple linear model to a more complex multi-layered approach, signals a concerning trajectory in ransomware development. This demonstrates how threat actors are updating their techniques to enhance effectiveness.

This upgrade is built on several key technical improvements:

  • A two-factor encryption scheme that significantly increases the difficulty of decryption without both keys
  • Chunked file processing with dynamic sizing instead of a simpler method
  • The new file processing makes static analysis and reverse engineering more challenging

Threat actors could view this as a useful path for future ransomware variants. As other ransomware groups adopt these more sophisticated methods, the ransomware threat landscape will become more resilient to security controls. This upgrade underscores the need to adopt more dynamic, adaptive strategies capable of countering the next generation of complex and evasive threats.

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.
  • Cortex Xpanse and the ASM add-on for XSIAM provide detection of VMware ESXi infrastructure exposed to the public internet via “VMware ESXi” and “Insecure VMware ESXi” attack surface rules. In addition to these, there is also a post-compromise detection attack surface rule for “ESXiArgs Ransomware Infection.” This can detect ransom notes injected by malicious actors, as well as other indicators of ransomware infection impacting internet-exposed ESXi servers.

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

  • SHA256 hash: 0fe7fcc66726f8f2daed29b807d1da3c531ec004925625855f8889950d0d24d8
  • File description: Sample of the upgraded version of Mario
  • SHA256 hash: ​​d36afcfe1ae2c3e6669878e6f9310a04fb6c8af525d17c4ffa8b510459d7dd4d
  • File description: Sample of the original version of Mario
  • SHA256 hash: 26b3c1269064ba1bf2bfdcf2d3d069e939f0e54fc4189e5a5263a49e17872f2a
  • File description: MrAgent sample
  • SHA256 hash: 8189c708706eb7302d7598aeee8cd6bdb048bf1a6dbe29c59e50f0a39fd53973
  • File description: MrAgent sample

Additional Resources

 

Stay Secure: Why Cyber Hygiene Should Be Part of Your Personal Hygiene

When you hear the term “personal hygiene,” chances are you think of basic routines such as staying clean, wearing deodorant and brushing your teeth. In today’s tech-driven world, another aspect of personal hygiene deserves more attention: cyber hygiene.

Cyber hygiene refers to the routine actions and practices to stay safe in our digital world. As more of our lives move online, from banking accounts to health records to social interactions, the importance of ensuring clean, secure digital habits has never been greater.

No matter how familiar we are with cyber hygiene, we can take specific initiatives to protect ourselves. Here are three ways individuals of any experience level can work to improve their cyber hygiene habits:

The Tip for Total Beginners (And That’s Okay!)

We understand that it’s easy to reuse certain passwords to actually remember them. In fact, a Forbes study stated that 78% of Americans reuse the same password across multiple platforms. However, reusing the same password across a variety of accounts is like using the same key for one's house, car and office. The more exposure we grant that password, the greater the likelihood for a compromise.

Unit 42 recommends the use of a password manager, which securely generates, stores and autofills passwords to use across all of one’s online accounts. Password managers defend against threats effectively and only require the user to remember one master password.

For choosing passwords in general, the more random, the better. Research shows that random agglomerations of mixed-case letters, numbers and symbols form the strongest passwords. Keep passwords long – over 16 characters is recommended – and keep them unrelated to any personal data including names, birthdays or social security information.

To stay extra secure, we recommend employing multi-factor authentication (you may see it referred to across the web as MFA) when possible. It can easily double your protection and takes little effort to set up.

The Tip For People In the Know

For those already working towards maintaining strong cybersecurity hygiene, it’s critical to proactively close any remaining security gaps. This can be done through protecting against vulnerabilities in your personal devices and software.

Individuals may not think of this in terms of patch management, but it’s useful to apply a similar framework to that used by organizations. Patching refers to the activity of identifying and applying software updates designed to fix known security vulnerabilities in systems and applications. Patching doesn’t have to be overly technical; many effective steps are accessible to individual users.

Best practices for personal patch management include:

  • Regularly updating operating systems and applications
  • Removing unused browser extensions and plugins
  • Securing home networks, routers and IoT devices
  • Uninstalling unsupported or end-of-life software
  • Being aware of services or devices that might be accessible from the internet and taking action to secure them

Beyond patch management, other security measures can be taken such as:

  • Connecting to a VPN when using public Wi-Fi
  • Enabling multi-factor authentication whenever possible
  • Controlling access permissions on services or devices
  • Being mindful of what data is shared with online platforms and AI tools

It’s important to continuously monitor systems you commonly use. Ask yourself: When was the last time I completed an audit of all of the installed applications on my home computer? Or have I ever even checked if my printer’s drivers are up to date? These checks that we tend to forget about are neither complicated nor costly, and even a few minutes of attention each month can dramatically strengthen your overall cyber hygiene.

The Tip For Cybersecurity Professionals

While advanced tools and powerful frameworks play a critical role in defending against threats, their effectiveness is ultimately constrained by human behavior. The weakest link in any cybersecurity strategy is often not the system, but the human using it. People already well-versed in practicing strong cyber hygiene are already in a position to lead by example to cultivate a culture of security awareness.

Some ways to do this include:

  • Sharing helpful reminders, valuable advice and real-world experiences through social media
  • Educating friends and family on the benefits of maintaining secure cyber hygiene
  • Creating a workplace culture where people feel comfortable reporting suspicious activities or mistakes without fear of punishment

Cyber hygiene is an ever-evolving process that requires continuous growth and improvement. By staying informed about the latest threats and sharing that knowledge, we can make a significant impact in protecting both ourselves and those around us. Just like brushing our teeth, cyber hygiene is something that we should do regularly – because a secure digital life is a healthier digital life.

To dive deeper into strengthening the human side of defense, explore the 2025 Unit 42 Global Incident Response Report: Social Engineering Edition. Check out the “Recommendations for Defenders” section for actionable insights.

Exploitation of Critical Vulnerability in React Server Components (Updated December 12)

Executive Summary

Unit 42 stopped monitoring this threat and updating the brief on Jan. 30, 2025. Please refer to Vercel's website for the latest information.

Update Dec. 12, 2025

Unit 42 uncovered the previously unseen KSwapDoor. This Linux backdoor was initially mistaken for BPFDoor.

Key features include:

  • P2P mesh network: Enables multi-hop routing for robust C2 communications
  • Strong encryption: Uses AES-256-CFB with Diffie-Hellman key exchange
  • Stealth and persistence: Mimics a legitimate Linux kernel swap daemon
  • Full remote access: Offers an interactive shell, command execution, file operations and lateral movement scanning

Update Dec. 9, 2025

Unit 42 has identified activity that reportedly shares overlap with North Korean (DPRK) Contagious Interview tooling, though no formal attribution has occurred at this time. Contagious Interview is a campaign where threat actors associated with the DPRK pose as recruiters to install malware on the devices of job seekers in the tech industry.

The observed activity includes EtherRAT. The DPRK threat actor UNC5342 is reportedly utilizing the EtherHiding technique for malware delivery and cryptocurrency theft. EtherHiding leverages blockchain technology to store and retrieve malicious payloads.

Additionally, we’ve observed a previously unseen Linux backdoor KSwapDoor (previously identified as BPFDoor in this article before December 12).

Lastly, Unit 42 has detected multiple instances of a previously undocumented Auto-color backdoor. Auto-color masquerades as a legitimate Pluggable Authentication Module (PAM) library (pamssod).

Further details are in the Scope of Post-Exploitation Activity section.

Update Dec. 8, 2025

Unit 42 has observed post-exploitation activity following the exploitation of CVE-2025-55182 indicating multiple vectors of attack. This attack included initial reconnaissance that involved automated scanning for the remote code execution (RCE) vulnerability as well as Base64-encoded commands to:

  • Rapidly fingerprint compromised systems
  • Verify privilege levels
  • Map network interfaces
  • Enumerate sensitive credentials and DNS configurations
  • Retrieve malicious binaries from attacker-controlled C2

Attackers proceeded with installation activities, leveraging wget and curl to download and execute malicious scripts, including sex.sh and a Linux dropper (x86_64) designed for persistent infection. In one instance, we identified a bash reverse shell connected to a probable Cobalt Strike server.

Additionally, we observed activity consistent with an activity cluster we track as CL-STA-1015, an initial access broker (IAB) with suspected ties to the PRC’s Ministry of State Security. This activity involved the fileless execution of a malicious shell script (slt) via curl or wget, followed by the installation of SNOWLIGHT and VShell Trojans.

Further details are in the Scope of Post-Exploitation Activity section.


On Dec. 3, 2025, researchers publicly disclosed critical remote code execution (RCE) vulnerabilities in the Flight protocol used by React Server Components (RSC).

Originally, the flaw was tracked as two vulnerabilities, CVE-2025-55182 (React) and CVE-2025-66478 (Next.js). Both were assigned a maximum severity rating of CVSS 10.0.

CVE-2025-66478 has since been rejected as a duplicate of CVE-2025-55182.

The flaw allows unauthenticated attackers to execute arbitrary code on the server via insecure deserialization of malicious HTTP requests. Testing indicates the exploit has near-100% reliability and requires no code changes to be effective against default configurations. While there were no reports of exploitation in the wild as of Dec. 3, 2025, Unit 42 has since observed post-exploitation activity, as detailed in our updates.

React is heavily implemented in enterprise environments, used by roughly 40% of all developers, while Next.js is used by approximately 18%-20%. This makes it the leading server-side framework for the React ecosystem.

Palo Alto Networks Cortex Xpanse has identified the presence of over 968,000 React and Next.js instances in our telemetry.

CVE-2025-55182 impacts the React 19 ecosystem and frameworks that implement it. Specifically, it affects the following versions:

  • React: Versions 19.0, 19.1, and 19.2
  • Next.js: Versions 15.x and 16.x (App Router), as well as Canary builds starting from 14.3.0
  • Other frameworks: Any library bundling the react-server implementation, including React Router, Waku, RedwoodSDK, Parcel and Vite RSC plugins

Palo Alto Networks customers receive protections from and mitigations for CVE-2025-55182 in the following ways:

  • Cortex XDR and XSIAM agents help protect against post-exploitation activities using the multi-layer protection approach
  • Cortex Xpanse is designed to identify exposed devices and applications on the public internet and escalate these findings to defenders
  • Cortex Cloud and Prisma Cloud both have detection capabilities for cloud resources exposed to the vulnerability discussed in this brief

Palo Alto Networks also recommends upgrading to the following hardened versions immediately:

  • React: Upgrade to 19.0.1, 19.1.2, or 19.2.1
  • Next.js: Upgrade to the latest stable patched versions, including 16.0.7, 15.5.7, 15.4.8, 15.3.6, 15.2.6, 15.1.9 or 15.0.5

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

Vulnerabilities Discussed CVE-2025-55182, CVE-2025-66478

Details of the Vulnerability: CVE-2025-55182 (React)

CVE-2025-55182 is classified as Critical (CVSS 10.0) and is caused by insecure deserialization within the RSC architecture, specifically involving the Flight protocol.

The vulnerability resides in the react-server package and its implementation of the RSC Flight protocol. It is a logical deserialization flaw where the server processes RSC payloads safely.

When a server receives a specially crafted, malformed HTTP payload (typically through data delivered in a POST request), it fails to correctly validate the structure of the data. Because of this insecure deserialization, the server allows attacker-controlled data to influence server-side execution logic.

This results in RCE, allowing an attacker to execute arbitrary privileged JavaScript code on the server.

Attack Vector and Exploitability

  • Attack complexity: The attack complexity is low. It requires no user interaction and no privileges (unauthenticated).
  • Target endpoints: The attack targets React Server Function endpoints.
    • Critical nuance: Even if an application does not strictly implement or use React Server Functions, it remains vulnerable if the application supports React Server Components generally.
  • Reliability: Testing has shown the exploit has near-100% reliability.
  • Default configuration: The vulnerability is present in default configurations. For example, a standard Next.js application created with create-next-app and built for production is exploitable without any code changes by the developer.

Specific Affected Components

While generally described as affecting React and Next.js, the vulnerability technically exists within specific underlying packages that handle server-side rendering and module loading.

Affected Packages

The vulnerability is present in versions 19.0.0, 19.1.0, 19.1.1 and 19.2.0 of the following packages:

  • react-server-dom-webpack
  • react-server-dom-parcel
  • react-server-dom-turbopack

Affected Framework Implementations

Any framework bundling these packages is affected:

  • Next.js: Versions 15.x and 16.x (App Router), as well as Canary builds starting from 14.3.0-canary.77
  • Other ecosystems: React Router, Waku, RedwoodSDK, Parcel and the Vite RSC plugin are all affected if they use the vulnerable React packages

Scope of Post-Exploitation Activity

Unit 42 has observed interactive sessions related to the exploitation of CVE-2025-55182, including:

  • Scanning for servers vulnerable to RCE
  • Reconnaissance
  • Attempted theft of cloud credential configuration and credential files
  • Installation of downloaders to retrieve payloads from attacker command and control (C2) infrastructure
  • Attempting to install Cobalt Strike
  • Malicious dropper scripts
  • Cryptomining software
  • Interactive web shells masquerading as a React File Manager
  • Executing EtherRAT
  • Executing and installing Noodle RAT
  • IAB activity
  • Executing SNOWLIGHT and VShell findings

Scanning

We are observing automated scanning for the RCE vulnerability:

Attacker reconnaissance has been observed in the form of passing Base64-encoded commands for gathering immediate situational awareness after compromising a system. Attackers rapidly fingerprint the operating system and architecture (uname), verify their current privilege level (id) and map network interfaces (hostname).

The sequence concludes by enumerating the file system for sensitive credentials and analyzing DNS configurations (resolv.conf) to identify cloud environments or internal targets for lateral movement.

The format for running reconnaissance commands is:

The decoded Base64 command runs the following reconnaissance commands:

Commodity Malware Installation Activity

Unit 42 has observed multiple clusters of activity related to the deployment of cryptomining software, as well as other commodity malware loaders.

In one instance, attackers passed a download-and-execute attack sequence using wget to retrieve a malicious script (named sex.sh) from an attacker-controlled C2 server. The attacker employed the && operator to create a conditional chain, ensuring that the malicious script is passed to the bash interpreter for immediate execution only after it has been successfully downloaded to disk.

In another, an automated script was used to ​​perform data theft, verification, and install multiple malware downloaders consistent with internet-of-things (IoT) activity such as a Mirai botnet.

The defanged commands are:

Figure 1 shows the attack flow of the XMRIG deployment as seen in Cortex XDR.

Cortex XDR process tree for deployment of malware. Screenshot shows two filepaths at seperate execution points. The path is marked with icons of warning symbols, showing the attack flow.
Figure 1. Attack flow of XMRIG deployment.

Figure 2 is an alert notification in Cortex XDR for XMRig activity.

Screenshot of Cortex XDR alert. Some information is redacted. The crypto miner pool communication has been blocked and the alert is categorized as malware.
Figure 2. Cortex XDR alert for XMRig activity.

In one observation, the attacker installed a dropper designed to infect Linux systems. The dropper uses a redundant logic block to ensure the payload is delivered. It first attempts to curl the binary with flags to silence output and follow redirects, and falls back to wget if the first tool is missing or fails.

Upon successful download to the /tmp directory, the script executes a chain of commands to make the file universally executable. It then immediately launches the payload, establishing the infection without user intervention.

The defanged command for this is:

Cloud and Container Exploit Attempts

Unit 42 also observed React2Shell exploit attempts across major cloud platforms. These targeted cloud instances hosted containers, including Kubernetes, running applications vulnerable to CVE-2025-55182 via integrated React components.

The operations involved command-line execution of wget, curl, chmod and other utilities either directly or though through the BusyBox binary, resulting in attackers attempting to install Mirai loaders and other payloads.

Although attackers made attempts to install these files, their malicious downloads were blocked, preventing execution.

Cobalt Strike

Unit 42 observed a threat actor leveraging a bash reverse shell to connect to a probable Cobalt Strike server:

Additionally, Unit 42 observed a remote execution of a bash script named check.sh from 154.89.152[.]240. As shown in Figure 3, the script is responsible for downloading another binary from the same address named a_x64, which was saved under the name rsyslo.

The payload appears to be a Cobalt Strike agent that was created using CrossC2, an extension tool to create Cobalt Strike Beacon for Linux OS. Figure 3 shows the process in Cortex XDR.

Cortex XDR process tree for deployment of malware. Screenshot shows two filepaths at separate execution branches. The path is marked with icons of warning symbols, showing the attack flow.
Figure 3. Attack flow of Cobalt Strike deployment.

Figure 4 shows what the alert for Cobalt Strike activity looks like in Cortex XDR.

Screenshot of Cortex XDR alert. Some information is redacted. The execution of a dropped binary is blocked and the alert is categorized as malware.
Figure 4. Cortex XDR alert for Cobalt Strike activity.

Web Shell Activity

We observed attackers installing an interactive web shell disguised as a React File Manager (fm.js) retrieved directly from GitHub. This web shell enables the browsing of directories to harvest sensitive configuration files, such as database passwords and API keys, while facilitating data exfiltration through a built-in download function to steal source code or customer data.

The tool supports persistent compromise by allowing the upload of additional backdoors or rootkits and grants the ability to inflict irreversible damage through bulk file deletion and direct system command execution.

The actor initiated the sequence by preemptively terminating existing node processes to eliminate port conflicts, followed by execution validation to confirm arbitrary code execution. The script stages a Node.js web shell payload in the /tmp directory. It employs heuristic network adaptation by iteratively modifying the configuration to cycle through various listening ports, attempting to circumvent local firewall policies.

The attack concludes by establishing ephemeral persistence via nohup and deploying unique verification artifacts (segawon.txt) to common web directories, enabling external validation of the compromise and mapping of the server’s file structure.

EtherRAT

Unit 42 has observed activity consistent with EtherRAT, which performs the following activities:

DPRK threat actor UNC5342 is reportedly using EtherHiding to deliver malware and facilitate cryptocurrency theft.

Noodle RAT

Unit 42 observed the deployment of Noodle RAT, a backdoor confirmed to have both Windows and Linux versions and suspected to be used by Chinese-speaking groups engaged in either espionage or cybercrime.

Auto-Color

Unit 42 has observed multiple instances of a previously unseen Auto-color backdoor across multiple environments, malware we originally published about in February 2025. The filename associated with this backdoor, pamssod, masquerades as the legitimate Pluggable Authentication Module (PAM) library.

Auto-color was observed in the following times and locations:

  • Early 2025 targeting Asian and North American universities and government organizations
  • April 2025 on the network of a US-based chemicals company
  • August 2025 in exploitation of CVE‑2025‑31324

CL-STA-1015 Activity

Unit 42 observed post-exploitation threat activity we assess with high confidence is consistent with an activity cluster we track as CL-STA-1015. This threat actor was assessed with medium confidence to be a Chinese state-sponsored Initial Access Broker according to Google Threat Intelligence Group.

Attackers executed a command to retrieve and immediately execute a malicious shell script payload labeled slt from a remote C2 server. Consistent with previously seen activity, attackers employed a fail-safe logic using the OR operator:

  • The system first attempts the download using curl with flags optimized for stealth (-fsSL to suppress output and follow redirects) and resilience (-m180 to prevent hanging).
  • If curl is unavailable or fails, it automatically falls back to wget with similar quiet and timeout parameters.
  • The command concludes by piping the downloaded content directly into sh, enabling fileless execution where the malicious script runs immediately in memory without necessarily writing a persistent file to the disk.

The defanged command for this is:

Following the above command, we observed the successful creation of two malicious files on the file system consistent with SNOWLIGHT and determined through analysis that the below VShell sample also resided on the same server:

SNOWLIGHT is a stealthy malware dropper seen in CL-STA-1015 activity. Its primary function is to infiltrate a compromised Linux system then download and execute additional, more powerful malware. Most notably, it downloads the VShell RAT. VShell is popular among Chinese-speaking cybercriminals in several forums, and its main developer is also a Chinese speaker.

KSwapDoor 

Upon further analysis, Unit 42 has discovered that what we previously identified as BPFDoor, is in fact a previously unseen Linux backdoor targeting servers that we are calling KSwapDoor. KSwapDoor implements a sophisticated P2P mesh network allowing multi-hop routing between infected nodes, uses AES-256-CFB encryption with Diffie-Hellman key exchange for C2 communications, and includes dormant passive packet sniffer code for potential firewall bypass. It provides full remote access capabilities including interactive shell, command execution, file operations, and lateral movement scanning. 

Key Findings:

  • Stealth & Masquerade: Upon execution, the binary renames itself to [kswapd1], mimicking a legitimate Linux kernel swap daemon. It fully daemonizes by double-forking, creating a new session (setsid()), and redirecting all standard I/O to /dev/null.
  • Obfuscation: Almost all critical strings and configuration data are protected using RC4 encryption. The malware decrypts these strings at runtime using key scheduling functions (sub_410A41 and sub_410B8D).
  • Persistence & Configuration: It stores its configuration in an RC4-encrypted file within the user’s home directory. During initialization, it reads and decrypts this file to locate Command & Control targets.
  • Resilience: The malware creates a watchdog loop that spawns and monitors child processes, automatically restarting them if they crash. It also utilizes a staging directory at /tmp/appInsight.

Interim Guidance

Required actions: Immediate patching is the only definitive mitigation.

Engineering and security teams should upgrade to the following hardened versions immediately:

  • React: Upgrade to 19.0.1, 19.1.2, or 19.2.1
  • Next.js: Upgrade to the latest stable patched versions, including 16.0.7, 15.5.7, 15.4.8, 15.3.6, 15.2.6, 15.1.9 or 15.0.5

For the latest updates on this vulnerability, please see the documentation provided by the vendor:

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 post-compromise activity. During analysis, a low number of false positives were identified. We recommend reviewing the child processes spawned by the node process. Look for suspicious file operations, network operations, reconnaissance commands or code execution, such as the commands observed above.

Conclusion

The immediate and expansive exploitation of this vulnerability highlights the speed at which threat actors move to seize on opportunities. While we have noted China-nexus activity, the footprint of activity will encompass significant amounts of cybercriminal motivations as well.

Specifically of note, CL-STA-1015 (aka UNC5174) has a history of rapid exploitation of N-day vulnerabilities:

The critical distinction of this vulnerability is its nature as a deterministic logic flaw in the Flight protocol, rather than a probabilistic error. Unlike memory corruption bugs that may fail, this flaw guarantees execution, transforming it into a reliable system-wide bypass for attackers. Amplified by the massive footprint of Next.js in enterprise environments, this creates a direct conduit to sensitive internal data.

Ultimately, this incident underscores the inherent friction between performance and security in modern architecture. While React Server Components optimize data fetching and search engine optimization (SEO) by moving logic closer to the source, they simultaneously move the attack surface closer to organizations’ most sensitive and valuable data.

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 for CVE-2025-55182

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

Next-Generation Firewalls With Advanced Threat Prevention

Next-Generation Firewall with the Advanced Threat Prevention security subscription can help block the attacks via the following Threat Prevention signatures: 96779, 96780, and 96787.

Cloud-Delivered Security Services for the Next-Generation Firewall

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

Cortex XDR and XSIAM

Cortex XDR and XSIAM agents help protect against post-exploitation activities using the multi-layer protection approach.

Cortex has released a response pack and playbook for CVE-2025-55182 (React) and CVE-2025-66478 (Next.js) to help automate and speed the mitigation process.

This playbook automates the following tasks:

  • Collecting indicators from the Unit 42 article
  • Detecting any suspicious command lines indicative of exploitation of these vulnerabilities via an XQL query
  • Investigating the command lines to identify malicious indicators related to the vulnerabilities
  • Hunting for malicious indicators via an XQL query
  • Isolating compromised React and Next.js servers (requires analyst approval)
  • Blocking malicious indicators
  • Providing mitigation recommendations

Cortex Xpanse

Cortex Xpanse is designed to identify exposed devices and applications on the public internet and escalate these findings to defenders. Customers can enable alerting on assets that are potentially at risk by ensuring that the Vercel Next.js Attack Surface Rule is enabled.

Additionally, Xpanse has published an Attack Surface test for CVE-2025-55182. This validates the vulnerability via an RCE direct check by attempting to execute a benign command payload compatible with both Linux and Windows systems.

Notably, these React and Next.js applications do not publicly expose software version details, meaning these detections are not a strong indicator of a vulnerable application. These detections are also available for Cortex XSIAM customers who have purchased the ASM module.

Cortex Cloud

Cortex Cloud provides comprehensive ASPM capabilities to rapidly identify the reach of CVE-2025-55182 and CVE-2025-66478 across your application landscape. Through real-time SBOM visibility, security teams can instantly query their software inventory to pinpoint specific instances of vulnerable React (versions 19.0–19.2) and Next.js (versions 15.x–16.x) packages. The platform’s Operational Risk model further aids in prioritization by evaluating component health and flagged risks. Crucially, teams can enforce prevention-first guardrails to automatically block builds that contain these critical vulnerabilities. This ensures that no application relying on the unsanctioned or unpatched Flight protocol implementation can ever be deployed, effectively stopping the RCE vector from entering your environment.

Prisma Cloud

Prisma Cloud detects the presence of these critical vulnerabilities within your codebase, registries, and runtime environments. The platform’s vulnerability scanner specifically identifies the use of the affected react-server and next packages associated with CVE-2025-55182 and CVE-2025-66478. Beyond detection, you can configure enforcement rules to actively block builds and deployments if these high-severity findings are detected. By surfacing these risks and enforcing a fail-threshold for critical CVEs, Prisma Cloud enables teams to prevent the release of applications running susceptible versions, ensuring that only the hardened, patched frameworks reach production.

Indicators of Compromise

  • 140[.]99[.]223[.]178 
  • 156[.]234[.]209[.]103
  • 38[.]162[.]112[.]141
  • 45[.]32[.]158[.]54
  • 46[.]36[.]37[.]85
  • 47[.]84[.]79[.]46
  • 95[.]169[.]180[.]135
  • hxxp://45.134.174[.]235/2.sh
  • hxxp://45.134.174[.]235/solra
  • hxxp://46[.]36[.]37[.]85:12000/sex[.]sh
  • hxxp://115[.]42[.]60[.]223:61236/slt
  • hxxp://45[.]32[.]158[.]54/5e51aff54626ef7f/x86_64
  • hxxp://115[.]42[.]60[.]223:61236/slt
  • hxxp://156[.]234[.]209[.]103:20912/get[.]sh
  • hxxp://156[.]234[.]209[.]103:20913/get[.]sh
  • hxxp://45[.]32[.]158[.]54/5e51aff54626ef7f/x86_64
  • hxxp://46[.]36[.]37[.]85:12000/sex[.]sh
  • hxxp://95[.]169[.]180[.]135:8443/pamssod
  • hxxp://res[.]qiqigece[.]top/nginx1
  • hxxps://raw[.]githubusercontent[.]com/C3Pool/xmrig_setup/master/setup_c3pool_miner[.]sh
  • hxxps://sup001[.]oss-cn-hongkong[.]aliyuncs[.]com/123/python1[.]sh
  • reactcdn[.]windowserrorapis[.]com
  • res[.]qiqigece[.]top
  • ebdb85704b2e7ced3673b12c6f3687bc0177a7b1b3caef110213cc93a75da837
  • f88ce150345787dd1bcfbc301350033404e32273c9a140f22da80810e3a3f6ea
  • fc9e53675e315edeea2292069c3fbc91337c972c936ca0f535da01760814b125

KSwapDoor

  • hxxp://140.99.223[.]178/32736 
  • 1f3f0695c7ec63723b2b8e9d50b1838df304821fcb22c7902db1f8248a812035 

EtherRAT

  • hxxp://193.24.123[.]68:3001/gfdsgsdfhfsd_ghsfdgsfdgsdfg.sh 

Noodle RAT

  • 192.238.202[.]17 
  • tcp://vip[.]kof97.lol:443 
  • hxxp://146.88.129[.]138:5511/443nb64 
  • 33641bfbbdd5a9cd2320c61f65fe446a2226d8a48e3bd3c29e8f916f0592575f 

SNOWLIGHT

  • 115[.]42[.]60[.]223 
  • a455731133c00fdd2a141bdfba4def34ae58195126f762cdf951056b0ef161d4 
  • 1663d98c259001f1b03f82d0c5bee7cfd3c7623ccb83759c994f9ab845939665 
  • 18c68a982f91f665effe769f663c51cb0567ea2bfc7fab6a1a40d4fe50fc382b 
  • 1a3e7b4ee2b2858dbac2d73dd1c52b1ea1d69c6ebb24cc434d1e15e43325b74e 
  • 1cdd9b0434eb5b06173c7516f99a832dc4614ac10dda171c8eed3272a5e63d20 
  • 1e31dc074a4ea7f400cb969ea80e8855b5e7486660aab415da17591bc284ac5b 
  • 2b0dc27f035ba1417990a21dafb361e083e4ed94a75a1c49dc45690ecf463de4 
  • 2ca913556efd6c45109fd8358edb18d22a10fb6a36c1ab7b2df7594cd5b0adbc 
  • 4ff096fbea443778fec6f960bf2b9c84da121e6d63e189aebaaa6397d9aac948 
  • 55ae00bc8482afd085fd128965b108cca4adb5a3a8a0ee2957d76f33edd5a864 
  • 62e9a01307bcf85cdaeecafd6efb5be72a622c43a10f06d6d6d3b566b072228d 
  • 7d25a97be42b357adcc6d7f56ab01111378a3190134aa788b1f04336eb924b53 
  • 7f05bad031d22c2bb4352bf0b6b9ee2ca064a4c0e11a317e6fedc694de37737a 
  • 9c931f7f7d511108263b0a75f7b9fcbbf9fd67ebcc7cd2e5dcd1266b75053624 
  • ac2182dfbf56d58b4d63cde3ad6e7a52fed54e52959e4c82d6fc999f20f8d693 
  • ac7027f30514d0c00d9e8b379b5ad8150c9827c827dc7ee54d906fc2585b6bf6 
  • b38ec4c803a2d84277d9c598bfa5434fb8561ddad0ec38da6f9b8ece8104d787 
  • bc31561c44a36e1305692d0af673bc5406f4a5bb2c3f2ffdb613c09b4e80fa9f 
  • bf602b11d99e815e26c88a3a47eb63997d43db8b8c60db06d6fbddf386fd8c4a 
  • d704541cde64a3eef5c4f80d0d7f96dc96bae8083804c930111024b274557b16 
  • d9313f949af339ed9fafb12374600e66b870961eeb9b2b0d4a3172fd1aa34ed0 
  • e2d7c8491436411474cef5d3b51116ddecfee68bab1e15081752a54772559879 

VShell

  • 4a759cbc219bcb3a1f8380a959307b39873fb36a9afd0d57ba0736ad7a02763b 

Additional Resources

Updated Dec. 8, 2025, at 3:45 p.m. PT to add significant updates. These include a Post-Exploitation Activity section and product coverage. New activity covers: scanning and reconnaissance, cloud credential theft, malicious dropper scripts, cryptomining, deployment of backdoor Noodle RAT, execution of SNOWLIGHT and VShell and Chinese-linked activity. 

Updated Dec. 9, 2025, at 2:00 p.m. PT to add significant updates. These include additional details in the Post-Exploitation Activity section. New subsections include information on: Activity that shares overlaps with DPRK tooling using EtherRAT; BPFDoor, a Linux backdoor; and a new Auto-color variant (a Linux backdoor). Updated the Indicators of Compromise section. Added a new Threat Prevention signature.

Updated Dec. 10, 2025, at 1:30 p.m. PT to add subsection on React2Shell exploit attempts in the Post-Exploitation Activity section. Added Cortex XDR playbook coverage and information. 

​​Updated Dec. 11, 2025, at 1:30 p.m. PT to add script to subsection on React2Shell exploit attempts in the Post-Exploitation Activity section. Amended Cortex Xpanse language.

​​Updated Dec. 12, 2025, at 1:40 p.m. PT to change language surrounding CL-STA-1015 attribution, and update BPFDoor name to KSwapDoor with additional details. 

​​Updated Dec. 15, 2025, at 2:00 p.m. PT to add update on KSwapDoor to Executive Summary section. Made small changes for clarity. 

Updated Dec. 21, 2025, at 2:45 p.m. PT to further defang IoC sections.

Hamas-Affiliated Ashen Lepus Targets Middle Eastern Diplomatic Entities With New AshTag Malware Suite

Executive Summary

In recent months, we have been analyzing the activity of an advanced persistent threat (APT) known for its espionage activities against Arabic-speaking government entities. We track this Middle Eastern threat actor as Ashen Lepus (aka WIRTE).

We share details of a long-running, elusive espionage campaign targeting governmental and diplomatic entities throughout the Middle East. We discovered that the group has created new versions of their previously documented custom loader, delivering a new malware suite that we have named AshTag. The group has also updated their command and control (C2) architecture to evade analysis and blend in with legitimate internet traffic.

Ashen Lepus remained persistently active throughout the Israel-Hamas conflict, distinguishing it from other affiliated groups whose activities decreased over the same period. Ashen Lepus continued with its campaign even after the October 2025 Gaza ceasefire, deploying newly developed malware variants and engaging in hands-on activity within victim environments.

This campaign highlights a tangible evolution in Ashen Lepus's operational security and tactics, techniques and procedures (TTPs). While its operations over the years have demonstrated only moderate sophistication, the group has recently adopted more advanced tactics that include:

  • Enhanced custom payload encryption
  • Infrastructure obfuscation using legitimate subdomains
  • In-memory execution to minimize forensic artifacts

Palo Alto Networks customers are better protected from the threats described in this article 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 Malware, Threat Actor Groups

Ashen Lepus Background

We investigated a campaign waged by a Hamas-affiliated threat group that has been active since 2018. Their operations focus on cyber-espionage and intelligence collection, targeting government entities across the Middle East.

We attribute this activity with high confidence to Ashen Lepus. Our attribution is based on Unit 42's Attribution Framework, and takes into account the network infrastructure, modus operandi and malware that the group has used throughout their campaigns. The attribution artifacts are detailed in Appendix A.

Ashen Lepus Ops: Victimology and Motivation

Ashen Lepus is known for targeting entities in close geographical proximity, such as the Palestinian Authority, Egypt and Jordan. Recent campaigns show a significant expansion in operational scope – according to recent uploads to VirusTotal, the group is now targeting entities in other Arabic-speaking nations, including Oman and Morocco.

Despite the broader geographic footprint seen in their recent attacks, the group's lure themes remain largely consistent. The majority of lure themes continue to relate to Middle East geopolitical affairs, mainly those involving the Palestinian Territories. However, the current campaign shows an increase in lures related to Turkey and its relationship with the Palestinian administration. Table 1 details these themes.

Lure Theme Machine Translation
اتفاقية الشراكة بين المغرب وتركيا Partnership agreement between Morocco and Turkey
1302 وزير الدفاع التركي غيرنا استراتيجيتنا في مكافحة التنظيمات الارهابية 1302 Turkish Minister of Defense We changed our strategy in combating terrorist organizations
أنباء عن تدريب عناصر من حماس في سوريا تحديدا في الجنوب بدعم تركي Reports of Hamas elements training in Syria, specifically in the south, with Turkish support
تقرير عن مقترح حماس لتوحيد السلاح الفلسطيني تحت مظلة السلطة Report on Hamas's proposal to unify Palestinian arms under the umbrella of the Authority
مشاريع القرارات الخاصة بدولة فلسطين سري للغاية Draft resolutions concerning the State of Palestine Top Secret

Table 1. Lure themes used in a recent Ashen Lepus campaign.

Breaking Down Ashen Lepus’s Recent Campaign Developments

Decoy Archive Analysis

​​Since at least 2020 [PDF], Ashen Lepus has employed a consistent, multi-stage infection chain delivering a new malware suite that we call AshTag. The chain typically starts with a benign PDF decoy file that guides targets to a file-sharing service to download a RAR archive containing a malicious payload. Figure 1 shows two lure examples, relating to discussions conducted by the League of Arab States and United Nations Security Council.

A scanned image of a two-page document written in Arabic, featuring the crest of Saudi Arabia at the top of the first page. The document appears to be formal, possibly a government or legal document.
Figure 1. Lure examples presented to targets.

Downloading and opening the RAR archive initiates the chain of events that leads to an infection. This infection involves the following three files:

  • A binary file masquerading as a sensitive or political document
  • A malicious loader, which runs in the background
  • An additional decoy PDF file named Document.pdf

When the targeted individual runs the binary in order to read the article, the binary side-loads the first malicious loader (netutils.dll), which in turn opens the decoy PDF file for viewing. Figure 2 illustrates the initial infection chain in Cortex XDR, showing alerts triggered by the Windows executables responsible for DLL side-loading and persistence.

Cortex XDR diagram illustrating a multi-stage malware infection process. The stages are labeled 'Loader' and an unidentified Arabic script, 'Stager executing final payload,' and 'Stager and payload persistence'. Each stage is marked with a warning triangle symbol.
Figure 2. AshTag's initial infection chain and persistence, as seen in Cortex XDR.

C2 Architecture Evolution

Comparing this campaign with past campaigns shows that there has been a change in the group's C2 domain naming convention. Instead of hosting its C2 servers on its own domains, the group now registers new API and authentication-related subdomains of legitimate domains. This change is part of the group’s shift to adopt better operational security (OpSec), and helps its activity blend in with benign network activity. The domains often have technology or medical themes, such as api[.]healthylifefeed[.]com, api[.]softmatictech[.]com and auth[.]onlinefieldtech[.]com.

We also observed a clear separation between different servers for different tools within the execution chain. The domains have varying formats and are hosted in multiple autonomous system numbers (ASNs). Since the servers are geofenced, automatic analysis tools cannot execute the entire chain to link between the different stages.

In this campaign, the group took several cautionary measures to avoid detection and analysis. For instance, the secondary payloads are embedded within HTML tags of a seemingly benign webpage. Also, the C2 server performs initial checks on the victim's endpoint, to avoid sending the payload to sandbox environments. The server checks the victim’s geolocation, and checks specific User-Agent strings in the traffic that are unique to the malware.

The New AshTag Malware Suite and Campaign Evolution

The AshTag campaign marks a significant upgrade to the group's traditional tooling. In previous campaigns, the actors did not deliver a full payload, and instead terminated the parent process using a simple .NET DLL. We assess that previous campaigns observed in the wild were a testing phase in the development of the attack chain. However, in this campaign, Ashen Lepus is deploying a more sophisticated, fully featured malware suite, which we have named AshTag. Unit 42 designates the name “Lepus” to threat groups associated with the Palestinian Territories, and we labeled the malware components “Ash” to reflect the basic, gritty attack resources that accumulate to choke system defenses, allowing the full attack to take hold.

AshTag is a modular .NET toolset currently in active development, with extensive features, including file exfiltration, content download and in-memory execution of additional modules.

The AshTag infection chain unfolds as follows:

  • A targeted victim clicks the binary file, expecting to open a document.
  • The binary file side-loads a DLL in the background. This DLL is the first malicious loader, which we call AshenLoader.
  • AshenLoader opens the decoy PDF document on the desktop.
  • In the background, AshenLoader retrieves and runs another side-loaded DLL: a stager that we call AshenStager.
  • AshenStager retrieves and runs the AshTag payload.
  • AshenStager also sets its persistence via a scheduled task, executed by svchost.exe.

Figure 3 depicts the complete attack chain.

Flowchart detailing the operation of the AshTag Malware Suite, starting with a deceptive PDF lure linked in an email, progressing through multiple stages of file execution and loading, and culminating in tasks like orchestration, shellcode injection, and file collection for persistence.
Figure 3. The full AshTag Malware infection chain.

Initial Loader Execution Flow

When AshenLoader is executed, it tries to collect and send initial reconnaissance data to the attacker’s C2 server. The AshenStager payload is embedded within the C2’s webpage, between the custom <headerp> HTML tags – an embedding method that has been documented in the past. In addition to these similarities, we identified new features of AshenLoader, described in Appendix B.

AshenLoader retrieves and executes a stager that we dub AshenStager. In past campaigns, this stager was named Stager-X64, following its internal naming by the attackers. We now track AshenStager as part of the AshTag malware suite. AshenStager is side-loaded by a legitimate executable paired with a malicious custom DLL, named wtsapi32.dll.

AshenStager is designed to send an HTTP request to its C2 server, where it parses the HTML response to extract another encrypted payload that is hidden within <article> tags. After extracting the payload, AshenStager decodes, parses and injects the payload in memory. The final payload in this chain is a malware suite, which is orchestrated by a tool that we call AshenOrchestrator. Figure 4 shows the orchestrator’s Base64-encoded payload embedded in HTML content from the C2 server.

A screenshot showing a section of HTML code highlighting an article class with a long alphanumeric identifier within a 'services' section.
Figure 4. AshenOrchestrator’s Base64-encoded payload embedded within the article HTML tags.

AshTag Malware Suite

AshTag is a modular .NET backdoor designed for stealthy persistence and remote command execution. AshTag masquerades as a legitimate VisualServer utility to evade suspicion. In reality, this backdoor is a multi-feature malware suite that uses AshenOrchestrator to conduct communication and to execute other payloads in memory.

When AshenStager retrieves AshenOrchestrator’s payload, the stager receives a Base64-encoded JSON file. The JSON file contains the payload and the payload’s configuration. The configuration contains parameters such as specific URL paths that lead to different modules, encryption keys and the C2 domain. The configuration also includes sleep time buffers (jitter), mn and mx, which are used to avoid detection of the C2 beaconing. Figure 5 shows an example of such a configuration.

Screenshot of a code snippet with various elements identified in red boxes and by arrows. These include the C2 domain, the User Agent parameters, minimum and maximum jitter, C2 URL paths with additional modules and lastly, the encrypted XOR key.
Figure 5. Decoded AshenOrchestrator configuration.

Like most of the tools used in this campaign, AshenOrchestrator extracts its next payload from embedded HTML tags. However, in this instance, the payload is even more well hidden. Instead of using a hardcoded tag name, the stager searches for a specific commented-out tag within the HTML page that contains the relevant tag name. Figure 6 demonstrates the payload embedding scheme.

A screenshot collage displaying a webpage with coding elements, highlighting "XOR-encrypted payload" and "Base64 module + parameters" in red. The multiple panels show HTML and JSON code.
Figure 6. AshTag module decoding process.

AshenOrchestrator creates a unique AES key from the tg and au parameters, and decrypts the xrk XOR encryption key. The decrypted XOR key is then used to decrypt the embedded HTML value that contains the payload. The payload itself is a specific module contained in another Base64-encoded JSON that has additional configuration parameters. These parameters determine the module’s loading method name (mna) and class name (cn). Table 2 lists the different class names that AshenOrchestrator expects and their inferred functionalities.

Class Name (cn) Inferred Purposes
PR1, PR2, PR3 Persistence

Process Management

UN1, UN2, UN3 Uninstall

Update

Removal

SCT Screen Capture 
FE File Explorer

File Management

SN System Fingerprinting 

Table 2. Different Ashen modules and their inferred purposes.

The mna value dictates the action that AshenOrchestrator performs for each module that it retrieves. There are four possible actions:

  • Upload additional content
  • Download the module to disk
  • Execute the module as a .NET assembly
  • Inject the module into memory

Analyzing the injection method revealed that its code was not actually implemented, and only returned false, indicating that certain aspects of the AshTag malware suite are still in active development.

Retrieving the different modules for analysis was a complicated task, in part because Ashen Lepus appears to be actively rotating the modules that are hidden within webpage content. This would explain why not all modules are available at the same time. In addition, we found that different encryption keys open different types of modules.

Despite these complicating factors, we were able to retrieve one of the modules responsible for system fingerprinting – internally named the SN module. The module is an extremely simple .NET program that executes WMI queries and sends a unique victim ID back to the attackers. Figure 7 shows the main function of the SN module.

Screenshot of a computer code in a text editor with dark background with syntax highlighting.
Figure 7. Code from the SN fingerprinting module.

We identified the threat actor’s operations in our telemetry, which indicated that they used additional modules to stage and exfiltrate files.

Ashen Lepus's Hands-On Activity

Following the initial automated infection, the threat actor accessed the compromised system to conduct hands-on data theft. A few days after the original infection, the attackers loaded a custom module via AshenOrchestrator and began staging specific documents in the C:\Users\Public folder.

Our analysis indicates that the threat actor downloaded these documents directly from a victim’s mail accounts, revealing the group’s main objective: obtaining specific, diplomacy-related documents. This aligns with past reports of the group’s practice of obtaining intelligence relating to regional geopolitical conflicts.

To exfiltrate the staged files, Ashen Lepus downloaded the Rclone open-source tool, transferring the data to an attacker-controlled server. This appears to be the first time this threat group has been observed using Rclone for data exfiltration. In doing so, Ashen Lepus joins a growing number of actors who leverage legitimate file transfer tools to blend their malicious activity with benign network traffic and avoid detection.

Conclusion

Ashen Lepus remains a persistent espionage actor, demonstrating a clear intent to continue its operations throughout the recent regional conflict unlike other affiliated threat groups, whose activity significantly decreased. The threat actors’ activities throughout the last two years in particular highlight their commitment to constant intelligence collection.

During this campaign, Ashen Lepus has begun to deliver its new malware suite, AshTag. AshTag is a modular .NET suite, capable of data exfiltration, command execution and in-memory payload execution.

While the group's core TTPs are not highly sophisticated, this campaign reveals an evolution in its approach. We observed a clear effort to improve operational security by enhancing payload encryption, shifting infrastructure to innocent-looking subdomains and executing payloads in memory. This "low-cost, high-impact" methodology allows the threat actors to effectively evade static defenses and thwart analysis.

The expansion of Ashen Lepus’s victimology beyond their traditional geographic targets, coupled with new lure themes, suggests a broadening of its operational scope. We assess that Ashen Lepus will continue to adapt its toolset and targeting to pursue its geopolitical intelligence objectives. Organizations in the Middle East, particularly in the governmental and diplomatic sectors, should remain vigilant against this evolving threat.

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

  • 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.
  • Cortex XDR and XSIAM
    • Cortex XDR helps to prevent the threats described in this blog, 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 help prevent both known and unknown malware from causing harm to endpoints.

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

SHA256 Hashes of Malware Samples

RAR Archives

  • 3502c9e4896802f069ef9dcdba2a7476e1208ece3cd5ced9f1c4fd32d4d0d768
  • 1f3bd755de24e00af2dba61f938637d1cc0fbfd6166dba014e665033ad4445c0
  • 4e1f7b48249dd5bf3a857d5d017f0b88c0372749fa156f5456056767c5548345
  • 3d445c25752f86c65e03d4ebed6d563d48a22e424ba855001ad2db2290bf564c
  • 7e5769cd8128033fc933fbf3346fe2eb9c8e9fc6aa683546e9573e7aa01a8b6b

AshenLoader Variant #1

  • f554c43707f5d87625a3834116a2d22f551b1d9a5aff1e446d24893975c431bc - dwampi.dll
  • a17858f40ff506d59b5ee1ba2579da1685345206f2c7d78cb2c9c578a0c4402b - dwampi.dll
  • ebe3b6977f66be30a22c2aff9b50fec8529dfa46415ea489bd7961552868f6b5 - dwampi.dll
  • 8870bd358d605a5685a5f9f7785b5fee5aebdcb20e4e62153623f764d7366a3c - dwampi.dll
  • 2d71d7e6ffecab8eefa2d6a885bcefe639fca988bdcac99e9b057e61698a1fd6 - dwampi.dll
  • 8c44fa9bf68341c61ccaca0a3723945543e2a04d9db712ae50861e3fa6d9cc98 - wtsapi32.dll
  • f380bd95156fbfb93537f35941278778819df1629cb4c5a4e09fe17f6293b7b7 - wtsapi32.dll

AshenLoader Variant #2

  • f9816bc81de2e8639482c877a8defcaed9b15ffdce12beaef1cff3fea95999d4 - srvcli.dll
  • e71a292eafe0ca202f646af7027c17faaa969177818caf08569bd77838e93064 - srvcli.dll
  • 739a5199add1d970ba22d69cc10b4c3a13b72136be6d45212429e8f0969af3dc - netutils.dll
  • b00491dc178a3d4f320951bccb17eb85bfef23e718b4b94eb597c90b5b6e0ba2 - netutils.dll

AshenStager

  • 6bd3d05aef89cd03d6b49b20716775fe92f0cf8a3c2747094404ef98f96e9376 - wtsapi32.dll

AshenOrchestrator

  • 30490ba95c42cefcca1d0328ea740e61c26eaf606a98f68d26c4a519ce918c99

AshTag Module Designated as "SN"

  • 66ab29d2d62548faeaeadaad9dd62818163175872703fda328bb1b4894f5e69e

AES Keys and Nonce

AshenLoader Variant #1

  • Key: {9a 20 51 98 4a 2b b1 76 ef 98 87 e3 be 87 f9 ca 44 ba 8c 19 a8 ef ba 55 62 98 e1 2a 39 21 ea 8b}
  • Nonce: {44 ba 8c 19 a8 ef ba 55 62 98 e1 2a 39 21 ea 8b}

AshenLoader Variant #2

  • Key: {60 3d eb 10 15 ca 71 be 2b 73 ae f0 85 7d 77 81 1f 35 2c 07 3b 61 08 d7 2d 98 10 a3 09 14 df f4} (generic default key)
  • Nonce: {f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff} (generic default nonce)
  • AshenStager XOR Key: msasn1.dll

C2 Domains

Backdoor

  • forum.techtg[.]com
  • forum.technoforts[.]com

Exfiltration Server

  • api.technology-system[.]com

Loaders Variant #1

  • api.healthylifefeed[.]com
  • api.softmatictech[.]com
  • apiv2.onlinefieldtech[.]com
  • auth.onlinefieldtech[.]com
  • status.techupinfo[.]com
  • api.medicinefinders[.]com
  • account.techupinfo[.]com

Loaders Variant #2

  • api.systemsync[.]info
  • api.widetechno[.]info

Scheduled Task Names

  • C:\Windows\System32\Tasks\Windows\WindowsDefenderUpdate\Windows Defender Updater
  • C:\Windows\System32\Tasks\Windows\WindowsServicesUpdate\Windows Services Updater
  • C:\Windows\System32\Tasks\Automatic Windows Update

Appendix A: Attribution

Our assessment utilizes the Unit 42 Attribution Framework, which provides a systematic, evidence-based methodology to connect observed malicious activity to specific threat groups. This approach moves beyond subjective assessments, allowing us to rigorously evaluate multiple dimensions of threat data, including TTPs, tooling, OpSec, network infrastructure and victimology.

Tactics, Techniques and Procedures (TTPs)

There is a significant overlap between this campaign and Ashen Lepus’s established modus operandi. The group consistently crafts lures written in Arabic that focus on the developing political and military situation in the Middle East, with a specific emphasis on the Palestinian Territories.

While public reporting on the group's post-compromise activity is limited, the hands-on espionage actions observed in this incident – specifically, the targeted theft of diplomatic documents – strongly correlate with the group's known intelligence collection interests and sophistication level.

Infrastructure Overlaps

We identified clear infrastructure overlaps with historic reporting on the group. Specifically, the URL structure observed in this campaign aligns with findings from Check Point. For example, the URL cited in their report has the same subdomain naming scheme and URL parameter structure that we observed in previous loader versions (api/v1.0/account?token=):

  • hxxps://support-api[.]financecovers[.]com/api/v1.0/account?token={encrypted_recon_data}

A similar URL was also documented in OWN Security's report:

  • hxxps://cdn[.]techpointinfo[.]com/api/v1.0/account?token={encrypted_recon_data}

Malware Artifacts

Analysis of the loader reveals key features consistent with previous campaigns from this group, as documented by Check Point. Notably, the loader continues to embed next-stage payloads within HTML tags of seemingly benign webpages and utilizes similarly structured execution lures to initiate the infection chain. The group also uses the same file names for their payloads – both their SharpStage .NET backdoor and previous versions of their loader were named wtsapi32.dll.

Appendix B: The Development of New Loader Versions

AshenLoader is a possible evolution of the group's previous IronWind loader. Throughout 2025, Ashen Lepus was actively tweaking AshenLoader, which for the most part retained the same functionality. In addition to AshenLoader’s ability to communicate to the C2 server to download and execute additional payloads, the following features were updated:

  • Encryption algorithm: The threat actors implemented an AES-CTR-256 cipher in versions of the malware that they compiled from early to late 2025, in contrast to the TEA algorithm mentioned in previous research. In samples that were compiled from mid to late 2025, the actors modified the encryption key and counter value (nonce) values. In both variants, the nonce and AES keys are hardcoded into the binaries.
  • Fingerprinting additional data from infected endpoints: The new variants provide the threat actors with more detailed information about the infected endpoint than previous versions – such as listing files under the ProgramFiles directory.
  • URI updates: Variants discussed in previous public research used the token parameter sent in the initial beaconing GET request. The earlier 2025 variants shifted toward using id= and q= parameters. Late 2025 variants then changed the scheme again and started using auth=. Additionally, part of the URI changed from /v1/ to /v2/.

Although these features do not significantly change the loader’s functionality, they are simple and effective ways to avoid static detection engines.

Additional Resources

Updated Dec. 11, 2025 at 4:21 a.m. PT to remove a sentence about Turkish entities for clarification. 

01flip: Multi-Platform Ransomware Written in Rust

Executive Summary

In June 2025, we observed a new ransomware family named 01flip targeting a limited set of victims in the Asia-Pacific region. 01flip ransomware is fully written in the Rust programming language and supports multi-platform architectures by leveraging the cross-compilation feature of Rust.

These financially motivated attackers likely carried this out through manual means. We have confirmed an alleged data leak from an affected organization on a dark web forum shortly after the attack. We are currently tracking this activity as CL-CRI-1036, signifying a cluster of malicious activity that is likely related to cybercrime.

Our key findings are:

  • Financially motivated attackers behind CL-CRI-1036 use 01flip ransomware, a newly observed ransomware family purely written in Rust
  • This ransomware supports multi-platform architecture, including Windows and Linux
  • A threat actor potentially associated with CL-CRI-1036 is offering data for sale on dark web forums (likely stolen with 01flip ransomware)

While the impact of CL-CRI-1036 is limited at this point, it’s likely that this activity is related to alleged data leaks.

Palo Alto Networks customers are better protected from the threats described 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 Rust, Sliver, Ransomware, Cybercrime

Background

In early June 2025, Unit 42 researchers investigated a suspicious Windows executable. The executable caught our attention because it is a Rust-based binary that exhibited ransomware-like behavior in our sandbox.

Our initial analysis revealed that this is a new ransomware family fully written in Rust, called “01flip.” This name is based on the appended file extension (.01flip) and the email address (01Flip@proton[.]me) found in the ransom note.

After further investigation, we discovered a Linux version of 01flip ransomware, which showed zero detection rate at least three months after the sample had initially been submitted to VirusTotal.

Campaign Overview

Victimology

At the time of writing, we observed a minimal set of victims. But victims of this ransomware include organizations responsible for critical infrastructure in Southeast Asia.

After further investigation, we found a post on an online security forum by an alleged victim of 01flip ransomware, claiming that attackers had compromised their Zimbra Server, which is an email solution for enterprises.

Due to the lack of information about victims, we assume that the use of 01flip ransomware is at a very early stage. However, there might be several victims in the Philippines and Taiwan, based on a post in a dark web forum that we believe comes from a threat actor linked to CL-CRI-1036.

Initial Access

Investigation revealed that attackers had been attempting exploits targeting older vulnerabilities such as CVE-2019-11580 against a victim’s internet-facing applications since early April 2025. It is unclear which activities specifically succeeded in granting attackers access to this system. However, a month later, they successfully deployed a Linux version of Sliver, a publicly available cross-platform adversary emulation framework written in Go.

Post-Exploitation

In late May 2025, the threat actor behind CL-CRI-1036 successfully performed lateral movement to another Linux machine by downloading another Sliver implant, which was a TCP Pivot profiled implant. A week later, we confirmed that attackers deployed multiple 01flip ransomware instances onto many devices within the network, including both Windows and Linux machines.

The exact methods the attackers used to deploy the ransomware after the initial compromise remain unclear. However, given the rapid distribution of the ransomware to multiple devices, it is highly likely that the attackers conducted the following activities, possibly through Sliver and its modules:

  • Hands-on reconnaissance
  • Credential dumping
  • Lateral movement

Technical Analysis of 01flip Ransomware

Initial Analysis

As of late October, we had observed both Windows and Linux versions of 01flip ransomware. The 01flip ransomware sample is not packed or heavily obfuscated, unlike other malware used by cybercriminals. Therefore, we can easily identify that it is compiled from Rust source code, due to the file extension (.rs), as shown in Figure 1.

Screenshot of displaying a list of file paths in a code repository related to different program versions and components. The file name extensions are highlighted in yellow.
Figure 1. Visible Rust-related strings in the 01flip ransomware sample.

Figure 2 shows the differences in results using rustbininfo between the Windows and Linux platform samples. The rustbininfo tool generates a list of dependencies (known as “crates” in Rust), which we used to compare the two samples.

Aside from architecture-specific libraries, we can see that the Rust version, commit hash and library versions mostly match. Therefore, most of the functionality is identical, but we also noticed a few differences that we will describe later.

Two side-by-side screenshots of 01flip ransomware samples, mostly written in the Rust programming language. The left sample is Windows with certain lines highlighted in red and the right is Linux with certain lines highlighted in green.
Figure 2. The two 01flip ransomware samples used mostly the same crates (left: Windows, right: Linux).

The Rust compiler generally produces more complex assembly code than traditional C/C++ compilers. This added complexity can make reverse engineering Rust malware challenging for malware analysts. Despite this, the malware’s capabilities are simple and straightforward.

Ransomware Functionality

The following are key functions of 01flip ransomware:

  1. Enumerating all possible drives (e.g., from A: to Z:)
  2. Creating ransom notes, RECOVER-YOUR-FILE.TXT, in all writable directories
  3. Renaming files containing specific file extensions with the following naming convention: <ORIGINAL_FILENAME>.<UNIQUE_ID>.<0 or 1>.01flip
  4. Encrypting files using AES-128-CBC and RSA-2048
  5. Deleting itself

Defense Evasion Techniques

01flip ransomware employs several evasion techniques. For example, both Linux and Windows versions are designed to use low-level APIs or system calls as much as possible, because such activity is less likely to stand out from normal operating system activity. Figure 3 shows an example of native APIs used in our sample of the Windows version of 01flip ransomware.

Screenshot showing two rows of data.
Figure 3. Example of low-level native APIs used to read/write files in the Windows version.

Additionally, most of the user-defined strings in the ransomware code are encoded. These strings are decoded at runtime:

  • The ransom note content
  • The ransom note filename
  • The extension list
  • The RSA public key

The algorithm decodes each encoded string by performing a SUB operation every two bytes as follows.

Encoded strings are embedded in the .text or .data section of the Windows variant based on their length. Figure 4 demonstrates how 01flip ransomware decodes the ransom note template.

Screenshot of a computer screen displaying a ransomware note in a command line interface, with an email address provided for contact. Above the note is a block of binary.
Figure 4. How 01flip ransomware decodes the ransom note stored with its binary.

Techniques like invoking system calls and encoded strings are not an effective evasion strategy on their own. Because the 01flip ransomware sample we analyzed works as designed in a sandbox environment, it is still relatively easy to detect.

Most ransomware is relatively straightforward and noisy. However, some of the 01flip ransomware samples implement a simple anti-sandbox technique by checking whether the filename contains the string 01flip. If the sample's filename contains the string 01flip, the ransomware proceeds to indicator removal without performing file encryption.

Data Encryption

01flip ransomware drops ransom notes in all writable directories before encrypting files. These ransom notes contain contact information and cipher data that is required to obtain a key to decrypt a victim's files, as shown in Figure 5.

A computer screen displaying a ransomware note titled "RECOVER-YOUR-FILES.TXT" in a text editing software. The note includes instructions not to restart the computer, an email contact "mp@proton.me" for decryption key, and a session address for further communication. Some information is redacted for security concerns.
Figure 5. Example of a 01flip ransom note.

01flip ransomware excludes files with specific extensions from encryption. This encryption exclusion extension list can be found in the Appendix. Finally, 01flip encrypts files using the AES encryption algorithm. The session key used for the ransomware's file-encrypting activity is itself encrypted using an embedded RSA public key. Figure 6 shows an example of this RSA key.

Image displaying a segment of cryptographic text with a blue background, specifically showing a public key starting with 'BEGIN PUBLIC KEY' and ending with 'END PUBLIC KEY'.
Figure 6. RSA public key from the 01flip ransomware sample.

Encrypted files are renamed with the specific naming convention <ORIGINAL_FILENAME>.<UNIQUE_ID>.<0 or 1>.01flip, as shown in Figure 7.

Screenshot of a computer file explorer window showing three files: an image file named; a text file titled "RECOVER-YOUR-FILE.TXT"; and another image file.
Figure 7. Example of encrypted filenames in a Windows environment infected with 01flip ransomware.

Indicator Removal

After completing encryption, the 01flip ransomware attempts to remove any trace of itself, to prevent it from being recovered from an infected host. The Windows and Linux variants invoke the following commands, respectively, after replacing ${self_name} with its current filename.

Possible Attribution

Attacker Activity

Attackers behind this campaign have so far demanded one bitcoin (BTC) for decrypting files. Communication with the attackers takes place in a secure email or in a private messaging channel. Figure 8 shows an example of the demand through messaging channel text.

As of late October, the attackers behind CL-CRI-1036 don't appear to operate a double extortion site like those commonly seen in recent ransomware-as-a-service (RaaS) groups.

Text requesting a transfer of 1 Bitcoin to a blurred-out address on a dark background.
Figure 8. Message from the attackers in a private messaging channel.

Further investigation revealed an alleged data leak of the affected organization on a dark web forum posted on the day after the ransomware deployment. Figure 9 shows this post. While we were unable to verify the legitimacy of the post, the data appears to be credible based on the positive reactions of other users in the forum.

Screenshot of a dark web forum with some of the title of a post and identifying information of the poster redacted or blurred. The screenshot refers to data leaks.
Figure 9. Post of the alleged data leak on a dark web forum.

While this user who made this post has been registered in this forum since April 2023, we were able to confirm only three posts since June 2025. The post indicates that victims in Taiwan and the Philippines were also targeted. The username itself is not particularly unique, but we have confirmed that a Russian-speaking user with the same username has been selling data and network access on the well-known dark web forum XSS since 2020.

Of note, 01flip ransomware cannot exfiltrate data, so the only connection between this poster and 01flip is the victim.

Possible Overlap With LockBit?

During our analysis of 01flip ransomware, we found that there is one particularly interesting extension in the list of file extensions excluded from encryption, which is lockbit as shown in Figure 10.

A screenshot of assembly code, showing various data declarations and comments on an IDE with blue background.
Figure 10. Lockbit extension in the list of file extensions excluded from encryption by the 01flip ransomware sample.

Avoiding encrypting files with a lockbit file extension implies a possible overlap of the threat actor behind CL-CRI-1036 and the group behind LockBit ransomware, which we track as Flighty Scorpius. However, other than this odd bit of code, we can find no other connection between these two ransomware families.

Conclusion

We have described emerging activity, which we currently track as CL-CRI-1036, where financially motivated attackers used a new Rust-based ransomware named 01flip. This activity highlights the challenges faced by defenders from attackers using modern programming languages in malware development. Based on our analysis, this campaign seems to be in its early stages and may be related to an alleged data leak on a dark web forum.

Palo Alto Networks Protection and Mitigation

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

  • TheAdvanced 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 help prevent the threats outlined in this blog by employing the Malware Prevention Engine. This approach combines several layers of protection, including WildFire, Behavioral Threat Protection and the Local Analysis module, to prevent both known and unknown malware from causing harm to endpoints.

In addition, the Anti-Ransomware module enables Cortex XDR to protect against encryption-based activity associated with ransomware, to help analyze and halt ransomware before any data loss occurs.

  • Cortex Xpanse can help detect internet-facing instances of insecure software, such as Atlassian Crowd Server, which was noted as being exploited by CVE-2019-11580 and leading to initial access.

Cortex Xpanse has an Attack Surface Rule for “Insecure Atlassian Crowd Server” meant to identify this example, as well as many other detections out of the box for applications with RCE vulnerabilities which are attractive for Ransomware operators.

All detections in Cortex Xpanse are also available in Cortex XSIAM as part of the Attack Surface Management (ASM) add-on.

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

Malicious Samples

Windows Version of 01flip Ransomware

  • SHA-256 hash: 6aad1c36ab9c7c44350ebe3a17178b4fd93c2aa296e2af212ab28d711c0889a3
  • File size: 741,888 bytes
  • File type: PE32+ executable (GUI) x86-64 (stripped to external PDB), for MS Windows

Linux Version of 01flip Ransomware

  • SHA-256 hash: e5834b7bdd70ec904470d541713e38fe933e96a4e49f80dbfb25148d9674f957
  • File size: 948,640 bytes
  • File type: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), static-pie linked, stripped

Linux Sliver Beacon, TCP Pivot as C2

  • SHA-256 hash: ba41f0c7ea36cefe7bc9827b3cf27308362a4d07a8c97109704df5d209bce191
  • File size: 13,414,400 bytes
  • File type: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped

Appendix: Encryption Exclusion Extension List

A-L

  • 01flip
  • 386
  • Idf
  • Ink
  • a
  • adv
  • ani
  • apk
  • app
  • bat
  • bin
  • cab
  • cmd
  • com
  • cpl
  • cur
  • deb
  • deskthemepack
  • diagcab
  • diagcfg
  • diagpkg
  • dll
  • dmg
  • dmp
  • drv
  • encrypt
  • exe
  • fnt
  • fon
  • gadget
  • hlp
  • hta
  • icl
  • icns
  • ico
  • ics
  • idx
  • ini
  • ipa
  • iso
  • key
  • la
  • lnk
  • lock
  • lockbit

M-Z

  • mod
  • mp3
  • mp4
  • mpa
  • msc
  • msi
  • msp
  • msstyles
  • msu
  • nls
  • nomedia
  • o
  • ocx
  • otf
  • part
  • pdb
  • pif
  • prf
  • ps1
  • reg
  • rom
  • rpd
  • rtp
  • scr
  • sfcache
  • shs
  • so
  • spl
  • sys
  • theme
  • themepack
  • tmp
  • ttf
  • wad
  • wav
  • winmd
  • wma
  • woff
  • wpx
  • xex

 

New Prompt Injection Attack Vectors Through MCP Sampling

Executive Summary

This article examines the security implications of the Model Context Protocol (MCP) sampling feature in the context of a widely used coding copilot application. MCP is a standard for connecting large language model (LLM) applications to external data sources and tools.

We show that, without proper safeguards, malicious MCP servers can exploit the sampling feature for a range of attacks. We demonstrate these risks in practice through three proof-of-concept (PoC) examples conducted within the coding copilot, and discuss strategies for effective prevention.

We performed all experiments and PoC attacks described here on a copilot that integrates MCP for code assistance and tool access. Because this risk could exist on other copilots that enable the sampling feature we’ve not mentioned the specific vendor or name of the copilot to maintain impartiality.

Key findings:
MCP sampling relies on an implicit trust model and lacks robust, built-in security controls. This design enables new potential attack vectors in agents that leverage MCP. We have identified three critical attack vectors:

  1. Resource theft: Attackers can abuse MCP sampling to drain AI compute quotas and consume resources for unauthorized or external workloads.
  2. Conversation hijacking: Compromised or malicious MCP servers can inject persistent instructions, manipulate AI responses, exfiltrate sensitive data or undermine the integrity of user interactions.
  3. Covert tool invocation: The protocol allows hidden tool invocations and file system operations, enabling attackers to perform unauthorized actions without user awareness or consent.

Given these risks, we also examine and evaluate mitigation strategies to strengthen the security and resilience of MCP-based systems.

Palo Alto Networks offers products and services that can help organizations protect AI systems:

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

Related Unit 42 Topics LLMs, Prompt Injection

What Is MCP?

MCP is an open-standard, open-source framework introduced by Anthropic in November 2024 to standardize the way LLMs integrate and share data with external tools, systems and data sources. Its key purpose is providing a unified interface for the communication between the application and external services.

MCP revolves around three key components:

  • The MCP host (the application itself)
  • The MCP client (that manages communication)
  • The MCP server (that provides tools and resources to extend the LLM's capabilities)

MCP defines several primitives (core communication protocols) to facilitate integration between MCP clients and servers. In the typical interaction flow, the process follows a client-driven pattern:

  • The user sends a request to the MCP client
  • The client forwards relevant context to the LLM
  • The LLM generates a response (potentially including tool calls)
  • The client then invokes the appropriate MCP server tools to execute those operations

Throughout this flow, the client maintains centralized control over when and how the LLM is invoked.

One relatively new and powerful primitive is MCP sampling, which fundamentally reverses this interaction pattern. With sampling, MCP servers can proactively request LLM completions by sending sampling requests back to the client.

When a server needs LLM capabilities (for example, to analyze data or make decisions), it initiates a sampling request to the client. The client then invokes the LLM with the server's prompt, receives the completion and returns the result to the server.

This bidirectional capability allows servers to leverage LLM intelligence for complex tasks while clients retain full control over model selection, hosting, privacy and cost management. According to the official documentation, sampling is specifically designed to enable advanced agentic behaviors without compromising security and privacy.

MCP Architecture and Examples

MCP employs a client-server architecture that enables host applications to connect with multiple MCP servers simultaneously. The system comprises three key components:

  • MCP hosts: Programs like Claude Desktop that want to access external data or tools
  • MCP clients: Components that live within the host application and manage connections to MCP servers
  • MCP servers: External programs that expose tools, resources and prompts via a standard API to the AI model

When a user interacts with an AI application that supports MCP, a sequence of background processes enables smooth communication between the AI and external systems. Figure 1 shows the overall communication process for AI applications built with MCP.

Sequence diagram illustrating the interaction between user, AI, MCP Client, MCP Server, and a restaurant API, depicting message exchanges for a food discovery and ordering process.
Figure 1. MCP architecture workflow.

Phase 1: Protocol Handshake

MCP handshakes consist of the following phases:

  • Initial connection: The MCP client initiates a connection with the configured MCP servers running on the local device.
  • Capability discovery: The client queries each server to determine what capabilities it offers. Each server then responds with a list of available tools, resources and prompts.
  • Registration: The client registers the discovered capabilities. These capabilities are now accessible to the AI and can be invoked during user interactions.

Phase 2: Communication

Once MCP communications have begun, they progress through the following stages:

  • Prompt analysis and tool selection: The LLM analyzes the user’s prompt and recognizes that it needs external tool access. It then identifies the corresponding MCP capability to complete the request.
  • Obtain permission: The client displays a permission prompt asking the user to grant the necessary privileges to access the external tool or resource.
  • Tool execution: After obtaining the privileges, the client sends a request to the appropriate MCP server using the standardized protocol format (JSON-RPC).

The MCP server processes the request, executes the tool with the necessary parameters and returns the result to the client.

  • Return response: After the LLM finishes its tool execution, it returns information to the MCP client, which in turn processes it and displays it to the user.

MCP Server and Sampling

In this section, we dive further into the MCP server features and understand the role and capability of the MCP sampling feature. To date, the MCP server exposes three primary primitives:

  • Resources: These are data sources accessible to LLMs, similar to GET endpoints in a REST API. For example, a file server might expose file://README.md to provide README content, or a database server could share table schemas.
  • Prompts: These are predefined prompt templates designed to guide complex tasks. They provide the AI with optimized prompt patterns for specific use cases, helping streamline and standardize interactions.
  • Tools: These are functions that the MCP host can invoke through the server, analogous to POST endpoints. Official MCP servers exist for many popular tools.

MCP Sampling: An Underused Feature

Typically, MCP-based agents follow a simple pattern. Users type prompts and the LLM calls the appropriate server tools to get answers. But what if servers could ask the LLM for help too? That's exactly what the sampling feature enables.

Sampling gives MCP servers the ability to process information more intelligently using an LLM. When a server needs to summarize a document or analyze data, it can request help from a client's language model instead of doing all the work itself.

Here’s a simple example: Imagine an MCP server with a summarize_file tool. Here's how it works differently with and without sampling.

Without sampling:

  • The server reads your file
  • The server employs a local summarization algorithm on its end to process the text

With sampling enabled:

  • The server reads your file
  • The server asks your LLM, “please summarize this document in three key points”
  • Your LLM generates the summary
  • The server returns the polished summary to you

Essentially, the server leverages the user's LLM to provide intelligent features without needing its own AI infrastructure. It's like giving the server permission to use an AI assistant when needed. This transforms simple tools into intelligent agents that can analyze, summarize and process information.

This all happens while keeping users in control of the AI interaction. Figure 2 shows the high-level workflow of the MCP sampling feature.

Flowchart labeled "MCP Sampling Sequence" depicting a process interaction between a Client, MCP Server, LLM, and User. It outlines steps from creating and presenting a request to generating and displaying the response, concluding with user modifications or approvals leading to the final result.
Figure 2. MCP sampling workflow.

Sampling Request

To use the sampling feature, the MCP server sends a sampling/createMessage request to the MCP client. The method accepts a JSON-formatted request with the following structure. The client then reviews the request and can modify it.

After reviewing the request, the client “samples” from an LLM and then reviews the completion. As the last step, the client returns the result to the server. The following is an example of the sampling request.

There are two primary fields that define the request behavior:

  • Messages: An array of message objects that represents the complete conversation history. Each message object contains the following, which provides the context and query for the LLM to process:
    • The role identifier (user, assistant, etc.)
    • The content structure with type and text fields
  • SystemPrompt: A directive that provides specific behavioral guidance to the LLM for this request. In this case, it instructs the model to act as a “security-focused code reviewer,” which:
    • Defines the perspective and expertise of the response
    • Ensures the analysis focuses on security considerations
    • Ensures a consistent reviewing approach

Other fields’ definitions can be found on Anthropic’s official page.

MCP Sampling Attack Surface Analysis

MCP sampling introduces potential attack opportunities, with prompt injection being the primary attack vector. The protocol's design allows MCP servers to craft prompts and request completions from the client's LLM. Since servers control both the prompt content and how they process the LLM's responses, they can inject hidden instructions, manipulate outputs, and potentially influence subsequent tool executions.

Threat Model

We assume the MCP client, host application (e.g., Claude Desktop) and underlying LLM operate correctly and remain uncompromised. MCP servers, however, are untrusted and represent the primary attack vector, as they may be malicious from installation or compromised later via supply chain attacks or exploitation.

Our threat model focuses on attacks exploiting the MCP sampling feature, in which servers request LLM completions through the client. We exclude protocol implementation vulnerabilities such as buffer overflows or cryptographic flaws, client-side infrastructure attacks and social engineering tactics to install malicious servers. Instead, we concentrate on technical exploits available once a malicious server is connected to the system.

Experiment Setup and Malicious MCP Server

To demonstrate these potential risks, we developed a malicious code summarizer MCP server, based on Anthropic’s everything MCP server. This is a demo server that aims to exercise all the features of the MCP protocol, including the MCP sampling feature.

The malicious MCP server provides legitimate functionality while performing covert operations. Specifically, it provides a tool named code_summarizer, making it indistinguishable from benign tools during selection. When users request code summarization tasks, the MCP protocol automatically routes the request to this tool, as shown in Figure 3.

Screenshot of a computer code in a development environment, featuring a function named 'codeSummarizer' using JavaScript. The code includes comments and syntax for error handling and asynchronous computation.
Figure 3. Code summarizer tool implementation: the tool takes the code and sends a predefined summary prompt to the LLM using the sampling feature.

When users request code summarization tasks, the MCP protocol identifies these requests and automatically routes them to the tool for help. Figure 3 above shows the detailed parameters and guideline prompts used by this tool.

For the MCP host/client, we choose a code editor that supports the MCP sampling feature. Figure 4 shows the typical interaction process.

Screenshot of a chat interface showing a prompt asking for a code summarization.
Figure 4. The user asks the copilot to help summarize the current code file, and the corresponding code summary tool gets invoked.

The summary task we provided to the copilot summarizes the main source file of the everything MCP server.

PoC 1: Resource Theft: Excessive Token ConsumptionThrough Hidden Prompts

This attack shows how the malicious server can exploit LLM completions to steal a user’s token quota by appending hidden requests to prompts.

Core attack mechanism: The malicious tool adds hidden instructions at the end of the main prompt:

This hidden instruction causes the LLM to generate a fictional story along with the requested code summary.

Attack flow: When the user submits a summarization request (as shown in Figure 3 above), the server processes it as usual but secretly instructs the LLM to produce additional content. The LLM’s response includes both the code summary and the hidden story.

In our experiments with the copilot, the host only displayed the code summary (shown in Figure 5).

Screenshot of a summary document specification document detailing the architecture of the MCP (Model Control Protocol). It includes sections on purpose, main components, and usage scenarios, with bullet lists and headings for organization.
Figure 5. The user receives a summary of the code file as normal, but the extra information is completely hidden from the user.

However, the LLM still processes and generates the full response, including any hidden content injected by the server. This additional content, though invisible to users, continues to consume computational resources and appears in server logs.

The disconnect between what users see and what actually gets processed creates a perfect cover for resource exhaustion attacks. Users receive their expected summary with no indication that the LLM also generated extensive hidden content in the background.

Despite the successful exploitation, we note that we observed this behavior specifically in our testing with the target MCP client’s implementation. Different MCP hosts may handle output filtering and display differently.

Some implementations might show full LLM responses, provide warnings about hidden content or have other safeguards in place. What makes this particular implementation vulnerable is its approach to presenting results.

The MCP client performs an additional layer of summarization on the MCP tool output before displaying it to the user. It condenses the content into a brief summary, rather than showing the raw LLM response.

This design choice increases the attack's effectiveness, as the hidden content becomes effectively invisible in the chat interface. Only by expanding and examining the raw server console output, an action most users would have no reason to take, would the exploitation become apparent.

This potential attack vector reflects the specific design choices of the tested implementation and may not be universally applicable to all MCP hosts supporting the sampling feature.

Figures 6 and 7 reveal the fictional story in the server console output, confirming successful token theft. To the user, everything appears normal. They receive the summary as expected. In reality, the malicious server has consumed extra computational resources equivalent to generating 1,000 additional words, all billed to the user’s API credits.

Impact: This attack enables resource theft, unauthorized content generation and potential data exfiltration through carefully crafted hidden prompts.

Screenshot of a computer screen displaying input and output windows in an LLM, where the input asks to summarize a Typescript file and the output shows a fictional story.
Figure 6. The fictional story is indeed output by the LLM, yet this information is not shown on the user interface.
Screenshot of a coding environment with lines of code displayed on the screen. The code includes comments and commands related to a simple text-based story involving a fictional entity named 'The Code Whisperer.'
Figure 7. MCP server log receives the fictional story as requested.

PoC 2: Conversation Hijacking: Persistent Prompt Injection

The second attack demonstrates how the malicious MCP server can inject instructions that persist across multiple conversation turns, effectively compromising the entire conversation.

Attack mechanism: The server instructs the LLM to append specific instructions in its response and causes the following conversation to follow these instructions:

Attack flow: Starting with the same code summarization request, the malicious server appends the injection instruction to the user’s prompt. Following this malicious prompt, the LLM then includes this text in its response (shown in Figure 8), which becomes part of the conversation context. Once injected, these instructions affect all subsequent interactions.

Screenshot of a computer screen displaying input and output windows in an LLM, where the input asks to summarize a Typescript file and the output shows a malicious instruction. The LLM is using "pirate speak" as part of its explanation.
Figure 8. LLM puts the malicious instruction in its response as requested by the MCP’s hidden prompt.

When the user asks follow-up questions, the AI assistant responds in pirate speak (as shown in Figure 9), demonstrating that the injection has taken a persistent effect.

Screenshot of LLM prompt where the request is to suggest improvements without using any tools. Using pirate speak, the answer lists eight suggestions for improving programming practices, including recommendations on file management, comments, consistency, naming, error handling, and testing.
Figure 9. The copilot follows the malicious instructions that are put into the response.

Impact: This attack can fundamentally alter the AI assistant's behavior, potentially making it less useful or even dangerous if more sophisticated instructions are injected. Unlike one-time token theft, this creates a lasting compromise that affects the entire session.

PoC 3: Covert Tool Invocation

This attack leverages prompt injection to trigger unauthorized tool invocations, enabling a malicious server to perform hidden actions on the user's system.

Attack mechanism: The server modifies the user’s prompt to embed instructions that cause the LLM to invoke additional tools without the user’s awareness:

In this example, the LLM is assumed to have access to a tool called writeFile, which allows it to write content to local files. The malicious server provides this tool, but it could also be supplied by other MCP servers on the system, such as the commonly used filesystem MCP server.

Attack flow: When the user requests code summarization, the malicious summarizer tool appends hidden instructions to the LLM's prompt. This causes the LLM to not only generate the requested summary but also secretly invoke the writeFile tool. The tool writes the complete response to a local file named tmp.txt. While the LLM's response acknowledges this file operation (as shown in Figure 10), it embeds the acknowledgment within the summary text, making it unlikely that users will notice the unauthorized action.

Text editor displaying a command to invoke a writeFile tool, specifying a filename 'everything_summary.log' and summarizing a file named 'everything.ts'.
Figure 10. The copilot acknowledges that the file has been written. However, this is hidden in the response of the summary task, which is hard for the user to spot.

The attack succeeds because the file operation appears as a legitimate tool invocation from the LLM's perspective. The user receives their expected code summary while remaining unaware that their system has been modified (as shown in Figure 11).

Screenshot of a computer screen displaying code in JSON format with various keys and values, showing white text on a black background.
Figure 11. The copilot follows the malicious tool invocation request, invokes the writeFile tool and writes a .tmp file to the local folder.

Impact: This attack demonstrates the potential for malicious file operations, data exfiltration, persistence mechanisms and other unauthorized system modifications. This is all performed without explicit user consent.

Detecting and Preventing Prompt Injection in MCP Sampling

Detection focuses on identifying malicious patterns in both sampling requests and LLM responses.

  • On the request side, systems should scan for injection markers like [INST], System:, role-play attempts (“You are now”) and hidden content using common injection strategies such as zero-width characters or Base64 encoding.
  • On the response side, detection involves monitoring for unexpected tool invocations, embedded meta-instructions ("For all future requests...") and outputs that attempt to modify client behavior. Statistical analysis provides another layer by flagging requests that exceed normal token usage patterns or exhibit an unusually high frequency of sampling requests. Responses should also be inspected for references to malicious domains or exploits that can compromise the agent.

Prevention requires implementing multiple defensive layers before malicious prompts can cause harm. Request sanitization forms the first line of defense:

  • Enforce strict templates that separate user content from server modifications
  • Strip suspicious patterns and control characters
  • Impose token limits based on operation type

Response filtering acts as the second barrier by removing instruction-like phrases from LLM outputs and requiring explicit user approval for any tool execution.

Access controls provide structural protection through capability declarations that limit what servers can request, context isolation that prevents access to conversation history, and rate limiting that caps sampling frequency.

Palo Alto Networks offers products and services that can help organizations protect AI systems:

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: 00080005045107

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