gik|iewicz

szukaj
Atak na biblioteki npm: Shai-Hulud infekuje pakiety JavaScript

Atak na biblioteki npm: Shai-Hulud infekuje pakiety JavaScript

Atak Shai-Hulud na łańcuch dostaw npm skompromitował co najmniej 868 pakietów, które łącznie generują ponad 2 miliardy pobrań miesięcznie. Agresorzy przejęli konto GitHub opiekuna biblioteki Keyv, posiadającej około 127 milionów pobrań tygodniowo. Wkrótce potem złośliwy kod zaczął rozprzestrzeniać się po całym ekosystemie JavaScript, infekując kolejne zależności i kradnąc poświadczenia deweloperów.

TL;DR: Aktywny atak Shai-Hulud na łańcuch dostaw npm przejął konto opiekuna popularnej biblioteki Keyv. Szacuje się, że zainfekowano co najmniej 868 pakietów, które generują ponad 2 miliardy pobrań miesięcznie. Złośliwy robak wykorzystuje skrypty preinstall do kradzieży poświadczeń z systemów CI/CD oraz usług chmurowych, a następnie samodzielnie infekuje kolejne repozytoria.

Jak przebiegł atak Shai-Hulud na bibliotekę Keyv?

Atak rozpoczął się od bezpośredniego przejęcia konta GitHub autora biblioteki Keyv, która jest popularnym rozwiązaniem do przechowywania danych w formacie klucz-wartość w środowisku Node.js. Agresorzy wykorzystali ten dostęp do opublikowania złośliwych wersji pakietów, w tym zaktualizowanego keyv@6.0.0. Ponadto skompromitowano również moduł cacheable, który jest ściśle powiązany z ekosystemem Keyv. W rezultacie fałszywe aktualizacje trafiły do repozytorium npm, automatycznie pobierając złośliwy kod na maszyny tysięcy deweloperów na całym świecie. To wywołało lawinę.

Wkrótce potem badacze z OX Security oraz Aikido Security potwierdzili, że kampania przybrała nazwę „Shai-Hulud: Here We Go Again”. Złośliwy kod rozprzestrzeniał się poprzez dwa główne pliki: math_init.js oraz Math_Symbol.js. Te skrypty uruchamiały się automatycznie podczas procesu instalacji pakietu. Co więcej, po wykonaniu na lokalnej maszynie, robak przeszukiwał pliki konfiguracyjne w poszukiwaniu nowych tokenów uwierzytelniających. Następnie używał ich do infekowania kolejnych repozytoriów należących do tego samego autora.

Ile pakietów npm uległo kompromitacji podczas tego incydentu?

Szacunki wskazują, że liczba skompromitowanych pakietów szybko przekroczyła wstępne projekcje i osiągnęła poziom co najmniej 868 repozytoriów w ekosystemie npm. Te pakiety były odpowiedzialne za ponad 2 miliardy pobrań w ujęciu miesięcznym, co nadaje temu atakowi gigantyczną skalę. Zatem zasięg infekcji obejmuje zarówno bezpośrednie zależności, jak i setki bibliotek zależnych od kodu Keyv. Wcześniejsze kampanie wyglądały inaczej.

Co więcej, niektóre raporty, takie jak te opublikowane przez Phoenix Security, sugerują, że liczba zainfekowanych wersji może przekraczać nawet 1000 pozycji. Agresorzy celowali w popularne moduły, aby zmaksymalizować tempo rozprzestrzeniania się złośliwego oprogramowania. Poniższa tabela przedstawia kluczowe pakiety zidentyfikowane jako główne wektory w tej kampanii.

Nazwa pakietuSzacunkowa liczba pobrańWektor ataku
keyv127 milionów tygodniowoPrzejęcie konta opiekuna
cacheableKilkadziesiąt milionówZłośliwy skrypt preinstall
Pozostałe pakiety zależneCzęść z 2 mld pobrańAutomatyczna propagacja robaka

Złośliwy łańcuch dostaw ujawnił poważne luki w procesie weryfikacji repozytorium npm. Podobnie jak w przypadku skompromitowanych pakietów npm firmy Red Hat, agresorzy wykorzystali zaufanie społeczności do weryfikacji kont opiekunów.

