Tech 4 min read

"StegaBin" hides C2 in Pastebin zero-width characters and ships malicious npm packages

IkesanContents

Socket and Kmsec.uk reported a new npm supply-chain attack called StegaBin, attributed to the North Korean threat cluster Famous Chollima. Between February 25 and 26, 2026, 26 malicious npm packages were published. They hid C2 URLs in Pastebin essays using zero-width Unicode characters. Socket detected the first package within two minutes of publication and flagged every package as unsafe within minutes.

Famous Chollima and Contagious Interview

Famous Chollima is a North Korea-linked cluster tracked by CrowdStrike and associated with Lazarus Group. Since late 2023 it has run a campaign called Contagious Interview: fake recruiter messages on LinkedIn, a technical interview excuse, a Node.js project to run, and an infection chain that eventually deploys BeaverTail and InvisibleFerret.

StegaBin extends that playbook to npm. No interview is needed; npm install alone is enough to infect a victim.

The 26 packages

The malicious packages were published from disposable accounts:

argonist       bcryptance    bee-quarl      bubble-core
corstoken      daytonjs      ether-lint     expressjs-lint
fastify-lint   formmiderable hapi-lint      iosysredis
jslint-config  jsnwebapptoken kafkajs-lint  loadash-lint
mqttoken       prism-lint    promanage      sequelization
typoriem       undicy-lint   uuindex        vitetest-lint
windowston     zoddle

They mimic popular packages such as bcrypt, lodash, express, winston, and zod, and use suffixes like -lint, token, or js to look legitimate.

How the steganography works

The core trick is hiding C2 URLs in zero-width Unicode characters inside a Pastebin essay.

Zero-width Unicode characters

CharacterCode pointOriginal use
ZWSPU+200BPossible line break hint
ZWNJU+200CPrevent ligatures
ZWJU+200DForce character joining
Zero Width No-Break SpaceU+FEFFBOM / encoding marker
Word JoinerU+2060Prevent line breaks

These are legitimate Unicode characters, so security tools cannot simply treat every zero-width character as malicious.

Decoding flow

The attacker posted a harmless-looking essay to Pastebin and replaced evenly spaced characters with characters from the C2 address. The decoder in vendor/scrypt-js/version.js does the following:

  1. Remove zero-width Unicode characters
  2. Read the first five characters as the payload length
  3. Extract characters at even intervals
  4. Split the result at ||| and restore the C2 sequence using ===END===
flowchart TD
    A["npm install"] --> B["install script runs automatically"]
    B --> C["Fetch essay from Pastebin"]
    C --> D["Decode zero-width characters"]
    D --> E["Restore C2 domain"]
    E --> F["Download from 31 Vercel deployments"]
    F --> G["Run OS-specific payload"]
    G --> H["Deploy 9-module RAT"]

The code itself does not contain the C2 URL. Only the Pastebin post changes when the operator wants to rotate infrastructure.

Vercel delivery infrastructure

After restoring the C2 domain, the malware downloads platform-specific shell scripts and RAT components from 31 Vercel deployments. Only one was active during analysis, such as ext-checkdin.vercel[.]app.

Using Vercel’s free tier keeps infrastructure costs near zero and provides redundancy if one deployment is taken down.

The 9-module RAT

vs      Node.js  VS Code persistence via `tasks.json`
clip    Node.js  Keylogger / mouse tracker / clipboard theft
bro     Python   Browser credential theft
j       Node.js  Crypto wallet theft
z       Node.js  File-system enumeration
n       Node.js  WebSocket RAT to 103.106.67[.]63:1247
truffle Node.js  Runs real TruffleHog to steal secrets
git     Node.js  Collects `.ssh` and Git credentials
sched   Node.js  Persistence via redeploying the loader

The C2 server uses port 1244 for commands and 1247 for the WebSocket RAT. The IP overlaps with older Famous Chollima infrastructure.

Why attribution is solid

Threat-intelligence investigators found several operational-security mistakes: disposable email services had public inboxes, and the same addresses were used for job-platform signups. The IPs exposed through npm notification emails pointed to VPN and ISP infrastructure that matched the group’s past behavior.

A related package called express-core-validator was also found to carry a Google Drive-based stager.

Compared with the February SANDWORM_MODE campaign, the differences are significant:

SANDWORM_MODEStegaBin
ActorUnknownFamous Chollima (North Korea)
Number of packages1926
Public accounts226 disposable accounts
C2 hidingBase64 + XOR obfuscationPastebin steganography
Delivery infrastructureCloudflare Worker31 Vercel deployments
Automatic propagation3-path wormNone
AI-targetingMCP injectionNone
Persistencegit hook + MCP tamperingVS Code tasks.json
FeaturePolymorphic code transformationZero-width Unicode steganography