Nach Angaben von StepSecurity blieb der eigentliche Quellcode der betroffenen Crates unverändert. Stattdessen ergänzten die Angreifer die Abhängigkeit auf proc-macro1. Dieses Paket gab sich als das verbreitete proc-macro2 aus. In proc-macro1 lag laut den Forschern ein Skript namens build.rs, das während der Kompilierung automatisch ausgeführt wurde, seine Infrastruktur aus Base64-codierten Fragmenten zusammensetzte und anschließend eine zum Host passende Nutzlast auswählte: für Linux x86-64, Windows x86-64, macOS x86-64 und macOS ARM64.
Auf Unix-Systemen schrieb die Malware laut Bericht nach /tmp/rust-setup, markierte die Datei als ausführbar und startete sie als losgelösten Prozess. Unter Windows legte sie %TEMP%\rust-setup.ps1 an und nutzte ein verborgenes wscript.exe zusammen mit einem VBS-Starter, um den Prozess am Laufen zu halten. Die Nutzlast erhielt eine Adresse als Argument, die nach Einschätzung der Forscher als Command-and-Control-Adresse diente.
Wiz beschreibt für die zweite Stufe Funktionen zum Abfluss von Host-Informationen und Zugangsdaten. Laut den Forschern greift die Malware Anmeldedaten aus Google Chrome, Brave und Edge ab, indem sie die SQLite-Datenbanken mit gespeicherten Logins abfragt. Für Persistenz sorgen unter Windows ein Registry-Run-Schlüssel, unter macOS ein LaunchAgent und unter Linux systemd.
Der Angriff lief in einem engen Zeitfenster. Laut dem Quelltext wurde zunächst um 01:17 UTC ein GitHub-Konto erstellt, das sich als der bekannte Rust-Entwickler David Tolnay ausgab; danach folgte ein ähnliches Konto im crates.io-Register. Um 01:55 veröffentlichten die Angreifer proc-macro1@1.0.106 zunächst als unauffällige Kopie von proc-macro2. Später folgte mit Version 1.0.107, veröffentlicht um 7:11, das bösartige Update. Um 07:15 erschien arrayref 0.3.10 über das legitime Konto droundy von David Roundy; zugleich wurden die Versionen 0.3.5 bis 0.3.9 entfernt, möglicherweise um die Installation der präparierten Version zu erzwingen.
Der Vorfall wurde um 07:54 gemeldet. Crates.io löschte proc-macro1 um 08:03 und entfernte arrayref 0.3.10 um 08:41 aus dem Index. StepSecurity meldet zudem, dass die Angreifer mehrere Versionen von vier weiteren Crates selbst veröffentlichten: aovine, arone, aronenao und tinymember. Diese Pakete wurden inzwischen von crates.io entfernt.
Die Reichweite der kompromittierten Bibliotheken ist erheblich. Projekte mit arrayref umfassen laut Quelltext unter anderem blake3, Rust-GUI-Frameworks wie egui, eframe und iced sowie Komponenten aus dem Umfeld von Ethereum und Solana. StepSecurity, SafeDep und Aikido haben jeweils technische Analysen des Angriffs und Indikatoren für eine Kompromittierung veröffentlicht.
Wiz weist darauf hin, dass sich die Infrastruktur der Kampagne mit jüngsten nordkoreanischen Supply-Chain-Angriffen überschneidet, darunter Mastra und axios. Entwickler, die eines der betroffenen Pakete innerhalb des knapp anderthalbstündigen Expositionsfensters installiert haben, sollten laut Quelltext von einer Kompromittierung ausgehen. Genannt werden als Prüfmaßnahmen die Suche in Cargo.lock-Dateien, die Kontrolle auf die abgelegten Dateien sowie die Überprüfung von Verbindungen zu 23.254.165[.]112 über die Ports 9089 und 443. Bei bestätigter Kompromittierung wird empfohlen, alle erreichbaren Zugangsdaten, CI-Token, Signaturschlüssel und sonstigen Geheimnisse auszutauschen und die Umgebung aus sicheren Backups neu aufzubauen.
