Elokuun neljäntenä päivänä npm-rekisteriin ilmestyi sarja päivityksiä, joita kukaan ei ollut pyytänyt. Alle neljässä tunnissa haittakoodi oli levinnyt 444 pakettiin ja 2 212 versioon. Mukana oli keyv, jota ladataan yli 150 miljoonaa kertaa viikossa.
Luvut vaihtelevat lähteestä toiseen, koska laskenta jatkui yhä hyökkäyksen aikana. BleepingComputer raportoi 868 paketista ja 1 381 versiosta, ja päivän päättyessä puhuttiin jo yli 1 300 paketista. Microsoft nimesi kampanjan ChainDropiksi ja julkaisi siitä analyysin samana päivänä.
Mittakaava ei kuitenkaan ole se, mikä sai tietoturvaväen hiljaiseksi. Se on piilopaikka.
Riippuvuusskanneri ei katso sinne, minne mato meni
ChainDrop pääsee koneelle tavanomaista reittiä. Se ajetaan npm:n preinstall-koukusta, siis ennen kuin asennus ehtii edes valmistua. Koodi toimii ennen kuin useimmat tarkistukset heräävät, sekä kehittäjän koneella että CI/CD-putkessa.
Sen jälkeen se tekee jotain, mitä aiemmat npm-madot eivät ole tehneet. Haittakoodi kirjoittaa itsensä repositorion asetustiedostoihin. Microsoftin mukaan kohteena ovat Claude Coden ja Visual Studio Coden konfiguraatiot, muun muassa asetus- ja käynnistystiedostot, jotka editori tai koodausavustaja lukee automaattisesti projektin avautuessa.
Nämä tiedostot ovat riippuvuusskannerien katvealuetta. Skanneri lukee package.jsonin ja lukkotiedoston, laskee riippuvuuspuun ja vertaa sitä haavoittuvuustietokantaan. Editorin asetustiedosto ei ole riippuvuus, joten sitä ei lueta. Se ei ole skannerin vika, vaan sen määritelmä.
Käytännön seuraus on ikävä. Kun saastunut repositorio on kerran kirjoitettu levylle, mato ei tarvitse enää npm installia. Projektin avaaminen editorissa tai koodausavustajassa riittää käynnistämään kuorman uudelleen. Kloonaus GitHub:sta ja yksi klikkaus, siinä koko tartuntaketju.
“Kampanja näyttäytyi nopeana sarjana luvattomia korjauspäivityksiä yli 400 npm-pakettiin, joita ylläpitivät toisistaan riippumattomat julkaisijat. Monilla haitallisilla versioilla ei ollut lainkaan vastaavaa committia, pull requestia, tagia tai laillista julkaisua lähdekoodissa.”
Komentokanava lohkoketjussa, vahtikoodi tunnuksissa
Varastettu tavara on tuttua listaa: GitHub- ja npm-tunnisteita, AWS-avaimia, Kubernetes-salaisuuksia, Vault-tokeneita sekä Stripen ja Twilion tunnuksia. Osa niistä riittää julkaisemaan uusia versioita muiden ylläpitäjien paketteihin, ja juuri siitä madon itsenäinen leviäminen syntyy.
Komentokanava sen sijaan ei ole tuttu. ChainDrop hakee ajantasaisen palvelinosoitteensa Ethereumin älysopimuksesta. Verkkotunnuksen voi sulkea, mutta lohkoketjuun kirjattua osoitetietoa ei saa poistettua eikä sen päivittämistä estettyä. Hyökkääjä vaihtaa kohteen, ja mato löytää perille. Varajärjestelmänä toimivat GitHub-repositoriot.
Epämiellyttävin yksityiskohta on kuitenkin vahtikoodi. Haittaohjelma seuraa varastamiaan tunnuksia ja käynnistää tuhoavan rutiinin, jos seurattu tunnus mitätöidään. Puolustajan ensimmäinen refleksi, tunnusten vaihtaminen, on siis laukaisin. Siivous on pakko tehdä siinä järjestyksessä, jonka hyökkääjä on valinnut: ensin kone irti verkosta, vasta sitten avaimet uusiksi puhtaalta laitteelta.
Kevyt koodaaminen kasvatti hyökkäyspinnan
Suomessa on juuri nyt poikkeuksellisen paljon ihmisiä, jotka kloonaavat vieraita repositorioita ja avaavat ne suoraan koodausavustajaan. Kevyt koodaaminen on madaltanut kynnystä kokeilla: löydät GitHub:sta lupaavan projektin, avaat sen Cursorissa tai Claude Codessa ja pyydät avustajaa selittämään, mitä se tekee. Kolme minuuttia, ei sitoumuksia.
ChainDrop tekee tuosta liikkeestä riskin. Koodausavustaja ei ole passiivinen lukija vaan ympäristö, joka lukee projektin asetukset ja voi ajaa niissä määriteltyjä komentoja. Sama luottamus, joka tekee työkalusta hyödyllisen, tekee siitä hyökkäyspinnan. AI Suomi kertoi aiemmin tapauksesta, jossa yksi kommentti riitti vuotamaan avaimet Googlen agentilta. Ero on siinä, että ChainDrop ei tarvitse edes kehotetta.
Yritykselle lasku ei tule saastuneesta paketista vaan siitä, mitä kehittäjän koneella sattui olemaan auki. Tuotantoavaimet, pilvitunnukset ja julkaisuoikeudet ovat samassa kannettavassa kuin viikonlopun harrasteprojekti. Jos talossa ei ole valmista vastausta kysymykseen, mitä tapahtuu kun yhden kehittäjän kone katsotaan menetetyksi, vastaus keksitään kiireessä ja väärin.
Vaikutus ulottuu ohjelmistotalojen ulkopuolelle. keyv:n kaltainen välimuistikirjasto pyörii verkkokaupoissa, tunnistautumispalveluissa ja sisäisissä järjestelmissä, joita kukaan käyttäjä ei koskaan näe. Rust-yhteisö veti keväällä rajan siihen, että tekoäly saa lukea koodia mutta ei kirjoittaa sitä, ja avoimen lähdekoodin projekteja on jo yritetty soluttaa tekoälyn luomilla valehenkilöillä. Molemmat varotoimet näyttävät nyt vähemmän ylimitoitetuilta kuin silloin, kun niistä päätettiin.
Mitä kehittäjän kannattaa tarkistaa
Katso vieraan repositorion .claude- ja .vscode-hakemistot tekstinä ennen kuin avaat projektin editorissa. Älä anna työkalun ajaa niitä puolestasi.
Kytke tehtävien automaattinen ajo pois editorin asetuksista ja pidä koodausavustajan komentojen hyväksyntä päällä myös silloin, kun se hidastaa työtä.
Käytä lukkotiedostoja, uusien versioiden odotusaikaa ja asennusskriptien ohitusta siellä missä se on mahdollista. Päivitä npm-työkalu uusimpaan versioon.
Jos epäilet tartuntaa: irrota kone verkosta ensin, vaihda tunnukset vasta sen jälkeen puhtaalta laitteelta, tyhjennä välimuistit ja rakenna artefaktit uudelleen luotetuista lähteistä.
Käy läpi GitHub Actionsin OIDC-oikeuksien laajuus ja työnkulkujen hyväksynnät. Microsoft kehottaa käsittelemään altistunutta kehityskonetta täysin menetettynä.



