Six Eight Consulting Logo
Security News

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

Veröffentlicht: | Aktualisiert:
14 Minuten Lesezeit
Supply-Chain-Angriff auf npm-Pakete: CI/CD-Pipeline, GitHub Actions und kompromittierte Pakete als Risiko für Unternehmen

Stand: 20. Mai 2026 - zuletzt aktualisiert

Autor: Mika Schmidt (IT-Security Experte) – Six Eight Consulting, Fokus: Analyse, IAM, Security Engineering.

Update vom 20. Mai 2026

Nach dem TanStack-Vorfall wurde eine neue Mini-Shai-Hulud-Welle bekannt, die vor allem das @antv-Ökosystem sowie weitere npm-Pakete betrifft. Die aktuelle Einordnung, IOCs und Sofortmaßnahmen stehen im neuen Beitrag Mini Shai-Hulud: Neuer npm-Angriff trifft über 320 Pakete.

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. [Postmortem] [Advisory]

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. [Postmortem]

Relevanz für Unternehmen

Wenn eine betroffene Version am 11. Mai 2026 auf einem Entwicklergerät oder in CI/CD installiert wurde, sollte diese Umgebung als potenziell kompromittiert gelten. Das Ziel der Malware waren Zugangsdaten, nicht nur Quellcode.

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. [Postmortem] [Best Practice]

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. [Postmortem]

Die Kurzform der Angriffskette

  1. Fork-PR triggert einen privilegierten pull_request_target-Workflow.
  2. Schadcode landet über den pnpm-Store im GitHub-Actions-Cache des Basis-Repositories.
  3. Ein legitimer Release-Workflow stellt den vergifteten Cache wieder her.
  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. [Advisory]

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. [Analyse]

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. [Postmortem]

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. [Threat Intel] [Threat Intel]

Bereich Bekannter Stand am 12. Mai 2026 Einordnung
TanStack 42 Pakete, 84 Versionen Offiziell bestätigt
npm gesamt über 160 bis über 170 Paketnamen Je nach Quelle und Erhebungszeitpunkt
PyPI mistralai und guardrails-ai Andere 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. [News] [Threat Intel]

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. [Advisory]

  • 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. [Postmortem] [Analyse]

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. [Threat Intel]

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. [Analyse]

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. [Analyse] [Postmortem]

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. [Advisory]

rg -n "router_init\.js|router_runtime\.js|tanstack_runner\.js|setup\.mjs|@tanstack/setup|79ac49eedf774dd4b0cfa308722bc463cfe5885c" .
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

Eine sinnvolle Sofortreaktion besteht aus fünf Schritten:

  1. Exposition prüfen: Lockfiles, CI-Logs, Build-Artefakte, Paket-Caches und Entwicklergeräte nach betroffenen Versionen und IOCs durchsuchen.
  2. Persistenz prüfen: Wiz empfiehlt insbesondere, vor der Token-Rotation nach gh-token-monitor sowie auffälligen .claude/- und .vscode/-Artefakten zu suchen. [Analyse]
  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. Netzwerkindikatoren prüfen: DNS-, Proxy-, Firewall- und EDR-Daten auf git-tanstack[.]com, filev2.getsession.org und seed*.getsession.org untersuchen.
  5. Release-Rechte einfrieren: Bis zur Klärung keine automatischen Publishes aus betroffenen Workflows zulassen und npm-/PyPI- Maintainerrechte temporär minimal halten.

Reihenfolge zählt

Rotieren Sie Tokens nicht blind, wenn der betroffene Host noch Persistenz oder aktive Malware enthält. Erst isolieren und Persistenz entfernen, dann Zugangsdaten erneuern und danach die betroffenen Workflows wieder freigeben.

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. [Best Practice]

rg -n "pull_request_target|id-token:\s*write|actions/cache|trusted.?publish|npm publish|pypi|twine" .github/workflows

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. [Postmortem] [Analyse]

Kategorie Indikatoren
Dateien / Artefakte router_init.js, router_runtime.js, tanstack_runner.js, setup.mjs, @tanstack/setup
Dependency-Hinweis github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c
Netzwerk filev2.getsession.org, seed1.getsession.org, seed2.getsession.org, seed3.getsession.org, git-tanstack[.]com, 83.142.209[.]194
Verhalten Unerwartete 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.

Governance

Verantwortlichkeiten für CI/CD, Secrets, Paketfreigaben und Incident Response klar benennen. Supply-Chain-Risiken gehören ins technische und unternehmerische Risikomanagement.

Least Privilege

Publish-Rechte, OIDC-Scopes, Repository-Tokens und Cloud-Rollen so klein wie möglich schneiden. Jeder Workflow bekommt nur die Rechte, die er für genau diesen Job braucht.

Isolation

Untrusted PRs, externe Dependencies, Build-Caches und Release-Jobs voneinander trennen. Artefakte dürfen Vertrauensgrenzen nicht unsichtbar überspringen.

Monitoring

Paketveröffentlichungen, OIDC-Anfragen, DNS-Ziele und Secret-Zugriffe überwachen. Unerwartete Publishes sind ein Security-Event, kein reines Maintainer-Problem.

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.

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.

Sie möchten diese Schritte auf Ihr Unternehmen übertragen?

In einem kurzen Gespräch klären wir, welche Maßnahmen für Sie konkret sinnvoll sind – ohne Over-Engineering. Weitere Artikel finden Sie im Blog-Archiv.