npm 12 вышел: install-скрипты зависимостей больше не запускаются автоматически

8 июля вышел npm 12.0.0. postinstall-скрипты зависимостей теперь не выполняются без явного разрешения, git- и URL-зависимости не резолвятся. Это прямой ответ на волну supply-chain-атак — и гарантированная поломка половины CI-пайплайнов.

DB
DBG · по материалам GitHub Changelog / npm CLI Releases
0

8 июля GitHub выпустил npm 12.0.0, а 10 июля — патч 12.0.1. Это самое серьёзное изменение поведения пакетного менеджера за последние годы, и почти наверняка оно что-нибудь у вас сломает.

Главное: allowScripts теперь выключен по умолчанию. При npm install скрипты preinstall, install и postinstall из зависимостей больше не выполняются — ни у прямых, ни у транзитивных. Запустить их можно только явно разрешив конкретные пакеты. Заодно закрыты два соседних вектора: --allow-git по умолчанию none — git-зависимости (в том числе транзитивные) не резолвятся; --allow-remote тоже none — тарболлы по HTTPS-ссылкам не ставятся. Плюс из CLI выкинули команды shrinkwrap, adduser и star.

Мотив прозрачен. Автоматический postinstall — это механизм, который годами превращал любую скомпрометированную зависимость в исполнение произвольного кода на машине разработчика и на билд-агенте. 2025-й стал худшим годом в истории npm по числу supply-chain-инцидентов; в сентябре атакующие захватили 18 популярных пакетов, включая debug и chalk, суммарно это больше 2,6 млрд загрузок в неделю. Отключение install-скриптов по умолчанию не лечит компрометацию как таковую, но убирает самый дешёвый способ её монетизировать.

Оборотная сторона — экосистема на этих скриптах построена. Всё, что тянет или компилирует нативные бинарники на этапе установки, ломается первым: sharp, esbuild, puppeteer, prisma, bcrypt, node-gyp-пакеты. Симптом будет не «ошибка установки», а тихо не собравшийся бинарь и падение уже в рантайме — самый противный класс поломок.

Что делать. Не ждите, пока npm 12 приедет к вам вместе с обновлением образа Node в CI. Порядок такой: поднимите локально npm@11.16.0 или новее (там появились нужные ворнинги), выполните обычный npm install и прочитайте предупреждения. Затем — npm approve-scripts --allow-scripts-pending: команда покажет, у каких пакетов вообще есть install-скрипты. Пройдитесь по списку руками, одобрите только те, которым доверяете и без которых сборка не работает, и закоммитьте изменившийся package.json — это ваш новый allowlist, и он должен ревьюиться в PR, как любой другой код. Отдельно проверьте, не тянете ли вы что-нибудь из git (форки, внутренние библиотеки по git+ssh) — такие зависимости после апгрейда просто перестанут резолвиться, пока не добавите --allow-git. И зафиксируйте мажорную версию npm в CI явно, а не через latest: сюрприз в пайплайне на релизе — плохое место для знакомства с v12.

Комментарии