Web threats / ClickFix

TripleGnaw ClickFix kit

TripleGnaw is a packed website loader that reads JavaScript from a BNB Smart Chain testnet contract and opens a WebSocket for its next stage. We have matched it on 7 sites since 15 August.

TripleGnaw in numbers

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

Sites with TripleGnaw code7
Sites with a match in the last 30 days2
New sites in October2
Sites running WordPress (captured since 25 September)100%

A loader packed with three repeating keys

TripleGnaw is a loader built around three repeating keys and four byte operations. Its strings are long runs of dot-separated base-36 numbers, and even DOM method names are split into fragments such as crea + teEle + ment.

The first capture carried the loader inline in the document. A later WordPress capture kept the same decoder but replaced the three keys, the encoded number streams and the generated variable names. The browser still followed the same route: decode each packed script and run it from a temporary Blob URL.

Four operations before execution

Each base-36 word becomes one byte through a fixed sequence:

  1. XOR it with a byte from the first repeating key.
  2. Rotate it right by three bits.
  3. Subtract its position multiplied by a byte from the third key, modulo 256.
  4. XOR it with a byte from the second key.

TextDecoder turns the resulting byte array into JavaScript. The loader creates a script element through native DOM prototypes, points it at a Blob URL and removes that element after it loads. Repacked copies look unrelated at a glance because the keys, numbers and identifiers all change.

Contract first, WebSocket second

The decoded resolver sends eth_call with selector 0x57de26a4 to a contract on BNB Smart Chain testnet. It hex-decodes the reply, takes the Base64 text between # delimiters and runs the decoded JavaScript. The contract result is kept in sr_gwcache.

That script opens a WebSocket. Its query carries the current page path, a browser ID stored as __cl_gw and an operator ID. Messages arrive as /* event.key:payload */. An init payload is Base64-decoded, URI-decoded and XORed with the supplied key. If the result is a URL, TripleGnaw loads it as a script; otherwise it runs the result from another Blob.

What we see

MonthNew sites
September3
October2
November so far0

Of the 1 TripleGnaw sites captured since 25 September, 1 ran WordPress.

Checking a site

Search raw HTML and cached page output for:

  • a long dot-separated number stream parsed with radix 36
  • three repeating strings used through charCodeAt, with a three-bit rotation between the XOR steps
  • split DOM names such as crea + teEle + ment and crea + teObj + ectU + RL
  • selector 0x57de26a4 or storage keys sr_gwcache and __cl_gw
  • WebSocket messages wrapped as /* event.key:payload */

Purge WordPress optimisation caches after removing the injected script. Cached page output can preserve a packed copy.

Contracts we read

We read 1 TripleGnaw contract every day.

ChainContractCurrent destinationsLast changed
BNB Smart Chain testnet0x0967296defa0fd586c9ede5730380e2b059fab95ws[.]eb2026c95ia[.]xyz

The EtherHiding contract tracker keeps the full destination history.

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.