Supply-Chain-Angriff auf npm-Pakete: CI/CD-Pipeline, GitHub Actions und kompromittierte Pakete als Risiko für Unternehmen
Blog

Mini Shai-Hulud und TanStack: Warum CI/CD-Sicherheit zur Chefsache wird

Mini Shai-Hulud kompromittierte TanStack- und weitere npm/PyPI-Pakete. Was Unternehmen zu CI/CD-Sicherheit und Supply-Chain-Schutz wissen müssen.

Mika Schmidt, IT Security Experte

Mika Schmidt

IT Security Experte

Der Supply-Chain-Angriff auf TanStack ist ein Warnsignal für jedes Unternehmen, das moderne JavaScript-, TypeScript- oder Python-Abhängigkeiten nutzt. Am 11. Mai 2026 zwischen 19:20 und 19:26 UTC wurden laut TanStack 84 kompromittierte Versionen von 42 @tanstack/*-Paketen auf npm veröffentlicht. Die Veröffentlichung lief nicht über ein klassisches „npm-Token gestohlen”-Szenario, sondern über die legitime GitHub-Actions-Release-Pipeline.

Genau deshalb ist der Fall so relevant: Die kompromittierten Pakete sahen nicht aus wie ein plumper Fremdkörper neben der Pipeline. Die Angreifer missbrauchten das Vertrauensmodell der Pipeline selbst – mit pull_request_target, GitHub-Actions-Cache-Poisoning und der Extraktion eines OIDC-Tokens aus dem Runner-Prozess.

Was ist passiert?

TanStack beschreibt eine Angriffskette, die drei Sicherheitsannahmen miteinander verkettete. Ein Angreifer öffnete einen Pull Request aus einem Fork. Ein Workflow mit pull_request_target lief im Kontext des Ziel-Repositories und führte Code aus dem Pull-Request-Kontext aus. Diese Klasse von Fehlern ist als „Pwn Request”-Muster bekannt; GitHub Security Lab warnt seit Jahren davor, untrusted PR-Code in privilegierten Workflows auszuführen.

Der zweite Baustein war GitHub-Actions-Cache-Poisoning. Der Angreifer brachte schadhaften Inhalt in den pnpm-Store-Cache ein. Dieser Cache wurde später vom legitimen Release-Workflow auf main wiederhergestellt. Der dritte Baustein war OIDC-Token-Extraktion: Weil der Release-Workflow für npm Trusted Publishing berechtigterweise id-token: write nutzte, konnte die Malware ein OIDC-Token aus dem Runner-Kontext gewinnen und direkt gegen registry.npmjs.org veröffentlichen.

Die Kurzform der Angriffskette

  1. 1

    Fork-PR triggert einen privilegierten pull_request_target-Workflow.

  2. 2

    Schadcode landet über den pnpm-Store im GitHub-Actions-Cache des Basis-Repositories.

  3. 3

    Ein legitimer Release-Workflow stellt den vergifteten Cache wieder her.

  4. 4

    Malware liest Runner-Speicher, extrahiert OIDC-Kontext und publiziert kompromittierte Pakete über den Trusted-Publishing-Pfad.

Warum TanStack ein Warnsignal für moderne DevOps-Prozesse ist

Der TanStack-Fall ist kein Randproblem für Open-Source-Maintainer. Er zeigt eine strukturelle Schwachstelle vieler DevOps-Setups: CI/CD-Runner sind häufig die Stelle, an der Quellcode, Build-Artefakte, Cloud-Zugangsdaten, Deployment-Rechte und Paketveröffentlichungen zusammenlaufen. Wer dort Code ausführen kann, steht oft sehr nah an produktiven Schlüsseln.

Besonders unangenehm ist die Rolle von Provenance. StepSecurity hebt hervor, dass die kompromittierten Pakete teilweise gültige SLSA-Level-3-Provenance-Attestations hatten. Das ist kein Widerspruch: Provenance kann zeigen, dass ein Paket aus der erwarteten Pipeline stammt. Sie beweist aber nicht, dass diese Pipeline während des Builds sauber war.

Der eigentliche Vertrauensbruch fand nicht neben der Release-Pipeline statt, sondern in ihr. Das macht den Vorfall für Unternehmen so gefährlich.

Betroffene Pakete und Umfang

Für TanStack bestätigt das offizielle Postmortem 42 betroffene Pakete mit jeweils zwei kompromittierten Versionen. Nicht betroffen waren laut TanStack unter anderem @tanstack/query*, @tanstack/table*, @tanstack/form*, @tanstack/virtual*, @tanstack/store und das Meta-Package @tanstack/start selbst. Betroffen waren dagegen verschiedene Router-, Start- und Adapter-Pakete.

Die Kampagne war größer als TanStack. SafeDep beschreibt eine koordinierte Aktion gegen über 170 npm-Pakete und zwei PyPI-Pakete mit insgesamt 404 schadhaften Versionen. Aikido zählt zum Analysezeitpunkt 373 malicious package-version entries über 169 npm-Paketnamen. Diese Abweichung ist bei laufenden Untersuchungen normal: Datenquellen, Zeitpunkte und Zählweisen unterscheiden sich.

Umfang am 12. Mai 2026

BereichBekannter Stand am 12. Mai 2026Einordnung
TanStack42 Pakete, 84 VersionenOffiziell bestätigt
npm gesamtüber 160 bis über 170 PaketnamenJe nach Quelle und Erhebungszeitpunkt
PyPImistralai und guardrails-aiAndere Payload-Mechanik als npm

Weitere in Berichten genannte Ökosysteme und Paketgruppen waren unter anderem @uipath/*, @mistralai/mistralai, @opensearch-project/opensearch, @squawk/* und @tallyui/*. Für eine operative Prüfung sollten Teams nicht nur nach TanStack suchen, sondern auch Dependency- und Registry-Scanner gegen die laufend aktualisierten Advisory-Daten laufen lassen.

Was die Malware stehlen wollte

Die TanStack-Pakete enthielten laut Advisory eine etwa 2,3 MB große obfuskierte JavaScript-Datei namens router_init.js. Sie konnte bei npm install, pnpm install oder yarn install über den Installationspfad ausgeführt werden. Der Payload zielte auf Zugangsdaten, die in Entwicklerumgebungen und CI/CD besonders wertvoll sind.

  • GitHub-Tokens aus Umgebungsvariablen, gh-CLI-Konfiguration und .git-credentials
  • npm-Tokens aus ~/.npmrc
  • AWS Instance Metadata Service und AWS Secrets Manager
  • GCP Metadata Service
  • Kubernetes-Service-Account-Tokens
  • HashiCorp-Vault-Tokens
  • SSH-Private-Keys

Die Exfiltration lief unter anderem über filev2.getsession.org sowie seed1.getsession.org, seed2.getsession.org und seed3.getsession.org. Wiz nennt zusätzlich git-tanstack[.]com und die IP 83.142.209[.]194 als relevante Netzwerkindikatoren. Diese IOCs sollten in DNS-, Proxy- und EDR-Telemetrie geprüft werden.

PyPI-Variante: gleiche Kampagne, anderer Mechanismus

Neben npm waren laut SafeDep auch PyPI-Pakete betroffen, darunter mistralai==2.4.6 und guardrails-ai==0.10.1. Die Python-Variante nutzte einen anderen Mechanismus: Beim Import wurde ein Dropper ausgeführt, der transformers.pyz von einer attacker-kontrollierten Domain herunterlud und mit python3 startete.

Wiz beschreibt weitere Details der Python-Variante, darunter Linux-spezifische Ausführungsbedingungen, Abbruchlogik bei bestimmten Systemmerkmalen und zusätzliche Exfiltrationsziele. Diese Details sind für Detection nützlich, sollten aber als laufende Threat-Intel-Lage behandelt werden: Bei aktiven Supply-Chain-Kampagnen können sich Payloads, Infrastruktur und Paketlisten schnell ändern.

Warum gültige Provenance nicht automatisch Sicherheit bedeutet

Trusted Publishing, OIDC und SLSA-Provenance sind sinnvolle Bausteine. Sie reduzieren langfristige Publish-Tokens, schaffen nachvollziehbare Herkunftsinformationen und erschweren klassische Token-Diebstahl-Szenarien. Der TanStack-Vorfall zeigt aber ihre Grenze: Wenn untrusted Code über Cache oder Build-Schritte in den Release-Kontext gelangt, kann die Pipeline weiterhin formal „echt” sein und trotzdem schadhaft bauen oder veröffentlichen.

Für Security-Teams heißt das: Herkunftsnachweise sind ein Signal, kein Freifahrtschein. Entscheidend bleibt, ob die Pipeline zwischen untrusted Pull Requests, Build-Caches, Testjobs und Publish-Rechten klare Grenzen zieht. Ein Release-Workflow mit id-token: write sollte nur Code ausführen, der diesen Vertrauensstatus wirklich verdient.

Sofortmaßnahmen für Entwickler- und Security-Teams

Die wichtigste operative Frage lautet: Wurde am 11. Mai 2026 eine betroffene Version auf einem Entwicklergerät, CI-Runner, Build-Image oder Deployment-Host installiert? Wenn ja, sollte das System nicht nur als „Dependency betroffen”, sondern als mögliche Credential-Exposition behandelt werden.

bash
rg -n "router_init\.js|router_runtime\.js|tanstack_runner\.js|setup\.mjs|@tanstack/setup|79ac49eedf774dd4b0cfa308722bc463cfe5885c" .
IOC-Dateien suchen
bash
rg -n "@tanstack/(history|react-router|router-core|router-utils|router-plugin|virtual-file-routes|router-generator|start-|react-start|solid-|vue-|zod-adapter|valibot-adapter|arktype-adapter|eslint-plugin-start|eslint-plugin-router)" package-lock.json pnpm-lock.yaml yarn.lock bun.lockb
Lockfiles auf betroffene TanStack-Pakete prüfen

Eine sinnvolle Sofortreaktion besteht aus fünf Schritten:

Sofortreaktion in fünf Schritten

  1. 1

    Exposition prüfen

    Lockfiles, CI-Logs, Build-Artefakte, Paket-Caches und Entwicklergeräte nach betroffenen Versionen und IOCs durchsuchen.

  2. 2

    Persistenz prüfen

    Wiz empfiehlt insbesondere, vor der Token-Rotation nach gh-token-monitor sowie auffälligen .claude/- und .vscode/-Artefakten zu suchen.

  3. 3

    Secrets rotieren

    GitHub-PATs, npm-Tokens, Cloud-Zugangsdaten, Kubernetes-Service-Accounts, Vault-Tokens, SSH-Keys und CI/CD-Secrets erneuern, wenn eine betroffene Version installiert wurde.

  4. 4

    Netzwerkindikatoren prüfen

    DNS-, Proxy-, Firewall- und EDR-Daten auf git-tanstack[.]com, filev2.getsession.org und seed*.getsession.org untersuchen.

  5. 5

    Release-Rechte einfrieren

    Bis zur Klärung keine automatischen Publishes aus betroffenen Workflows zulassen und npm-/PyPI-Maintainerrechte temporär minimal halten.

CI/CD-Workflows auditieren

Der langfristig wichtigste Teil ist ein Audit der Build- und Release-Workflows. Suchen Sie insbesondere nach pull_request_target, nach Cache-Wiederverwendung zwischen untrusted PRs und main, nach Workflows mit id-token: write und nach Publish-Rechten, die in Test-, Benchmark- oder Analysejobs verfügbar sind.

bash
rg -n "pull_request_target|id-token:\s*write|actions/cache|trusted.?publish|npm publish|pypi|twine" .github/workflows
Workflows auf riskante Muster prüfen

Gute Zielbilder für GitHub Actions:

  • pull_request_target nur für Metadaten-Aktionen wie Labels oder Kommentare verwenden, nicht für Checkout und Ausführung von Fork-Code.
  • Caches strikt nach Vertrauensgrenze trennen: untrusted PR-Jobs dürfen keine Artefakte erzeugen, die Release-Jobs auf main später blind wiederverwenden.
  • id-token: write nur in minimalen Publish-Jobs setzen, nicht in Test-, Benchmark- oder Build-Jobs mit großer Codeausführungsfläche.
  • Third-Party-Actions auf Commit-SHAs pinnen und nicht dauerhaft auf Floating Refs wie @main oder breite Major-Tags vertrauen.
  • Paketveröffentlichungen monitoren: Wer hat wann welche Version aus welchem Workflow veröffentlicht, und passte das zum erwarteten Release-Schritt?

Indicators of Compromise

Die folgenden Indikatoren eignen sich für eine erste Suche. Sie ersetzen keine vollständige Incident-Response-Analyse, helfen aber, schnell zwischen „wahrscheinlich nicht betroffen” und „muss untersucht werden” zu unterscheiden.

Indicators of Compromise

KategorieIndikatoren
Dateien / Artefakterouter_init.js, router_runtime.js, tanstack_runner.js, setup.mjs, @tanstack/setup
Dependency-Hinweisgithub:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c
Netzwerkfilev2.getsession.org, seed1.getsession.org, seed2.getsession.org, seed3.getsession.org, git-tanstack[.]com, 83.142.209[.]194
VerhaltenUnerwartete Install-Scripts, ausgehende Verbindungen während Dependency-Installation, ungeplante npm-Publishes, ungewöhnliche OIDC-Token-Anfragen in GitHub Actions

Langfristige Schutzmaßnahmen für Unternehmen

Mini Shai-Hulud ist kein Argument gegen Open Source. Es ist ein Argument dafür, Software-Lieferketten wie produktive Systeme zu behandeln. Wer Abhängigkeiten baut, testet und veröffentlicht, betreibt faktisch eine kleine Produktionsumgebung mit hoher Auswirkung auf Kunden, Systeme und Daten.

Fazit: CI/CD ist ein Hochrisiko-System

Der Mini-Shai-Hulud-/TanStack-Vorfall zeigt, dass Unternehmen ihre CI/CD-Pipelines wie produktive Hochrisiko-Systeme behandeln müssen: mit minimalen Rechten, klarer Trennung von vertrauenswürdigen und untrusted Workflows, sauberer Secret-Hygiene, Monitoring und geübten Incident-Response-Prozessen.

Provenance, Trusted Publishing und OIDC bleiben wichtige Bausteine. Aber sie schützen nur dann, wenn die Pipeline selbst vertrauenswürdig bleibt. Der entscheidende Kontrollpunkt liegt nicht erst im Paket-Registry-Account, sondern viel früher: bei jedem Workflow, der untrusted Code annimmt, Caches schreibt oder Release-Rechte berühren kann.

Häufige Fragen

Diese FAQ ist als schnelle Betroffenheitsprüfung gedacht: Wenn Sie ein Projekt, einen CI-Runner oder ein Entwicklergerät untersuchen, starten Sie mit Lockfiles, Installationszeitpunkt, IOCs und Secret-Exposition.

Häufige Fragen

Bin ich vom Mini-Shai-Hulud- oder TanStack-Supply-Chain-Angriff betroffen?
Sie sind potenziell betroffen, wenn Ihr Projekt am 11. Mai 2026 eine kompromittierte Version eines betroffenen @tanstack/*-Pakets, eines weiteren betroffenen npm-Pakets oder der PyPI-Pakete mistralai beziehungsweise guardrails-ai installiert hat. Prüfen Sie package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lockb, requirements.txt, poetry.lock, CI-Logs und Build-Artefakte auf betroffene Paketnamen, Versionen und IOCs.
Wie prüfe ich schnell, ob mein Projekt betroffene TanStack-Versionen installiert hat?
Suchen Sie in Ihren Lockfiles und CI-Logs nach @tanstack/history, @tanstack/react-router, @tanstack/router-core, @tanstack/router-utils, @tanstack/router-plugin, @tanstack/start-*, @tanstack/react-start, @tanstack/solid-* und @tanstack/vue-*. TanStack bestätigt 42 betroffene @tanstack/*-Pakete mit jeweils zwei kompromittierten Versionen. Wenn eine Installation am 11. Mai 2026 stattfand, behandeln Sie den Installationshost als potenziell kompromittiert.
Welche TanStack-Pakete waren laut TanStack nicht betroffen?
Nicht betroffen waren laut TanStack unter anderem @tanstack/query*, @tanstack/table*, @tanstack/form*, @tanstack/virtual*, @tanstack/store und das Meta-Package @tanstack/start. Wichtig: Das Meta-Package @tanstack/start ist nicht dasselbe wie betroffene Start- und Adapter-Pakete. Prüfen Sie deshalb nicht nur den Paketnamen grob, sondern die konkrete Lockfile-Version.
Welche Indicators of Compromise zeigen eine Mini-Shai-Hulud-Infektion?
Wichtige IOCs sind router_init.js, router_runtime.js, tanstack_runner.js, setup.mjs, @tanstack/setup und github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c. Netzwerkseitig sollten filev2.getsession.org, seed1.getsession.org, seed2.getsession.org, seed3.getsession.org, git-tanstack[.]com und 83.142.209[.]194 geprüft werden.
Was muss ich tun, wenn eine betroffene Version installiert wurde?
Isolieren Sie den betroffenen Host oder CI-Runner, sichern Sie relevante Logs und prüfen Sie zuerst auf Persistenzartefakte wie gh-token-monitor. Rotieren Sie danach GitHub- und npm-Tokens, Cloud-Credentials, Kubernetes-Service-Accounts, Vault-Tokens, SSH-Keys und CI/CD-Secrets. Prüfen Sie außerdem, ob unerwartete npm- oder PyPI-Publishes aus Ihrem Konto oder Ihren Workflows erfolgt sind.
Schützen SLSA-Provenance und npm Trusted Publishing vor diesem Angriff?
Nicht vollständig. Provenance und Trusted Publishing sind wichtige Schutzmechanismen gegen klassische Token-Diebstahl-Szenarien. Beim TanStack-Vorfall wurde aber die legitime Release-Pipeline selbst missbraucht. Ein Paket kann deshalb formal korrekte Provenance haben und trotzdem schadhaften Code enthalten, wenn der Build- oder Release-Kontext kompromittiert wurde.
Sind nur JavaScript- und npm-Projekte betroffen?
Nein. Die Kampagne betraf primär npm, aber SafeDep nennt auch PyPI-Pakete, darunter mistralai==2.4.6 und guardrails-ai==0.10.1. Python-Projekte sollten deshalb ebenfalls Lockfiles, Build-Logs und Import-Pfade prüfen, wenn diese Pakete rund um den 11. Mai 2026 installiert oder aktualisiert wurden.

Themen

Supply-Chain-Angriffnpm MalwareGitHub ActionsCI/CD SecuritySoftware Supply Chain SecurityCredential StealerIncident Response

Quellen

  1. TanStack: Postmortem zur npm-Supply-Chain-KompromittierungTanStack Blog / Tanner Linsley, 11. Mai 2026 – offizielle technische Analyse zu Ursache, Timeline, Impact und IOCs
  2. GitHub Advisory: Malware in 42 @tanstack/* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys (GHSA-g7cv-rxg3-hmpx)GitHub Security Advisory, 11. Mai 2026
  3. StepSecurity: Mini Shai-Hulud Is Back – A Self-Spreading Supply Chain Attack Compromises TanStack npm PackagesStepSecurity, Mai 2026 – Einordnung der Kampagne, SLSA/Provenance-Risiko und Detection-Kontext
  4. SafeDep: Mass Supply Chain Attack Hits TanStack, Mistral AI npm and PyPI PackagesSafeDep, 12. Mai 2026 – Umfang der npm- und PyPI-Kampagne, betroffene Ökosysteme und Python-Dropper
  5. Aikido Security: Mini Shai-Hulud Is Back – npm Worm Hits over 160 Packages, including Mistral and TanstackAikido Security, 12. Mai 2026 – Paketlisten, Kampagnenumfang und Verhaltensindikatoren
  6. Wiz: Mini Shai-Hulud Strikes Again – TanStack + more npm Packages CompromisedWiz, 12. Mai 2026 – IOCs, Persistenzhinweise, Python-Variante und Maßnahmen für Security-Teams
  7. The Hacker News: Mini Shai-Hulud Worm Compromises TanStack, Mistral AI, Guardrails AI & More PackagesThe Hacker News, 12. Mai 2026 – Überblick zur breiteren Mini-Shai-Hulud-Kampagne
  8. GitHub Security Lab: Keeping your GitHub Actions and workflows secure Part 1 – Preventing pwn requestsGitHub Security Lab – Hintergrund zu pull_request_target, untrusted Pull Requests und sicheren Workflow-Mustern