Один из разработчиков 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» после публикации оказался в зависимостях у другого пакета.
>>> Подробности