Warnung: Das Modul peacenotwar sabotiert npm-Entwickler im Paket node-ipc aus Protest gegen den Einmarsch in die Ukraine
16. März 2022
0 Min. LesezeitAm 15. März 2022 waren Nutzer des beliebten JavaScript-Frontend-Frameworks Vue.js von einem Vorfall betroffen, der nur als Supply-Chain-Angriff auf das npm-Ökosystem bezeichnet werden kann. Ursache war die Sabotage der verschachtelten Abhängigkeiten node-ipc und peacenotwar durch den Maintainer des Pakets node-ipc als Protestaktion.
Bei diesem Sicherheitsvorfall wurden Dateien auf Datenträgern durch einen Maintainer beschädigt. Außerdem versuchte dieser, die vorsätzliche Sabotage zu verbergen und in verschiedenen Formen erneut umzusetzen. Auch wenn der Angriff politisch motiviert war, macht er auf ein größeres Problem in der Software-Supply-Chain aufmerksam: Die transitiven Abhängigkeiten in Ihrem Code können Ihre Sicherheit erheblich beeinträchtigen.
Snyk verfolgt die in diesem Artikel dargestellten Sicherheitsvorfälle anhand der folgenden CVEs: CVE-2022-23812 für node-ipc und SNYK-JS-PEACENOTWAR-2426724 für die npm-Module peacenotwar und oneday-test. Wenn Sie Snyk bereits für Open-Source-Sicherheit und Supply-Chain-Sicherheit einsetzen, erhalten Sie Benachrichtigungen, Warnmeldungen und automatisch erstellte Pull Requests, damit Sie geschützt und über die Lage informiert bleiben. Lesen Sie weiter, wenn Sie mehr über die Einzelheiten dieses Supply-Chain-Angriffs erfahren möchten.
Vorgeschichte des Missbrauchs des npm-Pakets node-ipc
Die Geschichte begann am 8. März 2022 um 18 Uhr GMT+2. Zu diesem Zeitpunkt schrieb der npm-Maintainer RIAEvangelist (Brandon Nozaki Miller) Quellcode und veröffentlichte ein npm-Paket namens peacenotwar, das laut der Beschreibung des Moduls:
Bis gestern (15. März) hatte dieses Modul praktisch keine Downloads. Das änderte sich jedoch, als der npm-Maintainer das Modul als Abhängigkeit zu einem seiner anderen beliebten Module node-ipc hinzufügte. Dieses ist selbst eine beliebte Abhängigkeit, auf die sich viele JavaScript-Entwickler im Ökosystem verlassen.

Eines dieser Projekte im JavaScript-Ökosystem ist das Befehlszeilentool von Vue.js, die Vue.js CLI, auch bekannt als npm-Paket @vue/cli. Der folgende Baum verschachtelter Abhängigkeiten zeigt genau, wie node-ipc in das npm-Paket der Vue.js CLI gelangt. Er verdeutlicht auch, warum verschachtelte Abhängigkeiten als ganzheitliches Risiko überprüft werden müssen:
Die derzeit neueste „stabile“ Version des npm-Pakets node-ipc (Version 9.2.2) bündelt peacenotwar und interessanterweise auch das berüchtigte npm-Paket colors mit dem Platzhalter * als Abhängigkeitsbereich. Falls Sie die Geschichte um die npm-Pakete colors und faker, die von ihrem Maintainer Marak vorsätzlich missbraucht und beschädigt wurden, noch nicht kennen, empfehle ich Ihnen dringend, sich auch damit als weitere Perspektive auf die Sicherheit der Open-Source-Supply-Chain zu befassen.
Zeitleiste der Ereignisse
Frühere Versionen von node-ipc, etwa 10.1.0 (vor sechs Monaten veröffentlicht) und alle Versionen bis einschließlich 10.0.0 (vor neun Monaten veröffentlicht), enthielten sinnvolle Aktualisierungen und Verbesserungen. Doch …
7. März
Letzte Woche wurde Version 10.1.1 mit eindeutigen Codeänderungen veröffentlicht, die Bedenken hinsichtlich verdächtiger Aktivitäten und eines möglichen Missbrauchs des Quellcodes und des Paketverhaltens aufkommen ließen. Sehen wir uns die Unterschiede zwischen Version 10.1.0 und 10.1.1 an:
Das CommonJS-kompatible Node.js-Modul node-ipc.cjs ist mit über 1.000 Codezeilen recht umfangreich. Ausgehende HTTPS-Aufrufe an externe Ziele und Base64-kodierte Daten reichen als Grund aus, um vor möglichem Fehlverhalten zu warnen. Sie dienen außerdem als Grundlage für IoCs (Indikatoren für eine Kompromittierung).
Dieser zu node-ipc@10.1.1 hinzugefügte Code richtet einen Timer ein. In zufälligen, vorab festgelegten Intervallen wird eine Funktion ausgeführt, sobald zugehöriger node-ipc-Code aufgerufen wird. Offenbar führt sie Dateisystemoperationen aus.
Sehen wir uns die Base64-kodierten Werte der Argumente genauer an, die an die Funktion für Dateisystemoperationen übergeben werden. Aus dem obigen Diff:
Alle diese Werte werden anschließend an die Timer-Funktion übergeben, zum Beispiel:
Die Werte der oben gezeigten Base64-kodierten Zeichenfolgen lauten:
n2wird auf./gesetzto2wird auf../gesetztrwird auf../../gesetztfwird auf/gesetzt
Werden diese Werte an die Timer-Funktion übergeben, dienen sie in der folgenden Codezeile als Quelldateien. Deren Inhalte werden gelöscht und durch ein Herz-Emoji ersetzt (im Diff dargestellt durch die Zeile + const c = Buffer.from("4p2k77iP", "base64");)
An diesem Punkt kommt es auf jedem System, auf dem dieses npm-Paket aufgerufen wird, zu einem eindeutig erkennbaren Missbrauch und einem schwerwiegenden Supply-Chain-Sicherheitsvorfall, sofern das System geografisch in Russland oder Belarus liegt.