Jakie techniki wykorzystywał złośliwy robak do infekowania kolejnych projektów?

Złośliwe oprogramowanie w tym ataku działa jako samopropagujący się robak, który wykorzystuje mechanizm skryptów preinstall w menedżerze pakietów npm. Gdy programista pobierał zainfekowaną wersję biblioteki Keyv lub inny zależny od niej pakiet, skrypt uruchamiał się automatycznie w tle, jeszcze przed zakończeniem procesu instalacji. Skrypt ten pobierał dodatkowy ładunek z serwerów kontrolowanych przez agresorów. To był dopiero początek.

Pobrany ładunek zawierał moduł kradnący informacje, który natychmiast rozpoczynał skanowanie środowiska deweloperskiego w poszukiwaniu danych uwierzytelniających. Co więcej, robak wykorzystywał skradzione tokeny dostępu do analizy konfiguracji GitHub oraz npm danego użytkownika. Następnie, jeśli skradzione poświadczenia posiadały odpowiednie uprawnienia do zapisu, malware modyfikował inne projekty należące do ofiary. W ten sposób atak rozszerzał się na kolejne pakiety. Z kolei każdy nowy ofiara stawała się kolejnym wektorem infekcji, co tłumaczy lawinowy wzrost liczby skompromitowanych repozytoriów. Mechanizm ten przypomina wcześniejsze incydenty, takie jak opisany w analizie atak na łańcuch dostaw npm Axios przez Microsoft, gdzie również wykorzystano zaufanie do popularnych bibliotek.

Jakie sekrety kradnie robak Shai-Hulud ze środowisk deweloperskich?

Zainfekowane pakiety wyposażono w moduł typu infostealer, który automatycznie skanuje środowisko w poszukiwaniu poświadczeń usług chmurowych oraz narzędzi CI/CD. Agresorzy celują w tokeny AWS, dane uwierzytelniające Kubernetes, wpisy HashiCorp Vault oraz klucze dostępu do GitHub i npm. Ponadto robak gromadzi również konfiguracje środowiskowe zawierające wrażliwe zmienne. Taka kombinacja kradzieży danych umożliwia głęboką penetrację infrastruktury ofiary.

Robak Shai-Hulud rozprzestrzeniający się przez pakiety keyv i cacheable skanuje środowiska w poszukiwaniu tokenów AWS, poświadczeń Kubernetes oraz wpisów HashiCorp Vault, a następnie eksfiltruje je przez publiczne interfejsy API GitHub, co utrudnia wykrycie przez standardowe zapory sieciowe (Aikido Security, 2026).

Atakujący zastosowali sprytny kanał wycieku danych. Zamiast wysyłać skradzione informacje do nieznanego serwera, co często blokują systemy bezpieczeństwa, malware wykorzystywał do transmisji publiczne API GitHub. W ten sposób ruch sieciowy wyglądał jak standardowa komunikacja deweloperska. Złośliwy kod w keyv@6.0.0 przechwytywał sekrety CI i przesyłał je przez mechanizmy kodu platformy GitHub. To omijało typowe zabezpieczenia sieciowe.

Które pakiety powiązane z Keyv uległy bezpośredniej infekcji?

Oprócz głównej biblioteki keyv, agresorzy przejęli kontrolę nad modułem cacheable, stanowiącym integralną część tego ekosystemu. W krótkim czasie opublikowano trojanizowaną wersję keyv@6.0.0. Z kolei zainfekowano również setki innych zależności, które pobierały te biblioteki w procesie budowania. Lista skompromitowanych repozytoriów rosła lawinowo z każdą godziną trwania kampanii. Wobec tego zespół Wiz Research uruchomił śledztwo.

W wyniku ataku Shai-Hulud skompromitowano bezpośrednio pakiety keyv oraz cacheable, a trojanizowana wersja keyv@6.0.0 zainfekowała ponad 440 dodatkowych zależności w ekosystemie npm, generując łącznie ponad 2 miliardy pobrań miesięcznie (OX Security, 2026).

