Durch die Kompromittierung des Release-Prozesses bei GitHub Actions gelang es Angreifern, 84 bösartige Versionen in das NPM-Repository zu veröffentlichen, die 42 NPM-Pakete aus dem TanStack-Stack betrafen. Einige der kompromittierten Pakete verzeichneten über 10 Millionen Downloads pro Woche.
Der Zugriff auf die Veröffentlichung von Releases wurde aufgrund einer falschen Konfiguration des pull_request_target „Pwn Request“ in GitHub Actions erlangt (die Angabe einer Maske in den Einstellungen führte dazu, dass pull_request_target für Pull-Requests in externe Forks ausgelöst wurde), durch Vergiftung des GitHub Actions-Caches über einen Fork und die Möglichkeit, ein OIDC-Token aus dem Speicher des laufenden Runner-Prozesses (Runner.Worker) durch Lesen des Inhalts von /proc//mem zu extrahieren.
Die NPM-Pakete mit bösartigen Änderungen wurden am 11. Mai zwischen 22:20 und 22:26 (MSK) veröffentlicht, nach 20 Minuten bemerkt und nach anderthalb Stunden blockiert. Für jedes der betroffenen NPM-Pakete wurden zwei bösartige Versionen mit integriertem Code zur Aktivierung des Wurms mini-shai-hulud veröffentlicht, der nach Tokens und Anmeldedaten im aktuellen Umfeld sucht. Bei der Entdeckung eines Verbindungstokens zum NPM-Verzeichnis veröffentlichte der Wurm automatisch neue bösartige Releases für die im aktuellen Umfeld entwickelten Pakete und traf damit den Abhängigkeitsbaum. Dadurch wurden mehr als 400 NPM-Pakete, die TanStack-Pakete in ihren Abhängigkeiten verwendeten, kompromittiert.
Der Wurm war in der Datei router_init.js eingebettet und aktivierte sich, wenn das betroffene Paket manuell vom Entwickler oder automatisiert in einer CI-Umgebung mit den Befehlen „npm install“, „pnpm install“ oder „yarn install“ installiert wurde. Nach der Aktivierung suchte der Wurm im System nach Tokens zu NPM (~/.npmrc), AWS, GCP, Azure, HashiCorp und Kubernetes K8s sowie nach privaten SSH-Schlüsseln. Die gefundenen Daten wurden über den dezentralen P2P-Messenger getsession.org an die Angreifer übermittelt.
Der Wurm war so konzipiert, dass er destruktive Aktionen durchführt, falls das abgefangene NPM-Token zurückgezogen wird — im System wurde ein zeitgesteuertes Skript ~~/local/bin/gh-token-monitor.sh eingerichtet, das alle 60 Sekunden die Aktivität des Tokens über einen Aufruf an api.github.com/user überprüfte und im Falle des Widerrufs des Tokens den Befehl „rm -rf ~/“ ausführte.
Quelle: opennet.ru