Der aktualisierte Inhalt der Datei README für node-ipc@10.1.1erwähnt dieses neu hinzugefügte Verhalten nicht. Stattdessen enthält er einen Aufruf, RIAEvangelist zu unterstützen, sowie ein Beispiel für die Verwendung der ES6- und CommonJS-Version von node-ipc ab Version 10.
Etwa zehn Stunden später wurde Version node-ipc@10.1.2 veröffentlicht. Abgesehen von einer Versionsänderung gab es nahezu keine Änderungen. Möglicherweise sollte dies automatische Aktualisierungen von Abhängigkeiten auslösen. Hier ist das vollständige Git-Diff zwischen den beiden Versionen:
8. März
Etwa fünf Stunden später, am 8. März, wurde eine neue Version veröffentlicht: node-ipc@10.1.3. Sie scheint alle Hinweise auf die zuvor erwähnte schädliche Nutzlast entfernt zu haben. Ein Vergleich des Git-Diffs zwischen den beiden Versionen bestätigt:
Wir vermuten, dass die Änderungen aus dem 10.x-Versionszweig entfernt wurden, nachdem es zu einer Diskussion rund um das GitHub-Issue kam, in dem dieses Verhalten gemeldet wurde. Darin behauptet der Maintainer, die Nutzlast als Teil einer neuen Hauptversion der Bibliothek veröffentlicht zu haben:

Zusammenfassend lässt sich sagen: Die anfälligen Versionen von node-ipc, nämlich node-ipc@10.1.1 und node-ipc@10.1.2, waren weniger als 24 Stunden lang in der npmjs-Registry verfügbar. Aufgrund der hohen Zahl an Downloads durch Entwickler und Build-Systeme waren dennoch einige davon betroffen, wie öffentliche Repositories zeigen, in denen der Vorfall gemeldet wurde:

Die anfälligen Versionen 10.1.1 und 10.1.2 sind inzwischen nicht mehr in der npmjs-Registry verfügbar und wurden entweder vom Maintainer oder vom npmjs-Team als deprecated gekennzeichnet. Das wird durch den folgenden Hinweis auf der npmjs-Website bestätigt:

