npm (Software)

Paketmanager für die JavaScript-Laufzeitumgebung node.js

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.“[4]

npm

Basisdaten

Entwickler Isaac Z. Schlueter / npm, Inc.[1]
Erscheinungsjahr 12. Januar 2010[2]
Aktuelle Version 10.9.1[3]
(21. November 2024)
Betriebssystem Plattformunabhängig
Programmier­sprache JavaScript
Kategorie Paketverwaltung
Lizenz Artistic License 2.0
deutschsprachig nein
www.npmjs.com

Unter dem Namen npm Registry bzw. npm Open Source wird ein Repository betrieben, über das 350.000 Pakete (Stand 13. Januar 2017[5]) unter einer freien Lizenz bereitgestellt werden.[6] Für private Pakete (also nicht Open Source) wird eine kommerzielle Version angeboten.[7]

Hinter der Entwicklung und dem Betrieb des Repository steht die Firma npm, Inc. mit Sitz in Oakland, Kalifornien,[8] die seit 2020 GitHub gehört[9] und somit zum Microsoft-Konzern.

Sicherheit

Bearbeiten

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[10] und Social Engineering[11] 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.[12]

Probleme

Bearbeiten

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.[13][14][15] 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.[16] 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.[17][18][19]

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.[20]

Am 4. November 2021 wurde bekannt, dass mittels eines kompromittierten Maintainer-Zugangs, Schadcode über die Repositories „coa“[21] (Command Line Parser) und „rc“[22] (Configuration Loader) ausgeliefert wurde.[23]

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.[24][25]

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.[26]

 
npm-expansions auf npmjs.com

Die Bezeichnung Node Package Manager geht auf die Readme-Datei des Projekts zurück.[27] Im Dezember 2014 wurde die Bezeichnung allerdings entfernt.[28] 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.[29][30] Seit September 2014 werden Community-basiert mögliche Erklärungen für npm im GitHub-Projekt npm-expansions gesammelt und auf der Webseite angezeigt.[31]

Siehe auch

Bearbeiten
  • Bower – Paketverwaltung für clientseitige JavaScript-Pakete

Einzelnachweise

Bearbeiten
  1. About
  2. Erste Versionen von npm. In: GitHub. Abgerufen am 5. Januar 2019.
  3. Release 10.9.1. 21. November 2024 (abgerufen am 23. November 2024).
  4. increment.com: Glenn Fleischmann: Interview with Isaac Z. Schlueter, CEO of npm
  5. State of the Union: npm. In: Linux.com | The source for Linux information. Abgerufen am 16. Januar 2017.
  6. npm Open Source. In: npmjs.com. Archiviert vom Original (nicht mehr online verfügbar) am 25. März 2016; abgerufen am 24. März 2016 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.npmjs.com
  7. npm Private Packages. In: npmjs.com. Abgerufen am 24. März 2016 (englisch).
  8. About npm. In: npmjs.com. Abgerufen am 24. März 2016 (englisch).
  9. npm is joining GitHub. In: github.blog. Abgerufen am 16. März 2020 (englisch). npm wird Teil von GitHub. In: microsoft.com. Abgerufen am 20. März 2020.
  10. `crossenv` malware on the npm registry. In: The npm Blog. 2. August 2017, abgerufen am 12. Januar 2018 (englisch).
  11. David Gilbertson: I’m harvesting credit card numbers and passwords from your site. Here’s how. In: Hacker Noon. 6. Januar 2018 (englisch, hackernoon.com [abgerufen am 12. Januar 2018]).
  12. Sicherheitsforscher bricht über Open-Source-Repositories bei PayPal & Co. ein. In: heise online. 10. Februar 2021, abgerufen am 11. Februar 2021.
  13. JavaScript-Paket aus NPM entfernt: Node, Babel und Co. scheiterten beim Build. In: heise online. 23. März 2016, abgerufen am 25. März 2016.
  14. I've Just Liberated My Modules - Azer Koçulu's Journal. 27. März 2021, archiviert vom Original (nicht mehr online verfügbar) am 27. März 2021; abgerufen am 20. November 2023.  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/kodfabrik.com
  15. Mike Roberts: A discussion about the breaking of the Internet. In: Medium. 23. März 2016, archiviert vom Original (nicht mehr online verfügbar) am 8. November 2020; abgerufen am 25. März 2016 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/medium.com
  16. NPM and Left-Pad: Have We Forgotten How to Program? In: Hacker News. Abgerufen am 25. März 2016.
  17. kik, left-pad, and npm. In: blog.npmjs.org. 23. März 2016, abgerufen am 25. März 2016 (englisch).
  18. changes to npm’s unpublish policy. In: blog.npmjs.org. 29. März 2016, abgerufen am 30. März 2016 (englisch).
  19. JavaScript: npm ändert Unpublish Policy für Pakete. In: heise online. 30. März 2016, abgerufen am 30. März 2016.
  20. Incident report: npm, Inc. operations incident of January 6, 2018. 11. Januar 2018, abgerufen am 12. Januar 2018 (englisch).
  21. https://github.com/advisories/GHSA-73qr-pfmq-6rp8
  22. https://github.com/advisories/GHSA-g2q5-5433-rhrf
  23. https://twitter.com/npmjs/status/1456310581846163457
  24. heise online: Paketmanager npm: Entwickler macht eigene Packages unbrauchbar. 11. Januar 2022, abgerufen am 27. April 2022.
  25. colors. In: npmjs.com. Abgerufen am 27. April 2022 (englisch).
  26. heise online: Npm-Schwachstelle „Package Planting“: Vertrauen ist gut, Kontrolle ist besser. 27. April 2022, abgerufen am 27. April 2022.
  27. Initial drop. Ugly, sketchy, and not even yet quite a „work in progr…“ · npm/npm@4626dfa. In: GitHub. 29. September 2009, abgerufen am 7. April 2016: „npm – The Node Package Manager“
  28. npm is a nice JavaScript package manager · npm/npm@cbb890e. In: GitHub. 12. Dezember 2014, abgerufen am 7. April 2016.
  29. Question about Capitalization · npm/npm@9c0b248. In: GitHub. 6. August 2011, abgerufen am 7. April 2016: „Contrary to the belief of many, „npm“ is not in fact an abbreviation for „Node Package Manager“. It is a recursive bacronymic abbreviation for „npm is not an acronym“.“
  30. doc: remove FAQ · npm/npm@b88c37c. In: GitHub. 25. November 2015, abgerufen am 7. April 2016.
  31. npm/npm-expansions. In: GitHub. Abgerufen am 7. April 2016: „What does n-p-m stand for?“