LAGEBRIEFING · 13.08.2026 DEENFRES

Praxis & Umsetzung

CI/CD publizierte den AsyncAPI-Botnet-Loader

Von Alec Chizhik · 17. Juli 2026 · 6 Minuten Lesezeit

Vier AsyncAPI-npm-Pakete liefen am 14. Juli 2026 mit gültiger OIDC-Provenance und lieferten trotzdem einen Multi-Stage-Botnet-Loader. Der Einstieg lag in der CI: ein fehlkonfigurierter pull_request_target-Workflow, danach Push auf den Release-Branch über bot-gebundene Credentials. npm Trusted Publishing blieb technisch sauber und deckte den vorgelagerten Vertrauensbruch nicht ab.

Das Wichtigste in Kürze

  • Der Einstieg lag in der CI-Misconfig, lange vor dem Registry-Token. pull_request_target mit Checkout des untrusted Head, breitem GITHUB_TOKEN und nachgelagertem Bot-Push: Secret-Exfiltration und Branch-Compromise gehören zusammen.
  • Payload beim require(), aktive Runtime war schmaler als das Bundle. ShellExec, Persistenz und C2 liefen. Harvesting, Propagation und Evasion lagen im Paket, waren in dieser Auslieferung per Toggle aus.
  • Lockfiles aus dem Fenster 07:10-11:18 UTC bleiben riskant. npm unpublishte die Versionen; bestehende Pins und CI-Caches nicht.

Verwandt:Ein npm-Paket, das die privaten Schlüssel stahl  /  Mini Shai-Hulud: npm-Supply-Chain-Wurm und Abwehr

Was genau passiert ist

Am 14. Juli 2026 um 06:58 UTC landete auf dem Branch next im Repo asyncapi/generator ein Commit unter der Platzhalter-Identität „Your Name“ / you@example.com. Zwölf Minuten später publizierte der legitime Workflow release-with-changesets.yml drei Pakete mit gültiger npm-OIDC-Provenance: @asyncapi/generator@3.3.1, @asyncapi/generator-helpers@1.1.1 und @asyncapi/generator-components@0.7.1.

Laut Microsoft Security Blog lag der Initial Access zuvor über PR #2155 gegen den Workflow manual-netlify-preview.yml. Der Workflow nutzte pull_request_target und checkte den untrusted Head-Commit aus. Der GITHUB_TOKEN war breit privilegiert; Checkout-Credentials blieben bis zum Post-Job-Cleanup in der lokalen Git-Config. Anschließend wurde mit dem asyncapi-bot-Account gepusht. Microsoft formuliert vorsichtig, ob exakt dieses Credential gestohlen wurde. Der pwn-request-Einstieg und die anschließende Bot-Push-Kette sind jedoch belegt und erklären den Weg in den Release-Branch.

Etwa 07:51-08:30 UTC traf derselbe Angreifer asyncapi/spec-json-schemas (Branch master). Über Commits mit fix:-Prefix feuerte if-nodejs-release.yml und lieferte @asyncapi/specs@6.11.2-alpha.1 sowie @asyncapi/specs@6.11.2. StepSecurity, Socket, SafeDep und OX Security dokumentierten denselben Dropper-Stamm und dieselbe Second-Stage-Infrastruktur (laut StepSecurity: Miasma-v3-Familie).

Wichtig für die Einordnung: Es gab keinen gestohlenen npm-Publish-Token. Der Publish-Pfad lief über OIDC Trusted Publishing. Der Vertrauensbruch sitzt davor, in der CI und im Push-Recht auf den Branch, der den Release-Workflow triggert.

~4 h

Exposure-Fenster bis Unpublish der Generator-Pakete

Quelle: StepSecurity-Timeline, 14.07.2026 UTC

Warum „gültige Provenance“ hier trügt

npm Trusted Publishing mit OIDC und SLSA-Attestationen beantworten eine enge Frage: Wurde dieses Artefakt vom autorisierten GitHub-Workflow dieses Repos erzeugt? Die Attestation für die Generator-Pakete zeigte exakt repo:asyncapi/generator:ref:refs/heads/next, Workflow-Datei, Commit-SHA und Run-URL.