Am 8. März um 19:25 Uhr GMT+2, weniger als vier Stunden nachdem node-ipc@10.1.3 zur Rücknahme der schädlichen Nutzlast veröffentlicht worden war, erschien eine neue Hauptversion in der npmjs-Registry: node-ipc@11.0.0. Was wurde geändert?
Die neue Hauptversion node-ipc@11.0.0 enthält nun Folgendes:
Eine Abhängigkeit vom Modul
peacenotwarBei jedem Aufruf der Funktionen des Moduls
node-ipcwird eine Nachricht aus dem Modulpeacenotwarauf STDOUT ausgegeben. Außerdem wird im Desktop-Verzeichnis des Nutzers eine Datei abgelegt, deren Inhalt sich auf die aktuelle Kriegssituation zwischen Russland und der Ukraine bezieht.In der README für Version 11.0.0 wird die explizite Verwendung von
peacenotwarals Teil dieses Moduls mit folgendem Hinweis angegeben:***as of v11*** this module uses the [peacenotwar](https://github.com/RIAEvangelist/peacenotwar) module.
Was führte dazu, dass das npm-Paket peacenotwar in die offiziellen node-ipc-Versionen aufgenommen wurde und Millionen Entwickler betraf?
15. März
Gestern, am 15. März, wurden um 18:49 Uhr GMT+2 und 19:40 Uhr GMT+2 zwei neue, folgenreiche npm-Versionen von node-ipc veröffentlicht. Besonders bedeutsam ist die neue Patch-Version node-ipc@9.2.2, da sie zum neuesten stabilen Versionszweig von node-ipc gehört und viele Projekte im Ökosystem auf sie angewiesen sind – darunter auch die bereits erwähnte Vue.js CLI @vue/cli.
Folgende Änderungen wurden zu node-ipc@9.2.2 hinzugefügt:
Dem Paketinhalt wurde beispielhafter Quellcode hinzugefügt.
peacenotwarwird als Abhängigkeit hinzugefügt und ausgeführt, wenn eine Abhängigkeit, dienode-ipcimportiert, das Modul aufruft.Außerdem wird ausdrücklich eine Abhängigkeit von
colors@*hinzugefügt, wodurch vorsätzlich anfälliger Quellcode eines anderen Maintainers eingebunden wird.In dieser neuen Nebenversion wird die MIT-Lizenz durch die DBAD-Lizenz ersetzt. Anmerkung der Redaktion: Die DBAD-Lizenz enthält derbe Sprache.
Etwa zur gleichen Zeit wurde eine neue Nebenversion veröffentlicht: node-ipc@11.1.0. Sie aktualisiert die Abhängigkeit peacenotwar auf eine neue Version, entfernt jedoch die protokollierten console.log()-Nachrichten auf STDOUT. Das lässt sich anhand des folgenden Git-Diff-Protokolls zwischen den beiden npm-Paketen von node-ipc bestätigen:
Supply-Chain-Sicherheit und das Ansehen von Maintainerinnen und Maintainer
Auch wenn manche die vorsätzliche und gefährliche Handlung des Maintainers RIAEvangelist als legitime Protestaktion betrachten, stellt sich die Frage: Wie wirkt sich das auf das künftige Ansehen des Maintainers und seine Stellung in der Entwickler-Community aus? Kann diesem Maintainer jemals wieder zugetraut werden, keine weiteren derartigen oder sogar noch drastischeren Aktionen bei Projekten durchzuführen, an denen er beteiligt ist?
RIAEvangelist betreut derzeit mehr als 40 weitere npm-Pakete, die zusammen Hunderte Millionen Downloads verzeichnen. Hier sind einige der betreuten Module und ihre wöchentlichen Downloads in der npmjs-Registry:
npm-Modul | Wöchentliche Downloads |
|---|---|
node-ipc — Ein Node.js-Modul für lokale und entfernte Interprozesskommunikation (IPC), neuronale Netzwerke und die Unterstützung von Machine Learning. | 1.055.386 |
js-queue — Einfache JS-Warteschlange mit automatischer Ausführung für Node und Browser. | 1.042.512 |
easy-stack — Einfacher JS-Stack mit automatischer Ausführung für Node und Browser. | 1.001.945 |
js-message — Normalisiertes JS-Objekt- und JSON-Nachrichten- und Ereignisprotokoll für node.js, vanilla js, react.js, Komponenten, Aktionen, Stores und Dispatcher. | 1.001.943 |
event-pubsub — Besonders leichtgewichtiges und schnelles, erweiterbares ES6+-Ereignis- und EventEmitter-System für Node und den Browser. Einfach für Entwickler aller Erfahrungsstufen; derselbe Code funktioniert unverändert in Node und im Browser. Ohne Schnickschnack, nur blitzschnelle Ereignisse! | 996.076 |
node-cmd — Einfache Befehlszeilen-/Terminal-/Shell-Schnittstelle, mit der sich CLI- oder Bash-Befehle ausführen lassen, als wären Sie direkt im Terminal. | 41.083 |
Das Snyk Security Research-Team hat keine Hinweise darauf gefunden, dass andere Pakete dieses Maintainers vorsätzlich auf ähnliche Weise missbraucht wurden. Es beobachtet jedoch weiterhin aufmerksam die im npmjs-Ökosystem veröffentlichten Updates.
So können Sie das node-ipc-Problem eindämmen
Angesichts möglicher künftiger Codeänderungen, die Nutzer gefährden könnten, empfehlen wir, das npm-Paket node-ipc vollständig zu meiden. Ist dieses npm-Paket Teil Ihrer Anwendung, empfehlen wir, die Funktion Ihres npm-Paketmanagers zu nutzen, um die sabotierten Versionen zu überschreiben und die transitive Abhängigkeit auf eine bekanntermaßen sichere Version festzusetzen.
Wenn Sie npm als Paketmanager verwenden, können Sie Ihrer Datei package.json Folgendes hinzufügen, um ausschließlich unbedenkliche Versionen von node-ipc zuzulassen:
Bekannte prominente Betroffene des node-ipc-Vorfalls
Sicherheitslücke in Vue.js-Projekt durch Protestware von node-ipc
Die Vue.js CLI war früher von der Version 9.x von node-ipc abhängig und dadurch anfällig für Version 9.2.2. Diese fügte das Modul peacenotwar hinzu, das die Datei WITH-LOVE-FROM-AMERICA.txt im Desktop-Verzeichnis des Nutzers ablegte. Die Sicherheitslücke in @vue/cli wurde inzwischen behoben. Bitte aktualisieren Sie mit dem Paketmanager Ihrer Wahl auf die neueste Version von @vue/cli: 4.5.16+ oder 5.0.3+.
Sicherheitslücke in der Unity-Spiel-Engine durch Protestware von node-ipc
Nutzer haben berichtet, dass das Unity-Game-Engine-Projekt seine Software zusammen mit node-ipc@9.2.2 ausgeliefert hat. Das alarmierte Nutzer, die überraschend eine neu erstellte Datei auf ihrem Desktop entdeckten. Das Unity-Team veröffentlichte am 16. März umgehend eine Hotfix-Version 3.1.1, um das Problem zu entschärfen.
Zusammenfassung
Snyk steht an der Seite der Ukraine und hat proaktiv Maßnahmen ergriffen, um die Menschen in der Ukraine während der anhaltenden Krise mit Spenden und kostenlosen Services für Entwickler weltweit zu unterstützen. Außerdem haben wir unsere Geschäftstätigkeit in Russland und Belarus eingestellt. Vorsätzlicher Missbrauch wie dieser schadet der globalen Open-Source-Community. Deshalb müssen wir betroffene Versionen von node-ipc als Sicherheitslücken kennzeichnen.
Das Snyk-Sicherheitsteam hat daher CVE-2022-23812 und SNYK-JS-PEACENOTWAR-2426724 veröffentlicht, um auf die Sicherheitslücke in den vorsätzlich verwundbaren Versionen von node-ipc hinzuweisen und sie zu verfolgen. Auch im kostenlosen Tarif von Snyk ist diese neue Sicherheitslücke bereits erfasst. So können Entwickler scannen, überwachen und Sicherheitskorrekturen automatisch als Pull Requests bereitstellen.
Die Auswirkungen von Supply-Chain-Sicherheitsvorfällen zeigen weiterhin, wie wichtig es ist, Risiken im Zusammenhang mit Open-Source-Abhängigkeiten richtig zu verwalten und schnell darauf zu reagieren. Darüber hinaus hat die Komplexität verschachtelter Abhängigkeiten, etwa im JavaScript-Ökosystem npmjs, erneut verdeutlicht, wie stark sich ihre Auswirkungen auf wichtige Projekte des Ökosystems summieren.
Erst vor zwei Monaten haben wir über die weitreichenden Folgen eines ähnlichen Sicherheitsvorfalls berichtet, bei dem ein Open-Source-Maintainer die npm-Pakete „colors“ und „faker“ lahmlegte. Der Vorfall zeigte, wie Maintainer Open-Source-Bibliotheken vorsätzlich sabotieren können.
Es wird immer wichtiger, sich Kenntnisse im Management von Software-Abhängigkeiten in großem Umfang anzueignen, als Entwickler die Best Practices für npm-Sicherheit zu befolgen und Sicherheitsrisiken sowie Vorfälle zu verstehen – etwa, warum npm-Lockfiles ein blinder Fleck bei der Einschleusung bösartiger Module sein können.
Weitere Informationen zur Supply-Chain-Sicherheit finden Sie in diesen Blogbeiträgen:
