A seguito della compromissione del processo di creazione dei rilasci basato su GitHub Actions nel progetto TanStack, gli attaccanti sono riusciti a pubblicare nel repository NPM 84 versioni malevole, coprendo 42 pacchetti NPM della stack TanStack. Alcuni dei pacchetti compromessi avevano più di 10 milioni di download a settimana.
L'accesso alla pubblicazione dei rilasci è stato ottenuto a causa di una configurazione errata del pull_request_target "Pwn Request" in GitHub Actions (l'indicazione della maschera nelle impostazioni ha portato all'attivazione di pull_request_target per le pull request in fork esterni), alla contaminazione della cache di GitHub Actions tramite un fork e alla possibilità di estrarre il token OIDC dalla memoria del processo runner attivo (Runner.Worker) leggendo il contenuto /proc//mem.
I pacchetti NPM con modifiche dannose sono stati pubblicati l'11 maggio tra le 22:20 e le 22:26 (MSK), notati dopo 20 minuti e bloccati dopo un'ora e mezza. Per ciascuno dei pacchetti NPM compromessi sono state rilasciate due versioni dannose, nelle quali è stato integrato un codice per attivare il worm mini-shai-hulud, che cercava token e credenziali nell'ambiente attuale. In caso di rilevamento di un token di accesso al repository NPM, il worm pubblicava automaticamente nuove release dannose per i pacchetti in fase di sviluppo nell'ambiente attuale, compromettendo l'albero delle dipendenze. In questo modo, oltre 400 pacchetti NPM che utilizzano i pacchetti TanStack tra le dipendenze sono stati compromessi.
Il worm era contenuto nel file router_init.js e si attivava quando il pacchetto compromesso veniva installato manualmente dallo sviluppatore o in modo automatizzato nell'ambiente di integrazione continua mediante i comandi «npm install», «pnpm install» o «yarn install». Dopo l'attivazione, il worm cercava nella sistema i token di NPM (~/.npmrc), AWS, GCP, Azure, HashiCorp e KubernetesK8s, così come le chiavi SSH private. I dati trovati venivano inviati agli aggressori tramite il messenger decentralizzato P2P getsession.org.
Il worm era progettato per eseguire azioni distruttive nel caso di revoca del token NPM intercettato: veniva configurato un avvio periodico dello script ~/.local/bin/gh-token-monitor.sh, che controllava l'attività del token ogni 60 secondi tramite una chiamata a api.github.com/user e, in caso di revoca del token, eseguiva il comando «rm -rf ~/».
Fonte: opennet.ru
