Supply-Chain-Angriff schleust Build-Zeit-Malware in Rust-Crates mit 245 Millionen Downloads

Ein kompromittierter Maintainer-Account infiziert drei weitverbreitete Rust-Bibliotheken mit Build-Zeit-Malware über Typosquatting.

Drei Rust-Crates mit 245 Millionen Downloads wurden via Supply-Chain-Angriff mit Build-Zeit-Malware verseucht.
Highlights
  • Die Malware wird während der Kompilierung ausgeführt, ohne dass Code aus den infizierten Bibliotheken aufgerufen wird.
  • Der Angriff nutzt Typosquatting der Crate proc-macro2 und injiziert eine Abhängigkeit namens proc-macro1.
  • Die schädlichen Versionen waren nur 86 bis 107 Minuten online, konnten aber potenziell Tausende Builds beeinflussen.

Ein dramatischer Supply-Chain-Angriff auf die Rust-Ökosystem-Plattform crates.io hat gezeigt, wie schnell ein einziger kompromittierter Maintainer-Account weitverbreitete Bibliotheken infizieren kann. Drei Rust-Crates mit insgesamt 245 Millionen Downloads wurden mit Build-Zeit-Malware versehen, die während der Kompilierung eines Projekts einen schädlichen Payload ausführt – ohne dass eine einzige Zeile aus den betroffenen Bibliotheken aufgerufen werden muss. Die betroffenen Versionen – arrayref 0.3.10, internment 0.8.7 und append-only-vec 0.1.9 – wurden am 20. August 2026 von einem einzigen Owner-Account veröffentlicht und innerhalb von 86 bis 107 Minuten von der Rust Security Response Team gelöscht. Der Angriff nutzt ein Typosquatting der allgegenwärtigen Crate proc-macro2 und injiziert eine Abhängigkeit namens proc-macro1, deren Build-Skript den eigentlichen Schadcode enthält.

Angriffsmechanismus im Detail: Wie die Build-Zeit-Malware funktioniert

Der entscheidende Angriffspunkt liegt im Build-Skript der Typosquatting-Crate proc-macro1. Während des Build-Prozesses reassembliert das Skript die Adresse des Payload-Hosts und des Command-and-Control-Servers (C2) aus Base64-Fragmenten. Es installiert einen eigenen Zertifikatsprüfer, der bei drei Verifikationsmethoden ausnahmslos Erfolg zurückmeldet – damit wird die TLS-Validierung deaktiviert. Anschließend wählt das Skript je nach Betriebssystem und CPU-Architektur einen von vier Payloads aus.

Auf Unix- und macOS-Systemen schreibt der Schadcode die Bytes in die Datei /tmp/rust-setupcodecodecodecode, setzt die Ausführungsberechtigung und startet den Prozess mit der C2-Adresse als erstem Argument. Unter Windows schreibt der Code ein PowerShell-Skript nach %TEMP%codecodecodecode und startet es versteckt über einen VBScript-Launcher unter wscript.execodecodecodecode. Der Quellcode enthält einen Kommentar, der erklärt, dass der Kindprozess vom Cargo-Job-Object getrennt wird, damit der Build nicht auf ihn warten muss.

Typosquatting als Einfallstor

Jede kompromittierte Version der drei betroffenen Crates enthielt im Manifest lediglich eine zusätzliche Zeile: die Abhängigkeit zu proc-macro1. Der eigentliche Bibliothekscode von proc-macro1 ist eine identische Kopie von proc-macro2, sodass Builds normal durchlaufen. Der Angreifer nutzte die Tatsache, dass Entwickler oft Tippfehler in Abhängigkeitsnamen übersehen – ein klassisches Typosquatting. Die Verteilung erfolgte über eine hinterhältige Taktik: Der Owner-Account yankte (zog zurück) die Versionen 0.3.5 bis 0.3.9 von arrayref im selben Moment wie die Veröffentlichung der schädlichen Version. Dadurch war die kompromittierte 0.3.10 die einzige Version, gegen die Cargo nicht warnte – die typische Cargo-Meldung „consider updating to a version that is not yanked“ wurde zur Falle.

Indikatoren einer Kompromittierung (IoCs)

