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.
Комментарии