Ein Entwickler von JavaScript-Paketen hat ein Experiment durchgeführt, bei dem er ein Paket namens „everything“ im NPM-Repository erstellt und veröffentlicht hat. Dieses Paket deckt mit seinen Abhängigkeiten alle vorhandenen Pakete im Repository ab. Um diese Funktionalität zu realisieren, ist das Paket „everything“ direkt mit fünf Paketen „@everything-registry/chunk-N“ verbunden, die wiederum Abhängigkeiten zu über 3000 Paketen „sub-chunk-N“ haben. In jedem dieser Pakete werden 800 bestehende Pakete im Repository verknüpft.
Die Platzierung des Pakets „everything“ in NPM hat zwei interessante Effekte zur Folge. Erstens wurde das Paket „everything“ zu einem Werkzeug für DoS-Angriffe, da der Versuch, es zu installieren, Millionen von in NPM verfügbaren Paketen herunterlädt, was zu einem Erschöpfen des Speicherplatzes oder zum Stillstand von Build-Prozessen führen kann. Statistiken zufolge wurde das NPM-Paket ungefähr 250 Mal heruntergeladen, aber niemand hindert dich daran, es nach einem Hack des Entwicklerkontos als Abhängigkeit zu einem anderen Paket hinzuzufügen, um Sabotage zu betreiben. Darüber hinaus waren ungewollt einige Überwachungsdienste und -tools, die neue in NPM veröffentlichte Pakete überwachen und überprüfen, Angriffen ausgesetzt.
Zweitens hat die Veröffentlichung des Pakets „everything“ faktisch die Möglichkeit blockiert, beliebige Pakete in NPM zu entfernen, die in seiner Abhängigkeit aufgeführt sind. Ein NPM-Paket kann vom Autor nur gelöscht werden, wenn es noch nicht in den Abhängigkeiten anderer Pakete verwendet wird. Nach der Veröffentlichung von „everything“ sind jedoch alle Pakete im Repository von Abhängigkeiten betroffen. Bemerkenswert ist, dass auch die Löschung des Pakets „everything“ blockiert wurde, da vor 9 Jahren ein Testpaket mit dem Namen „everything-else“ im Repository veröffentlicht wurde, in dem der Eintrag „everything“ in der Liste der Abhängigkeiten angegeben war. So ist das Paket „everything“ nach der Veröffentlichung in den Abhängigkeiten eines anderen Pakets gelandet.
Quelle: opennet.ru
