Nach der Analyse von Socket wurden die Upstream-Repositories der betroffenen Pakete so verändert, dass sie ein postinstall-Skript enthielten. Dieses Skript versuchte, eine Linux-Binärdatei von der GitHub-Releases-URL “github[.]com/parikhpreyash4/systemd-network-helper-aa5c751f” herunterzuladen, sie unter “/tmp/.sshd” zu speichern, ihr per “chmod” Ausführungsrechte für sämtliche Nutzer zu verleihen und sie anschließend im Hintergrund auszuführen.
Der besondere Kniff lag in der Wahl der Datei: Da der Schadcode in der package.json statt in der composer.json saß, greift er bei Projekten, die JavaScript-Build-Werkzeuge zusammen mit PHP-Code ausliefern. Wer beim Prüfen seiner Abhängigkeiten nur auf Composer-bezogene Metadaten achtet, übersieht die gebündelten Lifecycle-Hooks der package.json leicht.
Socket fand Verweise auf dieselbe Schadlast in 777 Dateien auf GitHub, was auf eine breiter angelegte Kampagne hindeuten könnte. In mindestens zwei Fällen wurde sie in einen GitHub-Workflow eingefügt. Allerdings ist bislang unklar, wie viele dieser Treffer auf eigenständige Kompromittierungen, Forks, doppelte Paket-Artefakte oder zwischengespeicherte Verweise zurückgehen.
“Das deutet darauf hin, dass der Angreifer sich nicht auf einen einzigen Ausführungsmechanismus verlassen hat”, erklärte die auf Anwendungssicherheit spezialisierte Firma. In Paket-Artefakten werde die Schadlast über postinstall-Skripte der package.json ausgelöst, in Workflow-Dateien sei sie so platziert, dass sie während GitHub-Actions-Jobs läuft.
Was genau die von GitHub nachgeladene Binärdatei anrichtet, bleibt offen, da das GitHub-Konto hinter dem Repository nicht mehr verfügbar ist. Auffällig ist nach Einschätzung von Socket die Wahl des Namens “gvfsd-network” für die Malware: Er spielt auf einen Daemon des GNOME Virtual File System (GVfs) an, der für die Verwaltung und das Durchsuchen von Netzwerkfreigaben zuständig ist.
“Selbst ohne die Binärdatei der zweiten Stufe reicht der schädliche Installer aus, um eine Blockierung zu rechtfertigen”, so Socket. Er ermögliche während der Installation oder in Build-Workflows die Ausführung von beliebigem Code aus der Ferne und versuche, seine Aktivität zu verschleiern, indem er die TLS-Prüfung deaktiviere, Fehlermeldungen unterdrücke und eine heruntergeladene Binärdatei im Hintergrund ausführe.