Lista zainfekowanych elementów obejmuje szeroki wachlarz modułów opartych na przejętym kodzie. Poniżej znajduje się zestawienie głównych celów tego ataku:

  • keyv (główny pakiet przejęty przez agresorów)
  • cacheable (moduł ściśle powiązany z architekturą)
  • keyv-mem (adapter pamięci podręcznej)
  • keyv-redis (warstwa pośrednia dla baz Redis)
  • keyv-mongo (interfejs wymiany danych z MongoDB)
  • keyv-file (mechanizm lokalnego zapisu plików)
  • keyv-etcd (integracja z rozproszonymi systemami)
  • keyv-postgres (mostek dla relacyjnych baz PostgreSQL)
  • @keyv/redis (oficjalna wtyczka obsługi pamięci podręcznej)

Dlaczego ten atak przypomina wcześniejsze incydenty w ekosystemie npm?

Nazwa kampanii nawiązuje do wcześniejszych operacji przypisujących sobie miano Shai-Hulud, co bezpośrednio sugeruje działanie tych samych grup lub współdzielenie złośliwego kodu. Wcześniejsze przypadki przejmowania kont deweloperów miały podobny przebieg. Atakujący najpierw zdobywali tokeny, a potem publikowali złośliwe wersje bibliotek. Podobny schemat opisano w analizie postmortem ataku na łańcuch dostaw npm TanStack, gdzie również wykorzystano zaufanie społeczności do popularnych narzędzi open-source.

Kampania „Shai-Hulud: Here We Go Again” stanowi bezpośrednią kontynuację wcześniejszych ataków na ekosystem npm, wykorzystując te same mechanizmy skryptów preinstall oraz infostealery do propagacji złośliwego kodu wśród co najmniej 868 pakietów (International Cyber Digest, 2026).

Jak zabezpieczyć swoje projekty przed skutkami ataku Shai-Hulud?

Pierwszym krokiem jest natychmiastowe zablokowanie instalacji zainfekowanych wersji bibliotek keyv oraz cacheable w plikach konfiguracyjnych menedżera pakietów. Należy bezwzględnie wyrotować wszystkie tokeny dostępu do usług chmurowych, danych logowania do GitHub oraz kluczy API, które mogły zostać wyeksponowane w systemach CI/CD. Ponadto administratorzy repozytoriów powinni wdrożyć politykę ignorowania skryptów preinstall podczas instalacji zależności. Wymaga to modyfikacji ustawień środowiska uruchomieniowego.

Zespół Wiz Research zaleca natychmiastowe zablokowanie skompromitowanych wersji keyv i cacheable oraz rotację wszystkich poświadczeń CI/CD, ponieważ robak Shai-Hulud automatycznie eksfiltruje wykryte sekrety chmurowe (Wiz Blog, 2026).

Bezpieczeństwo łańcucha dostaw wymaga systematycznego podejścia do weryfikacji zależności. Warto przeanalizować oficjalne wskazówki bezpieczeństwa npm, aby lepiej zrozumieć metody operacyjne agresorów celujących w deweloperów.

Jakie narzędzia pomagają wykryć infekcję robakiem w potokach CI/CD?

Skuteczną detekcję złośliwych skryptów preinstall zapewniają nowoczesne platformy do skanowania składników oprogramowania, takie jak Aikido Security czy OX Security. Narzędzia te analizują kod pakietów pobieranych z repozytorium npm przed ich uruchomieniem w środowisku budowania. Co więcej, systemy monitorujące ruch sieciowy wychodzący z serwerów CI pozwalają wykryć anomalię w komunikacji z publicznym API GitHub. Takie zachowanie często świadczy o wycieku skradzionych danych. Zatem automatyzacja audytu zależności staje się koniecznością. Szerszy kontekst bezpieczeństwa dostaw oprogramowania omówiono w artykule o narzędziu CLI Bitwarden skompromitowanym w kampanii Checkmarx.

Badacze z Aikido Security zidentyfikowali złośliwy ruch w potokach CI/CD poprzez analizę skryptów preinstall, co umożliwiło zablokowanie robaka Shai-Hulud zanim zainfekował on dodatkowe pakiety w ekosystemie npm (DevOps.com, 2026).

