Kern der Änderung ist, dass „npm install“ in NPM 12 keine preinstall-, install- oder postinstall-Skripte aus Abhängigkeiten mehr ausführt, wenn diese nicht ausdrücklich im jeweiligen Projekt zugelassen wurden. GitHub beschreibt das als Standardverhalten, das Nutzer besser vor den zuletzt beobachteten Angriffen schützen soll.
Die Maßnahme greift über klassische Installationsskripte hinaus. Laut GitHub betrifft sie auch native node-gyp-Builds, etwa Pakete mit einer binding.gyp-Datei ohne explizites Installationsskript. Ebenfalls betroffen sind prepare-Skripte aus Git-, Datei- und Link-Abhängigkeiten. Die jüngsten Shai-Hulud-Miasma-Angriffe stützten sich nach Angaben des Unternehmens auf eine präparierte binding.gyp-Datei.
Entwickler können schon vor dem Umstieg prüfen, welche Folgen die neue Voreinstellung für ihre Projekte hat. GitHub empfiehlt dafür den Befehl „npm approve-scripts –allow-scripts-pending“. Damit lassen sich vertrauenswürdige Pakete freigeben und andere blockieren; daraus entsteht eine Erlaubnisliste, die in die package.json geschrieben wird.
Sobald diese JSON-Datei eingecheckt ist, erhalten Entwickler mit NPM 11.16.0 oder neuer Warnungen, falls ihre Installationsroutine Skripte ausführt. GitHub rät dazu, zunächst auf NPM 11.16.0 oder neuer zu aktualisieren, die gewohnte Installation auszuführen, die Warnungen zu prüfen und anschließend mit „npm approve-scripts –allow-scripts-pending“ festzulegen, welche Pakete Skripte ausführen dürfen. Nach dem Upgrade laufen dann nur noch die zuvor genehmigten Skripte weiter.
Zusätzlich ändert GitHub das Verhalten bei Git-Abhängigkeiten. Direkte oder transitive Git-Abhängigkeiten werden bei „npm install“ künftig nicht mehr aufgelöst, wenn sie nicht ausdrücklich erlaubt wurden. Nach Angaben der Plattform schließt das einen Pfad zur Codeausführung, bei dem eine .npmrc-Datei einer Git-Abhängigkeit das Git-Programm überschreiben konnte — selbst dann, wenn „–ignore-scripts“ gesetzt war.
Auch Abhängigkeiten aus entfernten URLs werden in NPM 12 nicht mehr standardmäßig aufgelöst. Das umfasst laut GitHub direkte und transitive HTTPS-Tarballs. Wer sie weiterhin nutzen will, kann sie mit dem Schalter „–allow-remote“ zulassen, der seit Version 11.15.0 verfügbar ist.
Die Änderungen folgen auf mehrere Angriffe auf das NPM-Ökosystem. GitHub verweist dabei auf Vorfälle der vergangenen Monate, die hauptsächlich mit TeamPCP und dem selbstreplizierenden Wurm Shai-Hulud verbunden waren. Diese Kampagnen missbrauchten die automatische Ausführung von Skripten aus Abhängigkeiten während „npm install“, um Schadsoftware bei tausenden Entwicklern zu platzieren.
