11.svibnja 2026. u 19:22 UTC napadač je pushao prvu od 84 maliciozne verzije paketa na npm. Do 19:26 sve su bile live. Šest minuta. 42 paketa unutar @tanstack namespacea, a svaki od njih dio svakodnevnice modernih React projekata.
Šest tjedana ranije, 30. ožujka, drugi napadač objavio je dvije kompromitirane verzije axiosa, paketa s više od 100 milijuna tjednih downloadova. Obje su verzije instalirale remote access trojanac na svako računalo koje ih je povuklo.
Ako ste pokrenuli npm install bilo kad u blizini tih vremenskih okvira, možda ste već zaraženi. Malware ne pita. Samo se pokrene.
Većina članaka o supply chain napadima obrađuje ih kao izolirane incidente. Ovaj nije takav. Ono što se dogodilo u ožujku i svibnju ove godine ista je priča ispričana dvaput, s različitim vektorima napada i malo drukčijim žrtvama, i potvrđuje ono što sigurnosni istraživači tvrde otkad je Shai-Hulud worm izmakao kontroli u rujnu 2025. Vrijeme u kojem ste mogli upisati npm install i razmišljati o nečemu drugom je prošlo.
Ovaj tekst prolazi kroz ono što se zapravo dogodilo u oba napada, po čemu je 2026. drukčija od ranijih kompromitacija u npm-u, i što frontend developer može poduzeti bez da napušta JavaScript.
Što se dogodilo
Axios, 30. ožujka: krađa credentialsa
Napad na axios klasičan je playbook izveden čisto. Napadači su kompromitirali npm credentialse glavnog maintainera paketa. S njima u rukama objavili su dvije maliciozne verzije: 1.14.1 i 0.30.4. Obje su sadržavale remote access trojanac koji se sam instalirao na macOS, Windows i Linux.
Microsoft je operaciju pripisao Sapphire Sleetu, sjevernokorejskom državnom akteru s dokumentiranom poviješću supply chain napada usmjerenih na developere. Izbor axiosa nije bio slučajan. S više od 100 milijuna tjednih downloadova, paket je statistički prisutan u većini React, Vue i Node.js projekata koji se danas shippaju.
Dvije maliciozne verzije ostale su dostupne nekoliko sati prije nego ih je npm uklonio. Toliko je bilo dovoljno. Svaki CI pipeline konfiguriran da povlači najnoviju minor ili patch verziju, a to je default kad package.json koristi ^1.14.0 — tiho je instalirao trojanac i nastavio s buildom. Većina timova nikad nije saznala da se to dogodilo.
TanStack, 11. svibnja: GitHub Actions vektor
Napad na TanStack trebao bi vas zabrinuti više. Nije bilo krađe credentialsa. Napadač se nikad nije ulogirao kao netko drugi.
Iskoristio je poznatu slabost u GitHub Actionsu pod nazivom pull_request_target. Flow izgleda ovako: napadač je forkao TanStack repo, otvorio pull request i odmah ga zatvorio. Ta sekvenca bila je dovoljna da pokrene publish workflow koji se izvršio s permissionima glavnog repozitorija. Odatle je napadač zarazio file u CI cacheu, ukrao npm publish token iz workflow environmenta i počeo pushati.

84 maliciozne verzije kroz 42 @tanstack paketa izašle su u šest minuta. Napad nije stao na TanStacku. Isti worm lateralno se proširio na Mistral AI, UiPath, OpenSearch i dug rep od otprilike 160 paketa ukupno. Pogođen je i PyPI, što znači da je napad prešao granice ekosustava.
Tri detalja iz TanStack writupa ostaju u glavi.
Malware se ugradio u VS Code i Claude Code. Jednom kad se instalirao, worm se zakačio na pokretanje editora. Čak i nakon što ste uklonili zaraženi paket, worm bi se pokrenuo svaki put kad otvorite editor. Čišćenje dependencyja nije čistilo zarazu.
Dead man's switch. Background proces svakih šezdeset sekundi provjeravao je vrijedi li još ukradeni GitHub token. Čim bi token istekao ili bio opozvan, proces bi izvršio destruktivni payload nad root direktorijem. Detekcija je značila gubitak podataka.
Krivotvoreni AI commitovi. Malware je stvarao commitove potpisane identitetom Claude Code GitHub aplikacije. U repozitorijima u kojima su commitovi iz AI alata uobičajeni, maliciozni commitovi su se uklopili. Reviewer koji bi pretraživao commit log tražeći neobične potpise ne bi vidio ništa sumnjivo.
Zašto je ovo drukčije od npm napada prije pet godina
Supply chain napadi na npm nisu novi. Event-stream 2018., ua-parser-js 2021., sabotaža colorsa i fakera 2022. Žanr ima dugu povijest. Ono što se promijenilo krajem 2025. jest da su se napadi počeli sami replicirati. Shai-Hulud worm, koji je izmakao kontroli u rujnu te godine, bio je prvi npm payload koji se aktivno širio krađom tokena sa zaraženih developerskih računala i republishanjem samog sebe kroz svaki publish credential koji bi pronašao. Unit 42 iz Palo Alta od tada kontinuirano prati tu obitelj. Varijantu koju nazivaju Mini Shai-Hulud detektirali su kao aktivnu ovaj mjesec.