Was sie nicht beantworten: War der Commit, der den Workflow anstieß, legitim und inhaltlich sauber? Provenance schützt nicht vor kompromittierten Push-Credentials und nicht vor CI-Jobs, die untrusted Code mit privilegierten Tokens ausführen. Wer pull_request_target mit Checkout des PR-Heads kombiniert, Secrets in solchen Jobs belässt und Branch-Protection auf Release-Branches schwach hält, öffnet genau diese Kette.

Für CISOs und AppSec ist das der zentrale Hebel: Registry-Signaturen und Provenance-Flags allein bewerten den AsyncAPI-Fall als „grün“, obwohl die CI den Dropper bereits ausgeliefert hat. Kontrollen müssen den Source-of-Truth und die Workflow-Permissions mitprüfen.

Payload-Mechanik ohne Install-Hook

In keinem der betroffenen package.json saß ein preinstall/postinstall-Script. Der Dropper startete, sobald der vergiftete Modulcode per require() geladen wurde, also im normalen Generator-Lauf oder in CI-Jobs, die AsyncAPI-Templates bauen.

Stufe 1 spawnt einen detachten Node-Prozess. Stufe 2 holt von einem IPFS-Gateway eine sync.js, abgelegt unter OS-spezifischen Pfaden, die wie eine harmlose NodeJS-Runtime wirken (unter Linux etwa ~/.local/share/NodeJS/sync.js). Stufe 3 entschlüsselt ein gebündeltes Miasma-v3-Implantat. In der ausgelieferten Konfiguration liefen Remote-Shell (ShellExec), Persistenz und C2-Beaconing über mehrere Kanäle (HTTP, Nostr, IPFS, BitTorrent-DHT, Ethereum-Dead-Drop).

Statische Analysen von Aikido und Socket zeigen zusätzlich Module im Bundle, die in dieser Auslieferung per Toggle deaktiviert waren: recon: false (Credential-Harvesting startet nicht), metamorphic: false (Mutation, Evasion und AI-Tool-Poisoning aus) sowie propagate für npm/pypi/ruby/cargo durchgängig false (keine laterale Package-Propagation). Das Kaufhaus lag im Artefakt. Die Laufzeit dieser Welle war eine Remote-Shell mit Persistenz und C2. Host-Forensik bleibt Pflicht, weil Shell-Zugriff und Persistenz aktiv waren.

Paket Böse Version Sichere Version
@asyncapi/generator 3.3.1 3.3.0
@asyncapi/generator-helpers 1.1.1 1.1.0
@asyncapi/generator-components 0.7.1 0.7.0 / 1.0.0
@asyncapi/specs 6.11.2 / 6.11.2-alpha.1 6.11.1

Quelle: StepSecurity Affected-Packages-Tabelle, Stand 14.07.2026

Was Security-Teams jetzt prüfen

Zuerst den Fakten-Check im eigenen Bestand: Lockfiles und CI-Caches aus dem UTC-Fenster des 14. Juli. Wer @asyncapi/specs nur transitiv über den Parser zieht, sieht die Version oft nicht im direkten Dependency-Tree. Overrides und SBOM-Scans sind hier Pflicht.

Zweitens Host-Forensik: Drop-Pfade unter dem irreführenden „NodeJS“-Namen, detachte Node-Prozesse, ausgehende Verbindungen zu IPFS-Gateways und ungewöhnlichen HTTP-C2-Zielen. Drittens Credential-Rotation auf betroffenen Runnern und Laptops. ShellExec kann Umgebungs-Secrets und lokale Tokens erreichen, auch wenn das gebündelte Harvesting-Modul in dieser Config aus war. Priorität: GitHub PATs, npm-Tokens und Cloud-Keys aus Build-Umgebungen.

