
Co znajdziesz w tym artykule?
- 1 Wprowadzenie do problemu / definicja luki
- 2 W skrócie
- 3 Kontekst / historia / powiązania
- 4 Analiza techniczna / szczegóły luki
- 5 Praktyczne konsekwencje / ryzyko
- 6 Rekomendacje operacyjne / co zrobić teraz
- 7 Różnice / porównania z innymi przypadkami (jeśli dotyczy)
- 8 Podsumowanie / kluczowe wnioski
- 9 Źródła / bibliografia
Wprowadzenie do problemu / definicja luki
Druga fala kampanii Shai-Hulud (v2) to szeroko zakrojony atak na łańcuch dostaw oprogramowania, który rozpoczął się w ekosystemie npm i – poprzez mechanizmy mirroringu – przelał się do Maven Central (artefakt org.mvnpm:posthog-node:4.18.1). Celem jest kradzież sekretów (tokenów GitHub, kluczy chmurowych AWS/GCP/Azure, webhooków itp.) oraz dalsza replikacja przez zainfekowane konta maintainerów i joby CI/CD. Wektor obejmuje trojanizowane wydania popularnych bibliotek oraz nadużycie przepływów GitHub Actions.
W skrócie
- Skala: skompromitowano setki (800+) pakietów npm i odsłonięto tysiące sekretów publicznie na GitHubie; odnotowano również pojedynczy, zwierciadlany artefakt w Maven Central (mvnpm). Mirror został usunięty przez zespół Maven Central.
- Nowości w v2: loader w Bun (pliki
setup_bun.js+ 10-MBbun_environment.js), tryb bezszelestny podczas instalacji, podniesienie limitu replikacji i agresywniejsze zbieranie sekretów (TruffleHog + API chmurowe). - Wejście do organizacji: kompromitacja przepływów GitHub Actions (m.in. niebezpieczne użycie
pull_request_targetiworkflow_run) oraz przejęte konta wydawnicze npm; potwierdzone studium przypadku opublikował PostHog. - Wpływ: dziesiątki tysięcy repozytoriów naruszonych pośrednio przez wyciek sekretów; tysiące nadal były ważne w momencie analizy.
Kontekst / historia / powiązania
Pierwszy wariant Shai-Hulud z września 2025 r. uderzył w npm i wyciekał sekrety, ale obecna „druga nadchodzi” (The Second Coming) znacząco rozszerza zarówno zasięg, jak i arsenał technik (Bun, stealth, worm-like spread). The Hacker News opisuje również efekt domina – przejście z npm do Maven Central przez automatyczny most mvnpm, który przebudowuje paczki npm na artefakty Mavena; skompromitowany mirror usunięto, a dostawca wdraża dodatkowe zabezpieczenia przed rebundlowaniem znanych złych wersji.
Analiza techniczna / szczegóły luki
- Łańcuch infekcji w npm
- Do
package.jsondodawany jest skryptpreinstall, który uruchamiasetup_bun.js. - Loader instaluje/odnajduje runtime Bun, a następnie cicho uruchamia spakowany i zaciemniony
bun_environment.js, tłumiąc wyjście i zwracając kontrolę, aby instalacja wyglądała „normalnie”.
- Do
- Zbieranie informacji i sekretów
- Enumeracja środowiska (OS/arch/hostname, zmienne środowiskowe, detekcja CI).
- Masowe pozyskiwanie sekretów: TruffleHog (skan całego
$HOME), enumeracja AWS Secrets Manager, GCP Secret Manager i Azure Key Vault; zbieranie tokenówGITHUB_TOKEN,NPM_TOKENitd.
- C2 i „samouzdrawianie”
- Malware wyszukuje na GitHubie frazę-znacznik „Sha1-Hulud: The Second Coming.” i potrafi odzyskać uprzednio wykradzione tokeny z repozytoriów, by kontynuować eksfiltrację.
- Eskalacja w GitHub Actions
- Na runnerach Linux podejmowane są próby uzyskania root (np. manipulacja
sudoers, reset zasad iptables/DNS), co umożliwia m.in. blokadę skanerów i MITM w CI.
- Na runnerach Linux podejmowane są próby uzyskania root (np. manipulacja
- Wejście przez CI/CD i konta wydawnicze
- PostHog szczegółowo opisał, jak napastnik wykorzystał podatną konfigurację
pull_request_targetw workflow, by wykonać kod z PR i wykraść PAT bota, a następnie tokeny wydawnicze npm, co pozwoliło opublikować zainfekowane wersje SDK.
- PostHog szczegółowo opisał, jak napastnik wykorzystał podatną konfigurację
- Przelew do Maven
- Zidentyfikowano
org.mvnpm:posthog-node:4.18.1z tym samym ładunkiem Bun; zespół Maven Central potwierdził usunięcie mirrorów i prace nad dodatkowymi barierami.
- Zidentyfikowano
- Skala wycieku sekretów
- GitGuardian raportuje 11 858 unikalnych sekretów znalezionych w 4 645 repozytoriach, z czego 2 298 było nadal ważnych w dniu 24 listopada 2025 r.
Praktyczne konsekwencje / ryzyko
- Natychmiastowe przejęcie łańcucha dostaw: publikacja trojanizowanych wydań skutkuje kompromitacją tysięcy downstream projektów, które instalują zależności automatycznie (CI/CD).
- Utrata poufności i integralności środowisk: wyciek tokenów GitHub/npm/chmury = możliwość pushowania złośliwych commitów, eskalacji w chmurze, lateral movement.
- Trudna detekcja: payload wykonuje się poza Node (Bun), tłumi I/O i może modyfikować sieć na runnerach CI, utrudniając telemetrię i skanowanie.
- Ryzyko „worm-like” replikacji: jeden kompromitowany maintainer lub runner może szybko zwielokrotnić zasięg ataku.
Rekomendacje operacyjne / co zrobić teraz
Natychmiast (D+0):
- Zatrzymaj buildy dla repo z podejrzanymi zależnościami; w CI włącz tryb „no-scripts” (
npm ci --ignore-scripts, pnpm 10 ma domyślnie wyłączone lifecycle scripts). - Wymuś rotację wszystkich sekretów:
GITHUB_TOKEN, PAT-y, klucze npm, chmury (AWS/GCP/Azure), webhooki, itp. Użyj secret scanningu. - Wyczyść cache i node_modules oraz przypnij wersje do znanych-dobrych:
rm -rf node_modules && npm cache clean --force && pnpm cache delete, następnie reinstalacja. - Szukaj artefaktów malware lokalnie (
setup_bun.js,bun_environment.js,truffleSecrets.json,environment.json,cloud.json,contents.json).
W horyzoncie 72h:
- Przejrzyj i utwardź GitHub Actions:
- unikaj
pull_request_targetchyba że naprawdę konieczne; - nie uruchamiaj kodu z PR bez sandboxu;
- włącz required reviews dla zmian w
.github/workflows/*; - ogranicz uprawnienia tokenów (
permissions: read-all, per-jobGITHUB_TOKEN); - izoluj runnerów self-hosted;
- egzekwuj MFA i trusted publishing dla npm.
- unikaj
- Monitoruj wyciek sekretów w orgu – skany historii/artefaktów CI i publicznych repo (np. narzędziami klasy GitGuardian lub własnymi regułami).
- Wprowadź opóźnienie publikacji/aktualizacji zależności –
minimumReleaseAge(np. 72h) w yarn/pnpm, aby nie pobierać „świeżych” kompromitowanych wersji. - SBOM + atestacja łańcucha dostaw – podpisy pakietów, SLSA/SCM policy enforcement, blokowanie skryptów instalacyjnych w CI domyślnie. (Wniosek syntetyczny na bazie powyższych analiz).
Różnice / porównania z innymi przypadkami (jeśli dotyczy)
- Wobec września 2025 r.: v2 zwiększa skalę (setki pakietów vs. dziesiątki), używa Bun do ukrycia logiki i automatyzuje eksfiltrację z chmur; do tego samoleczenie przez wyszukiwanie frazy sygnatury na GitHubie.
- Na tle innych kampanii npm: podobnie jak wcześniejsze supply-chainy, ale rzadkie jest tak głębokie „CI-aware” zachowanie (eskalacja na runnerach, manipulacja DNS/iptables).
- „Przelew” do innych ekosystemów: unikalny aspekt to automatyczne rebundlowanie paczek npm do Mavena (mvnpm), co stworzyło ryzyko cross-ecosystem – na szczęście mirror szybko usunięto.
Podsumowanie / kluczowe wnioski
Shai-Hulud v2 pokazuje, że nawet bez 0-dayów atakujący potrafią wykorzystać luki operacyjne: błędne konfiguracje GitHub Actions, słabe praktyki zarządzania sekretami i zaufanie do lifecycle scripts w instalatorach. Krytyczne jest wprowadzenie kontroli publikacji, ograniczenia uprawnień tokenów, domyślne wyłączenie skryptów w CI oraz opóźnienie aktualizacji zależności. Dane z monitoringu wycieków i analizy incydentu (PostHog) potwierdzają, że to atak na procesy, nie tylko na kod.
Źródła / bibliografia
- The Hacker News – podsumowanie i wątek Maven/mvnpm. (The Hacker News)
- Socket Research – analiza techniczna v2, czasy reakcji Maven Central, lista artefaktów/podejrzanych technik. (Socket)
- PostHog – oficjalny post-mortem (wejście przez
pull_request_target, timeline, zalecenia). (PostHog) - GitGuardian – statystyki wycieków sekretów (11 858 unikalnych, 2 298 ważnych). (blog.gitguardian.com)
- Aikido – wnioski o nadużyciu istniejących workflowów Actions w projektach AsyncAPI/PostHog/Postman. (Aikido)