Jakie są długoterminowe konsekwencje ataku dla ekosystemu open-source?

Incydent ujawnił fundamentalne słabości modelu zaufania opartego na pojedynczych opiekunach popularnych bibliotek open-source. Przejęcie jednego konta GitHub pozwoliło na lawinową infekcję setek pakietów zależnych, co pokazuje kaskadowy charakter zagrożeń w nowoczesnym przetwarzaniu danych. Społeczność musi wdrożyć wymóg uwierzytelniania wieloskładnikowego dla wszystkich wydawców. Choć technologia MFA istnieje od lat, jej adopcja pozostaje fragmentaryczna. Podobne luki strukturalne omówiono w analizie łagodzenia kompromitacji łańcucha dostaw npm Axios przez Microsoft, gdzie przejęcie konta dewelopera doprowadziło do podobnych szkód.

Atak Shai-Hulud udowodnił, że skompromitowanie jednego konta opiekuna biblioteki z 127 milionami pobrań tygodniowo może prowadzić do natychmiastowej infekcji ponad 868 pakietów, co wymusza zmianę modelu bezpieczeństwa open-source (Phoenix Security, 2026).

Często zadawane pytania

Czy atak Shai-Hulud infekuje komputery deweloperów lokalnie?

Tak, robak uruchamia się lokalnie podczas wykonywania skryptu preinstall w momencie pobierania zainfekowanego pakietu keyv lub cacheable z rejestru npm (OX Security, 2026). Należy zablokować te wersje w konfiguracji.

Czy zwykli użytkownicy aplikacji są narażeni na bezpośredni atak?

Nie, robak celuje wyłącznie w środowiska deweloperskie oraz systemy CI/CD, kradnąc poświadczenia usług takich jak AWS czy Kubernetes z plików konfiguracyjnych (Aikido Security, 2026). Użytkownicy końcowi nie są bezpośrednim celem.

Jak sprawdzić, czy projekt padł ofiarą robaka Shai-Hulud?

Należy przeszukać logi instalacji pod kątem obecności plików math_init.js oraz Math_Symbol.js, które stanowią główny wektor uruchomieniowy tego złośliwego oprogramowania (Phoenix Security, 2026). Ich obecność oznacza infekcję.

Czy aktualizacja biblioteki Keyv do najnowszej wersji rozwiązuje problem?

Nie, należy cofnąć wersję do ostatniej bezpiecznej edycji lub całkowicie zablokować pakiet keyv, ponieważ agresorzy kontrolowali repozytorium i publikowali trojanizowane aktualizacje (Wiz Blog, 2026). Wymagana jest rotacja wszystkich sekretów.

Podsumowanie

Atak Shai-Hulud na bibliotekę Keyv stanowi bezprecedensowe zagrożenie dla całego ekosystemu JavaScript, udowadniając, jak kruche bywa zaufanie w łańcuchu dostaw oprogramowania. Przejęcie jednego konta dewelopera poskutkowało lawinową infekcją setek pakietów i ekspozycją miliardów pobrań na działania agresorów. Wyniki analiz prowadzonych przez firmy takie jak OX Security czy Wiz Research jasno wskazują, że tradycyjne metody weryfikacji zależności zawodzą. Zatem natychmiastowa rotacja poświadczeń oraz blokada skryptów preinstall to jedyne skuteczne metody minimalizacji szkód. Ekosystem npm musi pilnie zreformować swój model bezpieczeństwa, aby zapobiec podobnym incydentom w przyszłości.

Podobnie jak w przypadku łańcucha exploitów zero-click dla Pixela 10, agresorzy celują w najsłabsze ogniwa infrastruktury technologicznej. Zmiana paradygmatu bezpieczeństwa jest niezbędna do ochrony nowoczesnych procesów deweloperskich, co potwierdza również szybki rozwój narzędzi omówiony przy okazji premiery OpenCV 5. Sprawdź swoje pliki package.json już dziś i wyrotuj wszystkie klucze API.