GitHub bezeichnet die angekündigten Anpassungen für npm 12 als Änderungen mit möglicher Inkompatibilität. Der Kernpunkt ist die Abkehr vom bisherigen Standardverhalten bei Installationsskripten. Künftig soll Codeausführung während „npm install“ nur noch nach expliziter Zustimmung erfolgen. GitHub begründet das damit, dass Installationsskripte zur Laufzeit die „größte einzelne Codeausführungsfläche im npm-Ökosystem“ darstellen.
Nach Angaben des Unternehmens führt „npm install“ Skripte aus jeder transitiven Abhängigkeit aus. Dadurch reicht bereits ein kompromittiertes Paket an irgendeiner Stelle der Abhängigkeitskette aus, um beliebigen Code auf Entwicklergeräten oder in CI-Umgebungen laufen zu lassen. GitHub formuliert das Ziel der Änderung so: Die Ausführung von Skripten werde zu einer bewussten Entscheidung, bleibe für vertrauenswürdige Pakete aber weiterhin „nur einen Befehl entfernt“.
Zu den konkret genannten Änderungen gehört das neue Standardverhalten von „allowScripts“. GitHub weist darauf hin, dass davon auch native node-gyp-Builds betroffen sind. Das gelte selbst dann, wenn ein Paket zwar eine „binding.gyp“, aber kein ausdrücklich definiertes Installationsskript enthält, weil npm in diesem Fall implizit ein „node-gyp rebuild“ ausführt. Ebenso würden „prepare“-Skripte aus Git-, Datei- und Link-Abhängigkeiten auf dieselbe Weise blockiert.
Darüber hinaus setzt npm 12 die Option „–allow-git“ standardmäßig auf „none“. Damit werde ein weiterer Pfad zur Codeausführung geschlossen, bei dem eine „.npmrc“-Konfigurationsdatei aus einer Git-Abhängigkeit das verwendete Git-Programm überschreiben könne. Laut GitHub war das selbst dann möglich, wenn „–ignore-scripts“ gesetzt war. Diese Option verhindert, dass in einer „package.json“ definierte Pakete während der Installation ihre eingebauten Lifecycle-Skripte automatisch ausführen.
Entwicklern empfiehlt GitHub, sich vorab auf die Änderungen vorzubereiten. Dazu rät das Unternehmen zu einem Upgrade auf npm 11.16.0 oder neuer, anschließend zu einer regulären Installation und zur Prüfung der dabei angezeigten Warnungen. Außerdem verweist GitHub auf den Befehl „npm approve-scripts –allow-scripts-pending“. Damit lasse sich ermitteln, welche Pakete Skripte enthalten, um vertrauenswürdige gezielt freizugeben und die aktualisierte „package.json“ zu übernehmen. Nach einem späteren Upgrade würden dann nur noch die ausdrücklich genehmigten Skripte weiter ausgeführt; alles nicht Freigegebene werde gestoppt.
Bereits Anfang dieses Jahres hatte npm mit „min-release-age“ eine weitere Schutzfunktion eingeführt. Diese Einstellung weist npm an, Paketversionen abzulehnen, die erst seit einer festgelegten Zahl von Tagen veröffentlicht sind. Laut GitHub dient auch das als Schutzmaßnahme gegen neu veröffentlichte schädliche Pakete.
