# Npm (Software)

npm (ehemals Node Package Manager) ist ein Paketmanager für die JavaScript-Laufzeitumgebung Node.js. npm wurde 2010 von Isaac Schlueter als Mitarbeiter des kalifornischen Cloud-Plattform-Anbieters Joyent programmiert. 2014 gründete er die „npm, inc.“
Unter dem Namen npm Registry bzw. npm Open Source wird ein Repository betrieben, über das 350.000 Pakete (Stand 13. Januar 2017) unter einer freien Lizenz bereitgestellt werden. Für private Pakete (also nicht Open Source) wird eine kommerzielle Version angeboten.
Hinter der Entwicklung und dem Betrieb des Repository steht die Firma npm, Inc. mit Sitz in Oakland, Kalifornien, die seit 2020 GitHub gehört und somit zum Microsoft-Konzern.

## Sicherheit

Wie jedes Repository ist die npm Registry dafür anfällig, dass Pakete mit Schadcode eingestellt werden. Sobald solche Pakete via Abhängigkeiten in einem Softwareprojekt verwendet werden, können verschiedenste Angriffe ausgeführt werden. In der Vergangenheit wurden Attacken via Typosquatting und Social Engineering bekannt. Im Jahr 2021 präsentierte ein Sicherheitsforscher einen weiteren Angriffsvektor, indem er schadhafte Pakete auf npm.com veröffentlichte und dabei den Paketnamen so wählte, dass er dem von Softwarefirmen intern verwendeten Paketnamen entspricht. Bei einer Fehlkonfiguration wurde in weiterer Folge das schadhafte Paket heruntergeladen und dessen Code ausgeführt.

## Probleme

Wegen einer Meinungsverschiedenheit in Bezug auf den Namen eines Pakets und der Reaktion der npm Registry darauf löschte im März 2016 ein Entwickler sämtliche seiner Pakete aus dem Repository, unter anderem auch left-pad. Daraufhin konnte eine Vielzahl von Paketen wie Babel (ein JSX-nach-JavaScript-Compiler) und React nicht mehr kompiliert werden, weil diese das Paket benötigen. Dies löste eine Debatte über den Einsatz von vielen Mikro-Modulen in der JavaScript-Community und die Abhängigkeit von einem kommerziell geführten Repository aus. Des Weiteren wurden im Repository Maßnahmen gesetzt, um in Zukunft solche Probleme zu vermeiden: Veröffentlichte Versionen von Paketen können nur innerhalb von 24 Stunden selbstständig oder durch Kontaktieren des Supports zurückgezogen werden.
Im Januar 2018 wurde versehentlich ein Benutzer blockiert und damit auch der Download seiner 102 Pakete. Aus diesem Grund konnte eine Vielzahl von bekannten JavaScript-Projekten nicht installiert/gebaut werden.
Am 4. November 2021 wurde bekannt, dass mittels eines kompromittierten Maintainer-Zugangs, Schadcode über die Repositories „coa“ (Command Line Parser) und „rc“ (Configuration Loader) ausgeliefert wurde.
Im Januar 2022 fügte der Entwickler des Pakets colors bewusst eine Endlosschleife ein und machte somit dieses Paket, welches seinerseits als Abhängigkeit in circa 20.000 Paketen verwendet wird, unbrauchbar.
Im April 2022 wurde ein weiterer Angriffsvektor publik – „Package Planting“: npm ermöglichte es, Maintainer zu Paketen hinzuzufügen, ohne dass diese zustimmen mussten. Ein Angreifer konnte sich Typosquatting bedienen und ein für ein populäres Paket (wie beispielsweise Express.js) ein ähnlich geschriebenes Paket mit Schadcode veröffentlichen. Durch das Hinzufügen der ursprünglichen Maintainer konnte dem schadhaften Paket Vertrauenswürdigkeit verliehen werden und die unwissenden Maintainer des richtigen Paketes konnten diffamiert werden.

## Name

Die Bezeichnung Node Package Manager geht auf die Readme-Datei des Projekts zurück. Im Dezember 2014 wurde die Bezeichnung allerdings entfernt. Auf der FAQ-Seite des Projekts wurde zwischen August 2011 und November 2015 npm als "rekursives" Backronym für „npm is not an acronym“ („npm ist kein Akronym“) definiert, welches tatsächlich jedoch nicht rekursiv ist. Seit September 2014 werden Community-basiert mögliche Erklärungen für npm im GitHub-Projekt npm-expansions gesammelt und auf der Webseite angezeigt.