Експеримент із створенням NPM-пакету, залежного від усіх пакетів у репозиторії

Один із розробників JavaScript-пакетів провів експеримент із створенням та розміщенням у репозиторії NPM пакету «everything», який охоплює залежностями всі існуючі пакети в репозиторії. Для реалізації подібної можливості пакет «everything» пов'язаний прямими залежностями з п'ятьма пакетами «@everything-registry/chunk-N», які у свою чергу прив'язуються до більш ніж 3000 пакетів «sub-chunk-N», у кожному з яких здійснюється прив'язка до 800 існуючих пакетів у репозиторії.

Розміщення "everything" в NPM призвело до двох цікавих ефектів. По-перше пакет «everything» став своєрідним інструментом для здійснення DoS-атак, оскільки спроба його встановлення призводить до завантаження мільйонів розміщених у NPM пакетів та вичерпання наявного дискового простору або зупинення виконання складальних процесів. За статистикою NPM пакет був завантажений близько 250 разів, але ніхто не заважає додати його залежно до іншого пакета після злому облікового запису розробника для здійснення диверсії. Крім того, мимоволі атаці піддалися деякі служби та інструменти, що здійснюють моніторинг і перевірку нових пакетів, що розміщуються в NPM.

По-друге, публікація пакету «everything» фактично заблокувала можливість видалення будь-яких пакетів у NPM, які опинилися в списку його залежностей. Пакет з NPM може бути видалений автором тільки якщо він ще не використовується в залежності від інших пакетів, але після публікації «everything» залежностями виявилися охоплені всі пакети в репозиторії. Примітно, що видалення самого пакету «everything» також виявилося заблокованим, оскільки 9 років тому в репозиторії було розміщено тестовий пакет «everything-else», в якому було вказано рядок «everything» у списку залежностей. Таким чином, пакет "everything" після публікації опинився в залежності від іншого пакету.

Джерело: opennet.ru

Додати коментар або відгук