Poeksperymentuj z utworzeniem pakietu NPM zależnego od wszystkich pakietów w repozytorium

Jeden z twórców pakietów JavaScript eksperymentował z utworzeniem i umieszczeniem w repozytorium NPM pakietu „wszystko”, który obejmuje wszystkie istniejące w repozytorium pakiety wraz z zależnościami. Aby zaimplementować tę funkcję, pakiet „wszystko” ma bezpośrednie zależności z pięcioma pakietami „@everything-registry/chunk-N”, które z kolei mają zależności od ponad 3000 pakietów „sub-chunk-N”, z których każdy wiąże się z 800 istniejących pakietów w repozytorium.

Umieszczenie „wszystko” w NPM miało dwa interesujące skutki. Po pierwsze, pakiet „wszystko” stał się swego rodzaju narzędziem do przeprowadzania ataków DoS, gdyż próba jego instalacji kończy się pobraniem milionów pakietów hostowanych w NPM i wyczerpaniem dostępnej przestrzeni dyskowej lub zatrzymaniem wykonywania procesów kompilacji. Według statystyk NPM pakiet został pobrany około 250 razy, ale nikt nie zadał sobie trudu dodania go jako zależności do innego pakietu po tym, jak włamano się na konto programisty w celu popełnienia sabotażu. Ponadto niektóre usługi i narzędzia monitorujące i sprawdzające nowe pakiety hostowane przez NPM zostały nieświadomie narażone na atak.

Po drugie, opublikowanie pakietu „wszystko” skutecznie zablokowało możliwość usunięcia w NPM jakichkolwiek pakietów, które znalazły się na liście jego zależności. Pakiet z NPM może zostać usunięty przez autora tylko wtedy, gdy nie jest już używany w zależnościach innych pakietów, ale po opublikowaniu „wszystko” okazało się, że zależności obejmują wszystkie pakiety w repozytorium. Warto zauważyć, że zablokowane zostało także usunięcie samego pakietu „wszystko”, gdyż 9 lat temu w repozytorium został opublikowany pakiet testowy „wszystko-inne”, który na liście zależności zawierał ciąg „wszystko”. Zatem po publikacji pakiet „wszystko” stał się zależny od innego pakietu.

Źródło: opennet.ru

Dodaj komentarz