npm v12 stärkt Lieferkette gegen 'npm install'-Angriffe
GitHub führt nächsten Monat mit npm v12 signifikante Sicherheitsverbesserungen ein, die sich direkt mit der eskalierenden Bedrohung durch Angriffe auf die Lieferkette befassen. Das Update wird die Funktionsweise des Befehls 'npm install' grundlegend ändern und eine explizite Genehmigung für die Codeausführung und Nicht-Registry-Abhängigkeitsquellen erfordern, die zuvor standardmäßig vertrauenswürdig waren. Dieser Schritt zielt darauf ab, Angriffsvektoren drastisch zu reduzieren, die von böswilligen Akteuren häufig ausgenutzt werden.

**GitHub** hat eine umfassende Sicherheitsüberarbeitung für **npm v12** angekündigt, die für nächsten Monat geplant ist. Diese Änderungen sind speziell darauf ausgelegt, Angriffe auf die Lieferkette zu kontern, die Verhaltensweisen ausnutzen, die durch den allgegenwärtigen Befehl `'npm install'` ausgelöst werden.
`'npm install'` ist der Befehl, der für das Herunterladen und Installieren der Abhängigkeiten eines Projekts sowie für die Ausführung zugehöriger Installationsskripte verantwortlich ist. Entwickler verwenden ihn häufig nach dem Klonen von Projekten, dem Abrufen von Updates oder während CI/CD-Build-Prozessen. Angreifer haben diesen Befehl aufgrund seines Potenzials zur automatisierten Codeausführung während der Paketinstallation lange Zeit ins Visier genommen.
Das Kernprinzip hinter diesem Update ist eine Verlagerung von implizitem Vertrauen zu expliziter Genehmigung für Codeausführung und Nicht-Registry-Abhängigkeitsquellen während `npm install`-Operationen.
**GitHub** hat in seiner Ankündigung die folgenden wichtigen Änderungen detailliert aufgeführt:
1. **Einschränkungen bei der Skriptausführung**: Ab **npm v12** werden `preinstall`, `install` und `postinstall`-Skripte von Abhängigkeiten nicht mehr automatisch ausgeführt, es sei denn, sie werden explizit genehmigt. Diese Einschränkung erstreckt sich auch auf native Modul-Builds, die über **node-gyp** initiiert werden, sowie auf `prepare`-Skripte von Git-, lokalen Datei- und verknüpften Abhängigkeiten.
2. **Auflösung von Git-Abhängigkeiten**: `npm install` wird keine Abhängigkeiten mehr automatisch aus Git-Repositories abrufen, weder direkt noch transitiv, ohne explizite Erlaubnis. **GitHub** merkt an, dass dies einen kritischen Pfad zur Codeausführung schließt, bei dem die `.npmrc`-Datei einer Git-Abhängigkeit manipuliert werden konnte, um die verwendete Git-Executable zu ändern, selbst wenn Installationsskripte deaktiviert waren.
3. **Auflösung von Abhängigkeiten über Remote-URLs**: Abhängigkeiten, die von Remote-URLs wie HTTPS-Tarballs installiert werden, werden nicht mehr automatisch aufgelöst. Dies gilt sowohl für direkte als auch für transitive Abhängigkeiten.
Diese Modifikationen werden voraussichtlich die Risiken in der Lieferkette erheblich mindern, indem die automatische Ausführung von Installationsskripten für Abhängigkeiten, die automatische Auflösung von Git-basierten Abhängigkeiten und die automatische Auflösung von Remote-URL-Abhängigkeiten eliminiert werden.
Solche neuen Standardeinstellungen hätten mehrere aktuelle Angriffe auf die Lieferkette verhindert, darunter bösartige Kampagnen mit `preinstall`/`postinstall`-Skripten, die auf **eslint-config-prettier**, **Toptals Picasso-Pakete** und zahlreiche datenklauende **npm**-Pakete abzielten. Sie hätten auch den Missbrauch von Git-Abhängigkeiten kontert, wie er in den **Shai-Hulud**-Angriffen dokumentiert wurde.
Projekte, die von einem dieser Verhaltensweisen legitimerweise abhängen, müssen sich explizit dafür entscheiden, bevor sie auf **npm v12** aktualisieren.
**GitHub** rät Entwicklern, sich durch ein Upgrade auf **npm 11.16.0** oder neuer vorzubereiten. Diese Version zeigt Warnungen für alle Aktionen an, die von **v12** betroffen sein werden, und ermöglicht es Entwicklern, Abhängigkeiten oder Workflows zu identifizieren und zu beheben, die eine explizite Genehmigung erfordern, bevor das vollständige Upgrade durchgeführt wird.
Nach dem Upgrade auf **npm v12** funktionieren nur noch explizit genehmigte Skripte und Abhängigkeitsquellen automatisch.
Eine [Community-Diskussion](https://github.com/orgs/community/discussions/198547) wurde initiiert, damit Entwickler Feedback und Vorschläge zu diesen bevorstehenden Änderungen geben können.