Laut Rust Security Response Team ging der Hinweis auf die bösartige proc-macro1-Crate um 07:15 UTC ein. Das Team habe anschließend verifiziert, dass die Crate ein Build-Skript enthielt, das eine schädliche Nutzlast nachlädt. In seinem Advisory schreibt das Team, man gehe nicht davon aus, dass der Autor von arrayref absichtlich bösartig gehandelt habe. Wahrscheinlicher sei, dass dessen Rechner oder Zugangsdaten kompromittiert wurden. Wie es zur Übernahme des Kontos kam, wurde nicht offengelegt.

Das Rust Project nennt als betroffene Versionen arrayref 0.3.10, internment 0.8.7 und append-only-vec 0.1.9. Jede dieser kompromittierten Veröffentlichungen enthielt im Manifest genau eine zusätzliche Zeile: die Abhängigkeit von proc-macro1, einem Typosquat der weit verbreiteten Crate proc-macro2. Der Bibliotheksquelltext von proc-macro1 war eine echte Kopie von proc-macro2, sodass Builds regulär durchliefen und der Eingriff nicht sofort auffiel.

Die eigentliche Schadfunktion steckte im Build-Skript. Laut Quelltext setzt es die Adresse des Nutzlasthosts und des Command-and-Control-Servers aus Base64-Fragmenten zur Build-Zeit zusammen. Anschließend installiert es einen eigenen Zertifikatsprüfer, dessen drei Prüfmethoden bedingungslos Erfolg melden und damit die TLS-Validierung abschalten. Danach wählt es je nach Betriebssystem und CPU-Architektur eine von vier Nutzlasten aus.

Unter Unix und macOS schreibt das Skript die Daten nach /tmp/rust-setup, markiert die Datei als ausführbar und startet sie losgelöst mit der C2-Adresse als erstem Argument. Unter Windows legt es ein PowerShell-Skript in %TEMP% ab und startet es versteckt über einen VBScript-Starter unter wscript.exe. Danach löst es die Kindprozesse vom Build-Prozess, damit Cargo nicht auf deren Ende wartet.

Für die Verbreitung spielte laut dem in die RustSec-Advisory-Datenbank eingereichten Bericht eine weitere Manipulation eine zentrale Rolle: Über das Besitzerkonto wurden arrayref 0.3.5 bis 0.3.9 in derselben Minute zurückgezogen, in der die bösartige Version veröffentlicht wurde. Dadurch blieb die kompromittierte Version die einzige, vor der Cargo nicht mit einem Hinweis auf eine zurückgezogene Veröffentlichung warnte. Der meldende Forscher, GitHub-Nutzer jhobern, schrieb dazu: „Die Auslieferung lief so: 0.3.5 bis 0.3.9 wurden alle über das Besitzerkonto zurückgezogen, sodass Cargos Warnung, auf eine nicht zurückgezogene Version zu aktualisieren, zum Köder wurde. So bin ich darauf gestoßen.“ Während der Reaktion stellte das Rust Security Response Team die böswillig zurückgezogenen Versionen wieder her und rät Entwicklern, im Verzeichnis ~/.cargo/registry/cache nach den gelöschten Crate-Dateien zu suchen sowie arrayref auf 0.3.9 oder älter festzunageln.

Die Reichweite von arrayref ist erheblich. The Hacker News ermittelte über die crates.io-API insgesamt 245.385.500 Downloads und 53.905.601 Downloads in den 90 Tagen bis zum 20. August; zudem hängen 403 verschiedene Crates auf crates.io davon ab. Die Publikation prüfte außerdem die im Bericht genannte Abhängigkeitskette über den crates.io-Index nach: winit verlangt sctk-adwaita ^0.10.1, dieses verlangt tiny-skia ^0.11, und tiny-skia verlangt arrayref ^0.3.6. Da alle Anforderungen Caret-Bereiche auf 0.3.x seien, werde auch 0.3.10 akzeptiert.

Wiz beschrieb zusätzlich einen zweiten Schadcode-Baustein: Er melde sich per HTTPS-POST an den Pfad /49890878, verankere sich unter Windows per Registry-Run-Schlüssel, unter macOS per LaunchAgent und unter Linux per systemd-Benutzerdienst. Außerdem unterstütze er vier Befehle für Beenden, Neukonfiguration des C2, Einrichtung von Persistenz sowie das Nachladen und Ausführen weiterer Skripte. Wiz zufolge stiehlt er Browser-Zugangsdaten aus Chrome, Brave und Edge, indem er SQLite-Anmeldedatenbanken abfragt. Die Analyse des Nextron-Forschers hält dagegen fest, dass die untersuchte Windows-Stufe nur die Spalten origin_url und username_value abfragt und password_value nicht direkt extrahiert; untersucht wurde dabei nur die Windows-Nutzlast, während die Linux- und macOS-Payloads lediglich gehasht, aber nicht analysiert wurden.

Eine Täterzuordnung gibt es bisher nicht. Wiz erklärte jedoch, die Infrastruktur überschneide sich deutlich mit jüngsten nordkoreanischen Supply-Chain-Angriffen, darunter die Kompromittierungen von Mastra auf npm und axios. Microsoft ordnet die Mastra-Aktivitäten mit hoher Sicherheit Sapphire Sleet zu, während Google Threat Intelligence Group die axios-Kompromittierung einem Akteur zuschreibt, den sie inzwischen als MIDNIGHT NEPTUNE führt, früher UNC1069. Für den Vorfall auf crates.io hat bislang aber kein Hersteller einen benannten Akteur verantwortlich gemacht.

Eine direkte Schutzfunktion gegen frisch veröffentlichte Abhängigkeiten gibt es in Cargo nach Angaben des Berichts bislang nicht. Ein Pull Request für eine globale Einstellung eines Mindestalters neuer Veröffentlichungen ging zwei Tage vor dem Angriff in seine letzte Kommentierungsphase und war bis zum 21. August weiter offen und nicht zusammengeführt.