Selon kmsec-uk, un suivi continu des dépôts npm a détecté entre le 25 et le 26 février 2026 dix-sept nouveaux paquets malveillants embarquant un chargeur inédit recourant à Pastebin et à une stéganographie textuelle, une évolution attribuée aux tests rapides de FAMOUS CHOLLIMA (DPRK).

L’attaque s’appuie sur un script d’installation npm (node ./scripts/test/install.js) qui sert de leurre et exécute un JavaScript malveillant unique placé sous vendor/scrypt-js/version.js. Ce composant contacte trois pastes Pastebin en séquence, dont le premier valide interrompt la boucle. Le contenu des pastes, en apparence bénin mais truffé de fautes subtiles, est décodé via une stéganographie textuelle sur mesure pour produire une liste d’hôtes C2 sur Vercel.

Les trois pastes pointés (CJ5PrtNk, 0ec7i68M, DjDCxcsT) décodent vers la même liste de domaines Vercel, dont ext-checkdin.vercel[.]app (le seul renvoyant 200) et de nombreux hôtes de repli qui retournent 404 tant qu’inactifs. Le déploiement actif sert des charges distinctes selon l’OS via des chemins dédiés: /api/m (macOS), /api/l (Linux) et /api/w (Windows). Si l’agent utilisateur n’est pas curl, le serveur répond 200 avec le contenu fixe ‘Permanently suspended’.

Le stager exécute des charges à distance (RCE) en téléchargeant et en chaînant directement dans un shell: sur macOS via curl vers /api/m et exécution sh, sur Linux via wget vers /api/l et exécution sh, et sur Windows via curl vers /api/w et exécution par cmd.exe. Les scripts de deuxième étape écrivent et lancent en tâche de fond des scripts persistants dans des emplacements utilisateur (par ex. tokenlinux.sh sous $HOME, token.cmd sous %APPDATA%).

L’article fournit des IOCs tactiques et des pistes de chasse, et conclut que deux techniques de loader distinctes observées en une semaine indiquent un rythme d’itération inhabituellement rapide du groupe. 🧪

🚨 IOCs

  • Fichier JS malveillant: vendor/scrypt-js/version.js
  • Hash (échantillon JS obfusqué): da1775d0fbe99fbc35b6f0b4a3a3cb84da3ca1b2c1bbac0842317f6f804e30a4
  • Pastes Pastebin: CJ5PrtNk (davidsouza23), 0ec7i68M (Edgar04231), DjDCxcsT (Edgar04231)
  • Domaine C2 actif: ext-checkdin.vercel[.]app (répond 200; filtre d’UA)
  • Domaines de repli Vercel: nombreux hôtes listés par l’auteur, ex. cleverstack-ext301[.]vercel[.]app, brightlaunch-ext742[.]vercel[.]app, primevector-ext483[.]vercel[.]app, etc.
  • Hashs des charges suivantes:
    • /api/l (Linux): 869c327b8dc757fa126cd281bc4a14d809c50e9a792954442c55cea5b46912ec
    • /api/m (macOS): bce0da6547ae74f97e2bb61672a3e159b837acf01f7c68a813ea75c3835ff303
    • /api/w (Windows): e361d2859ba2eb2540bf6fb12db0b9857ef610bb9920830921e986d4b9109e89
  • Paquets npm malveillants (exemples parmi les 17): daytonjs, corstoken, jsnwebapptoken, iosysredis, sequelization, undicy-lint, expressjs-lint, loadash-lint, promanage, vitetest-lint, prism-lint, fastify-lint, typoriem, argonist, uuindex, bcryptance, ether-lint

🛠️ TTPs observées

  • Dead-drop resolver via Pastebin avec stéganographie textuelle pour exfiltrer une liste C2
  • Détournement npm via script d’installation et exécution d’un loader JavaScript unique
  • Récupération conditionnelle par OS et exécution directe dans le shell (curl/wget | sh; curl | cmd)
  • Usage d’hébergeur serverless (Vercel) pour héberger les endpoints C2 (/api/m, /api/l, /api/w)
  • Filtrage par user-agent (sert du contenu inoffensif si non curl)
  • Processus Node.js qui spawn des shells en mode silencieux (stdio ignoré, detached)

🔎 Pistes de chasse (auteur)

  • Processus Node.js lançant curl ou wget
  • Résolutions DNS de Node.js vers pastebin.com
  • Requêtes HTTP avec UA curl/wget ciblant des déploiements Vercel

Cet article est une analyse technique avec indicateurs et conseils de chasse, visant à documenter une chaîne d’infection npm et un stager novateur attribués à FAMOUS CHOLLIMA.

🧠 TTPs et IOCs détectés

TTP

[‘Dead-drop resolver via Pastebin avec stéganographie textuelle pour exfiltrer une liste C2’, ‘Détournement npm via script d’installation et exécution d’un loader JavaScript unique’, ‘Récupération conditionnelle par OS et exécution directe dans le shell (curl/wget | sh; curl | cmd)’, ‘Usage d’hébergeur serverless (Vercel) pour héberger les endpoints C2 (/api/m, /api/l, /api/w)’, ‘Filtrage par user-agent (sert du contenu inoffensif si non curl)’, ‘Processus Node.js qui spawn des shells en mode silencieux (stdio ignoré, detached)’]

IOC

{‘hash’: [‘da1775d0fbe99fbc35b6f0b4a3a3cb84da3ca1b2c1bbac0842317f6f804e30a4’, ‘869c327b8dc757fa126cd281bc4a14d809c50e9a792954442c55cea5b46912ec’, ‘bce0da6547ae74f97e2bb61672a3e159b837acf01f7c68a813ea75c3835ff303’, ’e361d2859ba2eb2540bf6fb12db0b9857ef610bb9920830921e986d4b9109e89’], ‘domaine’: [’ext-checkdin.vercel.app’, ‘cleverstack-ext301.vercel.app’, ‘brightlaunch-ext742.vercel.app’, ‘primevector-ext483.vercel.app’], ‘pastebin’: [‘CJ5PrtNk’, ‘0ec7i68M’, ‘DjDCxcsT’]}


🔗 Source originale : https://kmsec.uk/blog/dprk-text-steganography/