Jeden z twórców pakietów JavaScript przeprowadził eksperyment związany z utworzeniem i umieszczeniem w repozytorium NPM pakietu „everything”, który pokrywa zależnościami wszystkie istniejące pakiety w repozytorium. Aby to zrealizować, pakiet „everything” jest powiązany bezpośrednimi zależnościami z pięcioma pakietami „@everything-registry/chunk-N”, które z kolei są powiązane zależnościami z ponad 3000 pakietów „sub-chunk-N”, w każdym z nich zawierających powiązania z 800 istniejącymi pakietami w repozytorium.
Umieszczenie „everything” w NPM doprowadziło do dwóch ciekawych skutków. Po pierwsze, pakiet „everything” stał się swoistym narzędziem do przeprowadzania ataków DoS, ponieważ próba jego instalacji prowadzi do pobrania milionów pakietów umieszczonych w NPM, co skutkuje wyczerpaniem dostępnej przestrzeni dyskowej lub zatrzymaniem procesów budowlanych. Według statystyk pakiet NPM został pobrany około 250 razy, ale nikt nie przeszkadza w dodaniu go do zależności innego pakietu po zhakowaniu konta dewelopera w celu przeprowadzenia sabotażu. Ponadto, nieświadomie atakowi podlegały niektóre usługi i narzędzia monitorujące oraz sprawdzające nowe pakiety umieszczane w NPM.
Po drugie, publikacja pakietu „everything” praktycznie zablokowała możliwość usuwania jakichkolwiek pakietów w NPM, które znalazły się w liście jego zależności. Pakiet z NPM może być usunięty przez autora tylko wtedy, gdy nie jest jeszcze używany w zależnościach innych pakietów, ale po publikacji „everything” wszystkie pakiety w repozytorium znalazły się w jego zależnościach. Co ciekawe, usunięcie samego pakietu „everything” również okazało się zablokowane, ponieważ 9 lat temu w repozytorium umieszczono pakiet testowy „everything-else”, w którym wskazano „everything” w liście zależności. W ten sposób pakiet „everything” po publikacji znalazł się w zależnościach innego pakietu.
Źródło: opennet.ru