Sofortmaßnahmen

  • Lockfiles regenerieren, böse Pins auf sichere Versionen setzen
  • Drop-Pfade und detachte Node-Prozesse auf Dev- und CI-Hosts prüfen
  • Secrets auf betroffenen Maschinen rotieren
  • pull_request_target: kein Checkout untrusted Heads mit Secrets; Tokens least-privilege
  • Release-Branches: Review-Pflicht, Signed Commits, Direct-Push gesperrt
  • CI-Egress: nur erwartete Registry-Ziele, IPFS/DHT default blocken

Strukturell lohnen ein Cooldown für frisch publizierte npm-Versionen und Runtime-Egress-Kontrollen in GitHub Actions. Provenance bleibt sinnvoll als eine Lage-Ebene neben CI-Hardening, Branch-Protection, Dependency-Cooldown und Verhaltens-Telemetrie im Build.

Einordnung für DACH-Betriebe

AsyncAPI steckt in API-Generatoren, Doku-Pipelines und DevOps-Toolchains. Wer Event-driven Architecture und OpenAPI/AsyncAPI-Automatisierung fährt, hat die Pakete oft indirekt. NIS2 und der Cyber Resilience Act schärfen die Erwartung an Supply-Chain-Risikomanagement. Die Aussage „wir prüfen Provenance“ trägt als alleinige Kontrollaussage nicht, wenn Workflow-Permissions und Branch-Governance offen bleiben.

Der Fall unterstreicht Governance am Source-of-Truth: dem Git-Branch und den CI-Workflows, die die Pipeline füttern. Registry-Attestationen ergänzen diese Schicht. Sie ersetzen sie nicht als alleinigen Vertrauensbeweis.

Häufige Fragen

Jede Frage ist verschlossen. Ein Tippen entriegelt die Antwort.

Reichte die npm-Provenance nicht als Vertrauensbeweis?

Sie beweist den autorisierten Workflow und den Build-Kontext. Die Legitimität des auslösenden Commits und die Integrität vorgelagerter CI-Credentials deckt sie nicht ab. Bei Branch-Compromise kann die Attestation technisch korrekt und für die Risikofrage irreführend sein.

Hätte ein Blocker für Install-Scripts geschützt?

Nein. Der Dropper hing am Modul-Load (require). npm-Lifecycle-Scripts blieben außen vor. Schutz braucht Verhaltens- und Egress-Kontrollen im Build.

Sind frische Installs heute noch gefährlich?

Die bösen Versionen wurden aus der Registry entfernt. Riskant bleiben Lockfiles und Caches aus dem Exposure-Fenster sowie Hosts, die den Payload schon ausgeführt haben.

Welche Credentials zuerst rotieren?

Auf betroffenen Dev-/CI-Systemen: GitHub- und npm-Tokens, SSH-Keys und Cloud-Credentials, die in der Umgebung oder in Runner-Secrets lagen. Begründung ist Shell-Zugriff plus Persistenz. Das Harvesting-Modul war in dieser Auslieferung aus in dieser Config.

Was ist die prioritäre Governance-Maßnahme?

pull_request_target und verwandte privileged Workflows auditieren (kein untrusted Checkout mit Secrets, least-privilege Tokens), Release-Branches absichern (Reviews, Signed Commits, Direct-Push sperren) und CI-Egress begrenzen. Provenance ergänzt das als Nachweis des Build-Pfads.

Lesetipps der Redaktion

LesetippCursor startet git.exe aus dem Repo-RootLesetippLegacyHive-PoC trifft frische Windows-PatchesLesetippZwei Joomla-Uploads landen im CISA-KEV

Mehr aus dem MBF Media Netzwerk

cloudmagazinWenn KI-Agenten reisen: Data-Residency als Operating-ProblemMyBusinessFutureMehr Insolvenzen, kleinere Fälle: Was zähltDigital ChiefsToken-OPEX: Inference steuert, nicht das Seat-Budget

Bildquelle: KI-generiert (Juli 2026)

Weiterführende Lektüre

Praxis & Umsetzung · 4. August 2026

ChainDrop: npm-Wurm trifft keyv und cacheable

ChainDrop kompromittierte ab dem 4. August 2026 hunderte npm-Pakete um keyv und cacheable. So prüfen CISO und SOC Lockfiles, Secrets und Hosts.

Ein Magazin der Evernine Media GmbH