npm install — это RCE Каждый раз, когда пишем npm install, мы запускаем чужой код: в деве, в CI, в проде. И почти никогда не читаем, что там внутри.
npm устроен так, что одна зависимость может притянуть сотни. Где на любом уровне — postinstall, бэкдор, телеметрия или просто баг.
Добавляя “удобный” хелпер (deepClone, dateFormat), можно получить зависимости, у которых на любом уровне может быть:
– postinstall, выполняющий shell-скрипт
– prepare с подменой файлов перед публикацией
– динамический импорт из внешнего URL
– замаскированный base64/pako payload
– инициализация, собирающая ENV, hostname и proxy-данные
Или просто: – устаревший код, который тормозит рантайм – сломанный код при следующем миноре
Многие пакеты не имеют CI, не проходят аудит. package-lock не спасёт, если у тебя ^ или обновление в dev-зависимости.
Не так давно были заражены: eslint-config-prettier, eslint-plugin-prettier, @pkgr/core. Сотни тысяч проектов могли получить трояна через обычный npm install.
Каждый npm install — это акт доверия. Если ты не читаешь, что ставишь — ты запускаешь произвольный код.
Чем ниже уровень — тем выше цена. Zero Deps — это не мода. Это контроль.