Unsichtbare npm-Malware umgeht Sicherheitsprüfungen mit manipulierten Versionen

JFrog hat ein unerwartetes Verhalten der npm-Werkzeuge entdeckt: Für Pakete bestimmter Versionsformate zeigen sie wohl keine sicherheitsrelevanten Hinweise an.

In Pocket speichern vorlesen Druckansicht 11 Kommentare lesen
Magnifying,Glass,Enlarging,Malware,In,Computer,Machine,Code

(Bild: Balefire / Shutterstock.com)

Update
Lesezeit: 3 Min.
Von
  • Silke Hahn
Inhaltsverzeichnis

Das Kommandozeilenwerkzeug des Paketmanagers npm verfügt über einen praktischen Sicherheitsgurt: Bereits bei der Installation eines Pakets über die Kommandozeile überprüft npm das Paket samt aller Abhängigkeiten auf bekannte Schwachstellen. Die Installation eines Pakets mit dem Befehl npm install löst diese Prüfung automatisch aus, auch der Befehl npm audit stößt sie an. Die Sicherheitsmaßnahme gilt als wichtiges Element von npm, das Entwicklerinnen und Entwickler vor dem Einsatz von Paketen warnt, die bereits bekannte Sicherheitslücken enthalten.

Nun haben Sicherheitsforscher des IT-Security-Unternehmens JFrog einem Eintrag in ihrem Blog zufolge unerwartetes Verhalten in den npm-Werkzeugen festgestellt. Für Pakete bestimmter Versionsformate scheinen npm install und npm audit keine sicherheitsrelevanten Hinweise anzuzeigen. Wer diese Pakete verwendet, ist also potenziell dem Risiko ausgesetzt, kritische Sicherheitslücken oder Malware in die eigenen Systeme oder als indirekte Abhängigkeit in die verwendeten npm-Pakete einzubringen.

Den Forschern des JFrog Vulnerability Research Tem war bei der Arbeit mit einigen npm-Paketen eine merkwürdige Diskrepanz zwischen den gemeldeten Sicherheitslücken aufgefallen, die das npm-eigene Kommandozeilentool und das JFrog-Tool Xray jeweils mitteilten. Konkret bei der Installation des Pakets cruddl 2.0.0-update.2 erhielt das Team von beiden Tools abweichende Hinweise auf Sicherheitslücken. Die Scanner von npm fanden für dieses Paket keine Lücken, Xray hingegen machte eine bekannte Schwachstelle aus (CVE-2022-36084). Die Diskrepanz trat nur auf, wenn die installierte Paketversion einen Bindestrich im Namen enthielt.

Da der Quellcode der npm-Anwendung proprietär ist, lässt sich nicht ohne Weiteres feststellen, was das Problem verursacht. Grundlegend gilt, dass jedes Advisory über ein Feld verfügt, das logische Ausdrücke wie beispielsweise > 6.6.0 enthält, um Bereiche betroffener Versionen zu beschreiben. Erfüllt eine Version solch einen logischen Ausdruck, gilt sie als verwundbar und die Pakettools können automatisch eine Warnung ausgeben.

Angreifer können sich diesen Umstand zunutze machen, indem sie schädlichen Code in scheinbar reguläre Pakete einbauen. Entwickler, die sich für die Funktionen eines bestimmten Pakets interessieren, können damit in Kontakt geraten, aber auch durch Typosquatting oder Dependency Confusion lässt sich die Malware verbreiten. Wer sich von einem präparierten Paket hat täuschen lassen, läuft Gefahr, angegriffen zu werden, da die Bordmittel des Paketmanagers die Bedrohung nicht erkennen und die Nutzer nicht entsprechend warnen können: Gehört die Versionsnummer zu einer Vorabversion, berichtet das Kommandozeilenwerkzeug nicht über bestehende Advisories.

Eine Empfehlung, um auf der sicheren Seite zu sein, lautet, niemals npm-Pakete mit einer Vorabversion zu installieren – außer, es lässt sich einwandfrei gewährleisten, dass das Paket aus einer seriösen Quelle stammt. Ob die derzeit installierten npm-Pakete mit potenziell riskanten Vorabversionen installiert sind, können Entwicklungsteams selbst prüfen: Linux-User geben npm list -a | grep -E "@[0-9]+\.[0-9]+\.[0-9]+-" ein, und bei Windows-Systemen lässt sich das mit dem Befehl npm list -a | findstr -r @[0-9]*\.[0-9]*\.[0-9]*- feststellen.

Weitere Informationen zu der Entdeckung und zum empfohlenen Vorgehen für Betroffene lässt sich dem Blogeintrag des JFrog-Sicherheitsteams entnehmen. Die Sicherheitsforscher haben dort mit Screenshots dokumentiert, wie sie auf das Problem aufmerksam wurden.

Update

Hinweis für Linux-User: Die Regex zum Auffinden von Vorabversionen benötigt Anführungszeichen um die Regex herum, da sonst keine Matches auffindbar sind. Codezeile mit Anführungszeichen: npm list -a | grep -E "@[0-9]+\.[0-9]+\.[0-9]+-"

(sih)