GitHub анонсировал набор критических изменений в npm версии 12, главное из которых — отключение выполнения install-скриптов зависимостей по умолчанию. Изменение затрагивает всех разработчиков, использующих Node.js-экосистему: команда npm install больше не будет автоматически запускать скрипты preinstall, install и postinstall из зависимостей без явного одобрения. Релиз npm 12 запланирован на следующий месяц. Для подготовки GitHub рекомендует обновиться до npm 11.16.0 или новее и использовать команду npm approve-scripts для явного одобрения доверенных пакетов.
Что именно меняется
GitHub охарактеризовал скрипты жизненного цикла, выполняемые при установке, как «крупнейшую поверхность выполнения кода во всей экосистеме npm». Проблема в том, что npm install запускает скрипты из каждой транзитивной зависимости — а значит, единственный скомпрометированный пакет в любом месте дерева зависимостей способен выполнить произвольный код на машине разработчика или в среде CI/CD.
npm 12 вводит три ключевых ограничения:
- Блокировка install-скриптов:
npm installне будет выполнять скриптыpreinstall,installиpostinstallиз зависимостей, если они не разрешены явно в конфигурации проекта. - Блокировка Git-зависимостей: прямые и транзитивные Git-зависимости не будут разрешаться без явного указания флага
--allow-git. - Блокировка удалённых
Под блокировку попадают и нативные сборки через node-gyp: пакеты с файлом binding.gyp без явного install-скрипта также будут заблокированы, поскольку npm запускает для них неявную команду node-gyp rebuild. Скрипты prepare из Git-, файловых и символьных зависимостей блокируются аналогично.
Закрытие обхода через .npmrc
Отдельного внимания заслуживает установка значения --allow-git в none по умолчанию. Это закрывает вектор атаки, при котором файл .npmrc внутри Git-зависимости мог переопределить исполняемый файл Git. Примечательно, что этот путь выполнения кода работал даже при использовании флага --ignore-scripts, который до сих пор считался основной мерой защиты от вредоносных скриптов при установке.
Кого это затрагивает
Изменения коснутся практически всей экосистемы Node.js. Наибольшее влияние испытают:
- Проекты с нативными модулями — любые зависимости, использующие node-gyp для компиляции C/C++ аддонов, потребуют явного одобрения.
- CI/CD-пайплайны — автоматизированные сборки, полагающиеся на postinstall-скрипты для настройки окружения, могут сломаться без обновления конфигурации.
- Проекты с Git-зависимостями — монорепозитории и проекты, ссылающиеся на приватные репозитории напрямую, потребуют явного разрешения.
При бездействии обновление до npm 12 приведёт к сбоям установки зависимостей — все неодобренные скрипты просто перестанут выполняться.
Как подготовиться
GitHub рекомендует следующий порядок действий:
- Обновить npm до версии 11.16.0 или новее.
- Выполнить стандартную установку зависимостей и изучить выводимые предупреждения.
- Запустить
npm approve-scripts --allow-scripts-pendingдля просмотра списка пакетов со скриптами. - Одобрить доверенные пакеты и зафиксировать обновлённый
package.jsonв репозитории.
После обновления до npm 12 будут выполняться только явно одобренные скрипты. Всё, что осталось без одобрения, будет заблокировано.
Стоит отметить, что ранее npm уже ввёл настройку min-release-age, позволяющую отклонять версии пакетов, опубликованные менее указанного числа дней назад, — как защиту от свежих вредоносных публикаций. Отключение скриптов по умолчанию в npm 12 — логичное продолжение этой стратегии укрепления безопасности цепочки поставок.
Переход npm на модель явного одобрения скриптов — это фундаментальный сдвиг от «доверия по умолчанию» к «нулевому доверию» в управлении зависимостями. Командам разработки следует начать аудит скриптов зависимостей уже сейчас на npm 11.16.0+, чтобы обновление до npm 12 не привело к неожиданным сбоям в сборочных процессах.