Laaja npm-hyökkäys saastutti satoja paketteja ja varastaa kehittäjien tunnuksia

Npm hyökkäys

Aikido Security on havainnut laajan npm-toimitusketjuhyökkäyksen, jossa Shai-Hulud-haittaohjelman uusi muunnelma on levinnyt suosittujen JavaScript-pakettien kautta.

Hyökkäys alkoi tietoturvayhtiön mukaan Keyv-kirjaston ylläpitäjän jaredwray-nimisen GitHub-tilin kaappaamisesta. Hyökkääjät lisäsivät haitallista koodia pakettien päähaaroihin ja julkaisivat uudet versiot npm-rekisteriin GitHub Actionsin kautta.

Tämä on merkittävää, sillä saastuneet paketit saivat normaalilta näyttävän GitHub Actions -provenienssin. Julkaisuketju itsessään toimi odotetulla tavalla, mutta hyökkääjä oli jo saanut haltuunsa sen käyttämän GitHub-tilin.

Ensimmäisten vaarantuneiden pakettien joukossa olivat Keyv, cacheable, cache-manager, cacheable-request, flat-cache ja file-entry-cache.

Kyse on erittäin suosituista riippuvuuksista. Aikidon mukaan esimerkiksi flat-cache kerää noin 565 miljoonaa ja file-entry-cache noin 557 miljoonaa latausta kuukaudessa.

Haittaohjelma käynnistyy jo npm install -komennolla

Hyökkääjät lisäsivät saastuneisiin paketteihin setup.mjs- ja Math_Symbol.js-tiedostot sekä package.json-tiedostoon preinstall-komennon. Tämän seurauksena haitallinen koodi voidaan suorittaa jo npm install -komennon yhteydessä ennen paketin varsinaisen asennuksen valmistumista.

setup.mjs lataa Bun JavaScript -runtimen, jolla suoritetaan voimakkaasti obfuskoitu Math_Symbol.js. Aikidon mukaan noin 728 kilotavun kokoinen tiedosto sisältää varsinaisen tunnusten varastamiseen ja hyökkäyksen levittämiseen käytettävän koodin.

Riski ei siis rajoitu sovelluksiin, jotka suoritetaan tuotannossa. Myös kehittäjän tietokone tai CI/CD-ympäristö voi vaarantua pelkästään riippuvuuksien asentamisen seurauksena.

Shai-Hulud leviää uusiin npm-paketteihin

Hyökkäyksestä tekee erityisen vaarallisen Shai-Huludin matomainen toimintatapa. Jos haittaohjelma onnistuu varastamaan npm-ylläpitäjän julkaisutunnuksen, sitä voidaan käyttää uusien pakettien saastuttamiseen. Aikido kertoi havainneensa hyökkäyksen aikana jopa 50–100 uutta saastunutta pakettia muutaman minuutin välein.

Elokuun 4. päivän päivityksessä yhtiö ilmoitti tunnistaneensa vähintään 868 vaarantunutta pakettia ja 1 381 saastunutta versiota.

Niiden yhteenlaskettu normaali asennusmäärä ylitti kaksi miljardia kuukaudessa. Tämä ei tarkoita kahta miljardia tartuntaa, mutta kertoo hyökkäyksen kohteeksi joutuneiden pakettien laajasta käytöstä.

Haittaohjelma etsii GitHub-, npm- ja AWS-tunnuksia

Math_Symbol.js etsii järjestelmästä suuren määrän erilaisia tunnuksia ja salaisuuksia. npm-tunnuksia haetaan esimerkiksi ~/.npmrc-tiedostosta. GitHubista haittaohjelma etsii muun muassa henkilökohtaisia access tokeneita, OAuth-tunnuksia ja GitHub App -tokeneita.

GitHub Actions -ympäristöissä ohjelmisto pyrkii myös käsiksi runnerin salaisuuksiin ja OIDC-tokenien pyytämisessä käytettäviin tietoihin.

AWS on toinen merkittävä kohde. Haittaohjelma lukee AWS credentials- ja config-tiedostoja, tarkistaa ympäristömuuttujia ja yrittää käyttää EC2- ja ECS-ympäristöjen metadata-palveluita.

Myös Kubernetes- ja Vault-tunnuksia etsitään. Haittaohjelma voi esimerkiksi lukea Kubernetes service account -tokeneita ja yrittää käyttää niitä salaisuuksien hakemiseen Kubernetes API kautta.

Lisäksi etsinnän kohteisiin kuuluvat muun muassa .env-tiedostot, SSH-avaimet, Terraform state -tiedostot, Docker-tunnukset sekä Stripe- ja Slack-avaimet.

Saastuneen version asentaneet joutuvat tarkistamaan tunnuksensa

Organisaatioiden kannattaa selvittää, onko jokin saastuneista pakettiversioista päätynyt niiden riippuvuuksiin. Tarkistus pitää tehdä myös transitiivisille riippuvuuksille, sillä vaarantunut paketti voi tulla projektiin toisen kirjaston mukana.

Lockfile-tiedostot ja CI/CD-järjestelmien lokit voivat auttaa selvittämään, mitä versioita ympäristöissä on todella asennettu.

Jos saastunut versio on suorittanut preinstall-skriptinsä, pelkkä paketin päivittäminen ei välttämättä riitä. Myös kyseisessä ympäristössä saatavilla olleet npm-, GitHub-, AWS-, Kubernetes- ja muut tunnukset voivat olla vaarantuneita.

Hyökkäys osoittaa samalla toimitusketjun allekirjoitusten ja provenienssitietojen rajoituksen. Kelvollinen GitHub Actions -provenienssi voi vahvistaa, että paketti julkaistiin odotetun prosessin kautta, mutta se ei takaa lähdekoodin turvallisuutta, jos hyökkääjä on jo saanut haltuunsa ylläpitäjän tilin.