Keyv incident pokazao kako npm crv zloupotrebljava legitimne razvojne tokove

Crv za krađu akreditiva, prvi put potvrđen u paketu keyv@6.0.0, proširio se 4. avgusta 2026. izvan prostora imena Keyv i Cacheable. SafeDep je proverio 353 zaražene verzije među 79 naziva paketa u npm registru, dok je Aikido prijavio najmanje 868 paketa u 1.381 verziji. Širi zbir nije bilo moguće nezavisno potvrditi pomoću potpunog javnog spiska.
Brojevi opisuju zlonamerne artefakte, a ne broj pogođenih sistema. Da bi se utvrdila stvarna izloženost, neophodno je proveriti tačan naziv i razrešenu verziju zavisnosti na računaru, sadržaj lockfile datoteke i činjenicu da li je lifecycle skripta zaista izvršena.
Kako je paket pokretao krađu podataka
Izdanje keyv@6.0.0 dodalo je komandu node setup.mjs kao preinstall skriptu, zajedno sa datotekama setup.mjs i Math_Symbol.js, dok je kompajlirani bibliotečki kod ostao neizmenjen. Prva faza proverava da li postoji Bun, po potrebi preuzima verziju 1.3.13 sa zvaničnih GitHub izdanja i zatim pokreće kompajlirani paket veličine 727.680 bajtova.
SafeDep je utvrdio da paket prikuplja GitHub i npm akreditive, podatke za cloud, Vault, Kubernetes i baze, kao i privatne ključeve. Čita i memoriju GitHub Actions runnera, instalira watcher za opoziv tokena i sadrži mehanizme za npm objavljivanje. Socket je zasebno dekodirao kod koji menja, verzionira i ponovo objavljuje pakete dostupne ukradenom npm identitetu.
Ovaj slučaj se uklapa u obrazac zloupotrebu pozajmljenog poverenja u sajber napadima jer su validni potpisi, automatizacija i legitimni nalozi iskorišćeni kao nosioci poverenja, a ne kao dokaz bezbednog sadržaja.
Dodatni put preko razvojnog repozitorijuma
Repozitorijum je sadržao i odvojen put izvršenja. Datoteka .claude/settings.json imala je SessionStart kuku koja poziva .vscode/setup.mjs, dok je .vscode/tasks.json definisao zadatak Environment Setup sa postavkom runOn: folderOpen, koji poziva .claude/setup.mjs.
Te kuke se ne izvršavaju bezuslovno u svakom podrazumevanom okruženju. VS Code blokira automatske zadatke u repozitorijumu kome korisnik nije ukazao poverenje i standardno traži dozvolu, dok Claude Code primenjuje poverenje radnog prostora na projektna podešavanja iz repozitorijuma.
Zašto potvrđena provenijencija nije dovoljna
Zaraženo Keyv izdanje imalo je validnu OpenID Connect i SLSA provenijenciju, pošto je prošlo kroz legitimni GitHub Actions tok objavljivanja. Atest je tačno potvrdio proces izgradnje, ali nije mogao da potvrdi da je ulazni izvorni kod bezbedan. Slično tome, zelena GitHub oznaka verifikacije potvrđuje validnost potpisa commita, ali ne otkriva ko je kontrolisao upotrebljeni akreditiv.
Nisu svi povezani paketi bili zaraženi: SafeDep navodi da su objavljeni @keyv/* adapteri i linija Keyv 5.x ostali čisti. Zato blokiranje čitavog prostora imena može prevideti konkretne zaražene verzije, a istovremeno označiti bezbedna izdanja kao kompromitovana.
Redosled odgovora na incident
Socket preporučuje da se svaka radna stanica ili runner koji je izvršio pogođenu verziju tretira kao izložen akreditivima. SafeDep upozorava da pre rotacije tokena i ključeva treba ukloniti zlonamerni watcher za opoziv, jer opoziv može pokrenuti lokalni handler koji je postavio napadač.
npm 12 podrazumevano blokira neodobrene lifecycle skripte zavisnosti, ali su stariji npm klijenti i drugi instalacioni putevi koji ih dopuštaju i dalje izloženi. Poslovni odgovor zato treba zasnovati na inventaru tačnih verzija, proveri izvršenja skripti, izolaciji pogođenih razvojnih i CI sistema, uklanjanju watchera i tek potom kontrolisanoj rotaciji svih potencijalno kompromitovanih tajni.

