- Zahlreiche npm-Pakete, darunter das Open-Source-Paket @ctrl/tinycolor, wurden mit bösartigen Versionen infiziert; Ursache war der Diebstahl eines npm-Tokens über einen GitHub-Actions-Workflow in einem gemeinsam genutzten Repository
- Der Angreifer nutzte ein npm-Token mit weitreichenden Rechten, um bösartigen Code in etwa 20 Paketen zu veröffentlichen; @ctrl/tinycolor hatte dabei mit 2 Millionen wöchentlichen Downloads eine besonders große Reichweite
- Die infizierten Versionen führten in der
postinstall-Phase eine bösartige Payload aus; die Security-Teams von GitHub und npm reagierten schnell und leiteten Lösch- und Bereinigungsmaßnahmen ein
- Der Autor hat zur Vermeidung künftiger Vorfälle einen verschärften Sicherheitsplan erstellt, darunter die Umstellung auf Trusted Publishing (OIDC), die Minimierung von Token-Berechtigungen, verpflichtendes 2FA und die Nutzung von pnpm-Funktionen
- Der Vorfall zeigt die Anfälligkeit der Software-Lieferkette und macht deutlich, dass verbesserte Sicherheitsfunktionen und geänderte Sicherheitspraktiken im gesamten npm-Ökosystem notwendig sind
TL;DR
- Ein bösartiger GitHub-Actions-Workflow wurde in ein gemeinsam genutztes Repository gepusht und stahl ein npm-Token
- Mit diesem Token veröffentlichte der Angreifer bösartige Versionen von 20 Paketen; darunter war @ctrl/tinycolor, dessen hohe Downloadzahlen die Auswirkungen vergrößerten
- Persönliche Accounts oder Repositories wurden nicht direkt kompromittiert, und es gab weder Phishing noch lokal installierte Malware
- Durch die schnelle Reaktion der Security-Teams von GitHub und npm wurden die bösartigen Versionen entfernt; anschließend wurden saubere Versionen erneut veröffentlicht, um Caches zu bereinigen
Wie ich davon erfahren habe (How I Found Out)
- Am Nachmittag des 15. September informierte Community-Mitglied Wes Todd den Autor per Bluesky-DM über das Problem
- Die Security-Teams von GitHub und npm hatten bereits eine Liste der betroffenen Pakete zusammengestellt und mit der Entfernung begonnen
- Als erster Hinweis wurde der Name des bösartigen Branches „Shai-Hulud“ geteilt, benannt nach dem Sandwurm aus dem Dune-Universum
Was tatsächlich passiert ist (What Actually Happened)
- In dem Repository angulartics2, an dem der Autor vor langer Zeit mitgearbeitet hatte, gab es noch einen Mitwirkenden mit Admin-Rechten
- Ein in diesem Repository gespeichertes npm-Token wurde durch einen bösartigen GitHub-Actions-Workflow gestohlen
- Mit diesem Token veröffentlichte der Angreifer etwa 20 Pakete, darunter @ctrl/tinycolor
- Die Security-Teams von GitHub und npm entfernten die bösartigen Versionen schnell, und der Autor veröffentlichte anschließend neue vertrauenswürdige Versionen
Auswirkungen (Impact)
- Beim Installieren der bösartigen Versionen wurde ein
postinstall-Skript ausgeführt, das ein Sicherheitsrisiko darstellte
- Betroffenen Nutzern wird empfohlen, die sofortigen Reaktionsanweisungen von StepSecurity zu befolgen
Veröffentlichungs-Setup und vorläufiger Plan (Publishing Setup & Interim Plan)
- Bisher erfolgte die automatische Veröffentlichung mit einer Kombination aus semantic-release + GitHub Actions
- Die npm-Funktion provenance wurde genutzt, konnte aber einen Angreifer mit einem gültigen Token nicht aufhalten
- Künftig ist die Einführung von Trusted Publishing (OIDC) geplant, um statische Tokens abzuschaffen
- Derzeit wurden alle Tokens widerrufen; zusätzlich werden 2FA verpflichtend gemacht, nur noch Tokens mit granularen Rechten erlaubt und die pnpm-Funktion minimumReleaseAge geprüft
Gewünschte Verbesserungen (Publishing Wishlist)
- Es braucht auf npm-Account-Ebene eine Option zur Erzwingung von OIDC-basiertem Trusted Publishing
- Notwendig sind eine Sperrfunktion für Veröffentlichungen ohne provenance sowie vollständige Integrationsunterstützung für semantic-release und OIDC
- Gewünscht wird eine Funktion in der GitHub-Oberfläche für manuell genehmigte Releases auf Basis von 2FA
- Schutzfunktionen auf dem Niveau von GitHub Environments sollten auch ohne Pro-Abonnement nutzbar sein
- Auf npm-Paketseiten sollte sichtbar sein, ob ein
postinstall-Skript vorhanden ist, und bei gelöschten Versionen sollte der Grund offengelegt werden
Noch keine Kommentare.