Mehrere Sicherheitsforscher haben die Angriffsstruktur analysiert und konkrete Indikatoren veröffentlicht. Die Netzwerk-Kommunikation erfolgt über die IP-Adressen 23.254.165.112:9089 (Payload-Host) und 23.254.165.112:443 (C2). Der Domainname hwsrv-798836.hostwindsdns.comcodecodecodecode wird ebenfalls genannt. Auf dem infizierten System finden sich Dateien wie /tmp/rust-setupcodecodecodecode (Unix/macOS) sowie %TEMP%\rust-setup.ps1codecodecodecode und %TEMP%\rust-setup-launch.vbscodecodecodecode (Windows). Die Binärdateien tragen die Namen rust-crate_0.1.0codecodecodecode, _0.2.0codecodecodecode, _0.3.0codecodecodecode und _0.4.0codecodecodecode. Auf crates.io wurde ein Impersonator-Account namens dtolney (ID 438608) identifiziert, der den legitimen Owner droundy (David Roundy, registriert seit Oktober 2009) nachahmte. Die gefälschte Autoren-Metadaten enthielten die E-Mail-Adresse [email protected]codecodecodecode.

Was das maliziöse Build-Skript bewirkt

Der Stage-2-Implantat beacons über HTTPS-POST an den Pfad /49890878codecodecodecode und etabliert Persistenz auf unterschiedliche Weise: unter Windows über einen Registry-Run-Key, unter macOS über einen LaunchAgent und unter Linux über einen systemd-User-Service. Der Implantat unterstützt vier Befehle: Terminierung, C2-Neukonfiguration, Persistenz-Installation sowie das Herunterladen und Ausführen weiterer Skripte. Die Analyse des Sicherheitsunternehmens Wiz ergab, dass der Schadcode Browser-Anmeldedaten aus Chrome, Brave und Edge stiehlt, indem er SQLite-Login-Datenbanken abfragt. Die Nextron-Analyse, die sich auf den Windows-Payload konzentrierte, stellte fest, dass der Code nur die Spalten origin_urlcodecodecodecode und username_valuecodecodecodecode abfragt, nicht jedoch direkt password_valuecodecodecodecode – die Linux- und macOS-Payloads wurden nicht analysiert. Wichtig: Die Crate kann bereits durch cargo buildcodecodecodecode, cargo checkcodecodecodecode und cargo testcodecodecodecode ausgelöst werden.

Verbindung zu nordkoreanischen Kampagnen

Wiz berichtet von einer substanziellen Überschneidung der Infrastruktur mit jüngsten nordkoreanischen Supply-Chain-Angriffen, darunter der Mastra-npm-Kompromittierung und dem Axios-Vorfall. Microsoft bewertet die Mastra-Aktivitäten mit hoher Wahrscheinlichkeit als Werk der Gruppe Sapphire Sleet. Google Threat Intelligence Group (GTIG) führt den Axios-Angriff auf einen Akteur zurück, den sie als MIDNIGHT NEPTUNE (ehemals UNC1069) bezeichnet. Bisher hat jedoch kein Anbieter den crates.io-Vorfall einem namentlich bekannten Akteur zugeordnet.

Lehren für die Sicherheitsgemeinschaft

Der Vorfall unterstreicht die Verwundbarkeit von Open-Source-Ökosystemen gegenüber Account-Kompromittierungen. Besonders beunruhigend ist, dass die schädliche Version nur 86 Minuten online war und dennoch potenziell Tausende von Builds beeinflussen konnte. Die Rust Security Response Team hat die betroffenen Versionen gelöscht, aber es gibt keinen Patched-Version und keine CVE-ID. Die RustSec-Advisory-Datenbank hält fest, dass es keine Hinweise auf eine tatsächliche Nutzung der schädlichen Versionen gibt – eine Aussage, die auf den Download-Zahlen basiert.

Eine zentrale Gegenmaßnahme wäre ein globales Mindestalter für neu veröffentlichte Abhängigkeiten („Cooling Window“). Ein Pull-Request für Cargo, das eine global-min-publish-agecodecodecodecode-Einstellung einführen würde, befindet sich seit dem 18. August in der finalen Kommentierungsphase – zwei Tage vor dem Angriff. GitHub hat im Juli 2026 eine ähnliche 3-Tage-Abkühlungsfrist für Dependabot eingeführt. Die Forderung nach solchen Sicherheitsmaßnahmen wird durch diesen Vorfall nur noch dringlicher.

Diesen Artikel teilen