Taj kontinuitet prva je stvar koja je drukčija. Više se ne radi o pojedinačnim incidentima koji se očiste. Radi se o trajnoj prijetnji koja mutira između kampanja.
Druga stvar koja je drukčija je attack surface. Developeri su nekad bili na meti jer su im računala čuvala produkcijske credentialse. Sad su na meti jer njihova računala pokreću AI asistente sa širokim pristupom file sustavu, GitHub aplikacije koje mogu pushati kod u njihovo ime i editore koji automatski pokreću ekstenzije pri startupu. TanStack worm napao je svaki od tih slojeva. Svaki od njih novo je mjesto na kojem se payload može sakriti.
Treća stvar, i to je dio koji najviše utječe na način na koji ćete čitati commitove od sad nadalje, jest da je granica između "moj commit" i "malware commit" zamućena. Kad napadač može krivotvoriti Claude Code potpis na commitu, vidljivi markeri na koje su se revieweri oslanjali prestaju biti pouzdani. AI alati nisu stvorili ovaj problem, ali su proširili površinu na kojoj se impersonacija može dogoditi bez da itko primijeti.
Ništa od ovoga ne znači da je JavaScript gotov ili da trebate prepisati svoj stack u Rustu. Znači da pretpostavka kako je npm pasivni alat gdje upišete ime i dobijete paket natrag, više nije sigurna. Registry je sad dio threat modela.
Što frontend developer zapravo može učiniti
Dobra vijest: većina onoga što djeluje su konkretni koraci, ne heroizam. Evo četiri koja vrijedi napraviti ovaj tjedan.
Sredite version pinning
Otvorite bilo koji package.json napisan u posljednjih pet godina i vidjet ćete nešto poput ovoga:
{
"dependencies": {
"axios": "^1.14.0"
}
}
Caret prefix znači "instaliraj 1.14.0 ili bilo koju kasniju minor ili patch verziju". Dizajniran je za svijet u kojem su minor verzije bile sigurne. U svijetu u kojem minor verzije mogu biti maliciozne, caret je razlog zašto je Axios napad dosegao toliko računala koliko jest. Timovi na ^1.14.0 automatski su povukli 1.14.1 čim se pojavila.
Uklanjanje careta, odnosno pinanje na točne verzije poput 1.14.0, naporno je jer vas tjera da updateove radite ručno. Ali to je ujedno i najveća pojedinačna promjena koju možete napraviti. Updateovi postaju odluka, ne default.
Prestanite ignorirati lockfile
Ako vam je package-lock.json u .gitignore, izbacite ga odande. Commitajte ga. Lockfile bilježi točne resolvane verzije svake tranzitivne ovisnosti u vašem dependency stablu, ne samo onih top-level koje ste sami napisali. Bez njega svaki fresh install na novom računalu je bacanje kocke.
npm audit je koristan kao polazna točka, ali ne hvata napade u realnom vremenu. I Axios i TanStack payload otkrili su vanjski istraživači, ne npm-ovi vlastiti skeneri. Tretirajte audit output kao donji prag provjere, ne gornji.
Pređite na pnpm 10 ili noviji
Ovo je strukturni fix. Pnpm je proteklu godinu proveo shipajući tri featurea koji direktno odgovaraju na attack obrasce koje viđamo.
# .npmrc
minimum-release-age=86400
allow-non-npm-registry=false
ignore-scripts=true
Prva postavka odbija instalaciju bilo koje verzije paketa objavljene prije manje od 24 sata. Većina malicioznih verzija detektira se i ukloni unutar tog vremena, što znači da je čekanje jednog dana iznenađujuće učinkovit filter uz gotovo nikakav trošak.
Druga postavka blokira instalaciju svega što nije došlo kroz službeni npm registry. Egzotični subdependencyji, paketi koji se instaliraju s tarball URL-a, git repozitorija ili eksternog mirrora, čest su vektor za isporuku payloada. Odbijajte ih po defaultu.
Treća postavka blokira automatsko pokretanje install skripti. Mnogi maliciozni paketi oslanjaju se na postinstall hookove za izvršavanje payloada. S ignore-scripts=true morate eksplicitno odobriti svaki paket čije skripte želite dopustiti. Prvi put kad ovo uključite otkrit ćete da je iznenađujuće velik broj paketa u vašem stablu htio pokrenuti kod prilikom instalacije. Upravo u tome je poanta.
Postavite monitoring
Socket.dev, Snyk i GitHub Dependabot alertaju na poznate kompromitacije brže od npm-a. Odaberite jedan i ubacite ga u CI. Nijedan nije savršen, ali bilo koji od njih flagao bi i Axios i TanStack verzije unutar nekoliko sati od objave. Par sati razlike znači čist rebuild umjesto forenzičke istrage.
Provjerite jeste li već bili izloženi
Ako ste bilo što shippali od ožujka, ovo je dio koji trebate odraditi prije nego zatvorite tab.
Za Axios napad, pretražite lockfileove za kompromitiranim verzijama:
grep -rE "axios.*1\.14\.1|axios.*0\.30\.4" package-lock.json
Ako bilo koji string vrati rezultat, to računalo povuklo je malicioznu verziju. Tretirajte ga kao kompromitirano: rotirajte sve credentialse koji su na njemu živjeli, uključujući GitHub i npm tokene, i reinstalirajte OS ako je čuvao bilo što osjetljivo.
Za TanStack napad, relevantni vremenski okvir je uži. Bilo koji @tanstack/* paket instaliran između 19:20 i 19:26 UTC 11. svibnja 2026. je sumnjiv. Provjerite CI logove za instalacije u tom periodu i provjerite lockfileove za @tanstack verzijama koje odgovaraju objavljenom malicioznom setu. Cijeli popis kompromitiranih verzija nalazi se u Rescaninom writeupu linkiranom ispod.
Ako ništa ne matcha, vjerojatno ste imali sreće. Stvar sa srećom je da nije strategija.































