Około 09:00 UTC 4 sierpnia 2026 r. napastnik uzyskał kontrolę nad kontem GitHub Jareda Wraya (jaredwray) . Dzięki temu mógł bezpośrednio zmodyfikować gałąź main repozytorium keyv, a następnie przygotować nowe wydania całej rodziny pakietów keyv i cacheable .
Pierwsza fala objęła 11 pakietów z obu przestrzeni nazw. Wśród nich znalazły się między innymi keyv, cacheable-request, cache-manager, @cacheable/utils, flat-cache i file-entry-cache . O przejęciu niezależnie informowały zespoły Aikido Security, StepSecurity, Socket i Chainguard .
W każdym skażonym pakiecie pojawiał się ten sam schemat infekcji: dwa nowe pliki — setup.mjs i Math_Symbol.js — oraz zmieniony plik package.json z wpisem:
"preinstall": "node setup.mjs"
Oznaczało to, że po uruchomieniu npm install skrypt setup.mjs wykonywał się automatycznie, jeszcze przed zakończeniem instalacji. Ten dropper pobierał z GitHub Releases legalny plik binarny środowiska uruchomieniowego Bun, a następnie wykorzystywał go do uruchomienia zaciemnionego drugiego etapu — pliku Math_Symbol.js o rozmiarze około 710–728 KB .
Microsoft Threat Intelligence potwierdziło, że był to wariant Mini Shai-Hulud . Malware przeszukiwał zainfekowane środowiska w poszukiwaniu szerokiego zestawu sekretów :
Najgroźniejszą cechą ataku była zdolność do samodzielnego rozprzestrzeniania się. Po przejęciu tokenów publikowania npm i tokenów GitHub PAT robak wykorzystywał je do publikowania kolejnych złośliwych wersji pakietów należących do innych, niezależnych opiekunów .
Skala kampanii rosła niemal z godziny na godzinę:
Robak przekraczał granice przestrzeni nazw. Nie pozostał w rodzinie keyv/cacheable, lecz przeniknął także do pakietów powiązanych między innymi z Deliveroo, Ornikar, OneReach, Picsart, Qlik i ServiceTitan .
Skradzione dane uwierzytelniające były wysyłane do repozytorium GitHub kontrolowanego przez napastnika. Robak mógł utworzyć nowe repozytorium eksfiltracyjne albo wykorzystać repozytorium przeznaczone do tego celu . W kodzie znalazło się kilka nadmiarowych kanałów eksfiltracji, dzięki czemu wyłączenie pojedynczego kanału nie musiało zatrzymać wycieku .
Badacze bezpieczeństwa zalecili, aby każdy komputer deweloperski, runner CI/CD lub inny host, na którym wykonano npm install z użyciem podatnej wersji, traktować jako w pełni przejęty. Samo usunięcie złośliwych plików nie jest wystarczające .
Natychmiast przypnij zależności do znanych, czystych wersji albo wycofaj zmiany do wydań sprzed ataku. Warto użyć mechanizmów overrides w package.json oraz ich odpowiedników w npm, Yarn i pnpm, aby zapobiec przypadkowej ponownej instalacji skażonej wersji .
Sprawdź także pliki blokad — package-lock.json, yarn.lock i pnpm-lock.yaml — w tym zależności tranzytywne, czyli pakiety pobierane pośrednio przez inne biblioteki .
Nie ograniczaj się do ręcznego usunięcia setup.mjs, Math_Symbol.js ani katalogu node_modules. Przyjmij, że wszystkie sekrety dostępne na danym hoście mogły zostać odczytane . W przypadku runnerów CI/CD i maszyn deweloperskich bezpieczniejsza jest odbudowa ze znanego, czystego obrazu.
Należy odwołać i odtworzyć wszystkie potencjalnie ujawnione dane, w szczególności :
To szczególnie ważny szczegół. Malware mógł tworzyć obserwatory workflowów GitHub, które przechwytywały nowy token natychmiast po jego utworzeniu . Badacze zalecali najpierw wyłączyć lub usunąć takie usługi monitorujące, a dopiero potem przeprowadzić rotację danych uwierzytelniających .
Wyczyść cache npm, pnpm i Yarn, a także cache kompilacji Dockera — zarówno na komputerach deweloperskich, jak i runnerach CI/CD . Wszystkie artefakty należy zbudować od nowa, aby skażone zależności nie pozostały w warstwach Dockera, cache budowania lub gotowych paczkach .
Sprawdź, czy na kontach organizacji nie pojawiły się nowe repozytoria, nieautoryzowane workflowy lub podejrzane commity . Poszukaj również artefaktów utrwalających obecność malware, takich jak .claude/settings.json i .vscode/tasks.json . Przeanalizuj logi dostępu, aktywność tokenów oraz procesy publikowania pakietów.
Atak z 4 sierpnia 2026 r. pokazał, jak szybko pojedyncze przejęte konto opiekuna może uruchomić efekt domina w ekosystemie open source. Napastnicy nie musieli uzyskać bezpośredniego dostępu do setek pakietów: wystarczyły skradzione tokeny, aby robak publikował kolejne skażone wydania pod kontrolą innych opiekunów.
Wykorzystanie legalnego runtime'u Bun do uruchomienia ładunku, samorozprzestrzenianie za pomocą przejętych tokenów oraz zapasowe kanały eksfiltracji sprawiły, że kampania była bardziej zaawansowana niż typowe ataki na łańcuch dostaw . Dla zespołów inżynieryjnych i bezpieczeństwa to kolejny argument za przypinaniem wersji zależności, ograniczaniem skryptów preinstall i postinstall tam, gdzie jest to możliwe, monitorowaniem nietypowej aktywności na GitHubie oraz utrzymywaniem gotowych procedur reagowania na incydenty w łańcuchu dostaw.