npm Install Scripts Opt-In: RFC по безопасности — что изменится
Безопасность npm · Май 2026

npm Install Scripts Opt-In RFC:
Конец самой опасной настройки npm по умолчанию

Инженер GitHub Джейми Маги предлагает сделать скрипты установки opt-in по умолчанию — самое важное изменение безопасности npm за последние годы. Как это повлияет на каждого JavaScript-разработчика, что делать сегодня и руководство по миграции для авторов пакетов.

Олег Максимов 24 мая 2026 12 мин чтения

Что предлагает RFC

15 мая 2026 года инженер GitHub Джейми Маги (Jamie Magee) опубликовал RFC, предлагающий фундаментальное изменение в том, как npm обрабатывает скрипты установки (preinstall, install, postinstall, prepare). Суть проста: вместо автоматического выполнения скриптов зависимостей, npm должен требовать явного согласия разработчика.

RFC был опубликован в JavaScript Weekly Issue 786 (19 мая 2026) и Node Weekly Issue 625 (21 мая 2026), где его назвали давно назревшим улучшением безопасности для экосистемы npm. Предложение напрямую решает проблему, которая делает npm аутсайдером: это единственный крупный менеджер пакетов, запускающий скрипты зависимостей по умолчанию.

Согласно предложению, при запуске npm install <package>, если у пакета есть скрипты установки, npm будет либо:

Точный UX-механизм ещё обсуждается, но направление ясно: нулевое доверие по умолчанию для скриптов установки.

Почему это важно: поверхность атаки скриптов установки

Скрипты установки — основной вектор атак на цепочку поставок npm. Когда вы запускаете npm install, любой пакет в дереве зависимостей может выполнить произвольный код через скрипты жизненного цикла — до того, как исходный код пакета будет полностью установлен. Это не теоретическая проблема.

Пример Mini Shai-Hulud

Червь Mini Shai-Hulud (апрель–май 2026) скомпрометировал более 170 npm-пакетов в экосистемах TanStack, Mistral AI, UiPath и других, внедряя код для кражи учётных данных через хуки preinstall. Атака сработала потому, что npm запускал эти скрипты автоматически — без подтверждения пользователя, предупреждения или аудита.

Вредоносное ПО использовало хук preinstall для загрузки и выполнения нагрузки на базе Bun, которая похищала токены GitHub, учётные данные npm, облачные ключи и секреты CI/CD. Затем украденные данные использовались для публикации скомпрометированных версий других пакетов, создавая червеобразную цепочку распространения. Весь вектор атаки зависел от поведения npm по умолчанию — запускать скрипты без вопросов.

Масштаб проблемы

Атаки через скрипты установки — не редкость. Исследователи безопасности задокументировали сотни случаев, когда вредоносные пакеты использовали хуки postinstall или preinstall для:

🔑 Исследование команды безопасности npm (2024)

Более 60% вредоносных npm-пакетов использовали скрипты установки как вектор выполнения. Переход на opt-in предотвратил бы большинство атак на цепочку поставок npm за последние три года.

Как другие менеджеры пакетов обрабатывают скрипты

npm — аутсайдер. Все остальные крупные менеджеры пакетов относятся к скриптам установки с подозрением:

Менеджер пакетов Скрипты по умолчанию? Механизм opt-in
npm (текущий) Да — всегда --ignore-scripts или .npmrc ignore-scripts=true
npm (RFC) Нет — требуется opt-in allowedScripts или --allow-scripts
pnpm Нет — заблокированы pnpm allow-scripts или allowedScripts
Yarn Classic Да (устаревшее поведение) yarn install --ignore-scripts
Yarn Berry (v2+) Требует настройки dependenciesMeta с built: false
Deno Нет — скрипты не запускаются Н/Д — плоские URL, нет lifecycle hooks
Bun По умолчанию (npm-совместимость) Поддерживает --ignore-scripts

Вывод очевиден: pnpm уже использует тот же механизм, который предлагает npm, и это не сломало экосистему. Deno и Berry доказывают, что другая модель жизнеспособна. Предложение npm наконец-то приводит его в соответствие с остальной экосистемой.

Что делать разработчикам ПРЯМО СЕЙЧАС

Ещё до внедрения RFC (а RFC в npm исторически занимают от месяцев до лет) есть конкретные шаги, которые стоит предпринять сегодня.

1. Установите ignore-scripts=true в .npmrc

Это единственная самая эффективная мера безопасности:

# ~/.npmrc или .npmrc в корне проекта
ignore-scripts=true

С этой настройкой npm будет загружать пакеты, но не выполнять скрипты установки. Затем можно выборочно разрешать скрипты для доверенных пакетов:

# Установка с выполнением скриптов для конкретного пакета
npm install some-package --ignore-scripts=false

2. Проверьте зависимости на скрипты установки

Возможно, у вас уже есть пакеты, полагающиеся на скрипты установки. Найдите их:

# Список всех пакетов со скриптами жизненного цикла
npx npm-query-lifecycle-scripts

# Или вручную через package.json
find node_modules -name "package.json" -exec grep -l '"postinstall"\|"preinstall"\|"prepare"' {} \;

Типичные легитимные случаи использования скриптов установки:

3. Усильте CI/CD пайплайн

В CI/CD всегда используйте строгий режим:

# Лучшая практика CI/CD — не запускать скрипты установки
npm ci --ignore-scripts

# Затем сборка с явными шагами
npm run build

Руководство по миграции для авторов пакетов

Если вы поддерживаете npm-пакет, использующий скрипты установки, RFC влияет на вас напрямую. Когда npm сделает скрипты opt-in, разработчики могут не одобрить ваши скрипты — и пакет сломается молча.

Проверьте свои скрипты установки

Проверьте package.json на наличие скриптов жизненного цикла:

{
  "scripts": {
    "postinstall": "node postinstall.mjs",
    "preinstall": "node setup.mjs",
    "prepare": "husky"
  }
}

Спросите себя: действительно ли этот скрипт должен выполняться при установке? В большинстве случаев ответ — нет.

Мигрируйте на безопасные альтернативы

Текущий паттерн Лучшая альтернатива
postinstall для сборки Переместить в build или prepare (только при публикации)
postinstall для нативных бинарников Использовать optionalDependencies с предварительно собранными пакетами (например, @img/sharp-libvips-linux-x64)
postinstall для генерации кода Требовать явный npm run generate или использовать prepublishOnly
postinstall для сообщений Заменить на раздел в README.md или документировать скрипт setup
prepare для git hooks (husky) Husky v9+ уже требует husky init — явно, а не автоматически
preinstall для проверок совместимости Использовать поле engines с engine-strict

Общий тренд: улучшения безопасности npm в 2026

RFC по скриптам установки — не изолированное событие. 2026 год стал трансформационным для безопасности npm. Экосистема проходит через самое значительное ужесточение безопасности в своей истории.

Staged Publishing (npm 11.15.0)

Анонсированное на той же неделе, что и RFC, новое staged publishing в npm предоставляет период проверки перед публикацией пакетов. Это предотвращает атаки, когда злоумышленники публикуют вредоносные версии, мгновенно доступные миллионам разработчиков.

npm 12.0 Prerelease

Предварительная версия npm 12.0 уже опубликована. Хотя точный список изменений формируется, значительный скачок версии с 11.x указывает на серьёзные breaking changes — возможно, включающие RFC по скриптам установки или его раннюю реализацию.

Script Security GA (февраль 2026)

Функция Script Security npm, предупреждающая о пакетах со скриптами жизненного цикла при установке, стала общедоступной (GA) в феврале 2026. Это был первый шаг на пути к RFC — от предупреждений к блокировке по умолчанию.

Обязательная 2FA для популярных пакетов

npm теперь требует двухфакторную аутентификацию для мейнтейнеров пакетов с высокой загрузкой, закрывая вектор захвата аккаунтов. Это дополняет RFC, решая другую часть поверхности атаки: кто может публиковать, а не что выполняется при установке.

🔧 Быстрая настройка: 30-секундное улучшение безопасности

Если вы ничего не сделаете сегодня, добавьте это в ваш ~/.npmrc: ignore-scripts=true. Затем, когда пакет, которому вы доверяете, требует скрипты, разрешите их явно: npm install --ignore-scripts=false. Это одно изменение блокирует вектор атаки, использованный Mini Shai-Hulud и большинством других атак на цепочку поставок npm.

Для безопасной веб-разработки — обращайтесь

Часто задаваемые вопросы

Что такое RFC npm install scripts opt-in?
Предложенный инженером GitHub Джейми Маги и опубликованный в JavaScript Weekly Issue 786 (19 мая 2026), RFC предлагает изменить поведение npm по умолчанию — скрипты установки (postinstall, preinstall, prepare) должны требовать явного согласия разработчика, а не выполняться автоматически. npm — единственный крупный менеджер пакетов, который запускает скрипты зависимостей по умолчанию.
Почему npm делает скрипты установки opt-in?
Скрипты установки стали основным вектором атак на цепочку поставок npm. Червь Mini Shai-Hulud (май 2026) скомпрометировал более 170 пакетов, внедряя вредоносный код через хуки preinstall. Другие менеджеры пакетов (pnpm, Yarn, Bun, Deno) либо блокируют скрипты по умолчанию, либо требуют явного разрешения. Переход на opt-in закрывает самую опасную поверхность атаки в экосистеме npm.
Как RFC повлияет на существующие npm-пакеты?
Пакеты, использующие скрипты установки для легитимных целей — сборка, компиляция нативных бинарников, пост-установочная настройка — потребуют явного доверия от разработчика. Авторам пакетов рекомендуется мигрировать на хуки жизненного цикла, которые не выполняются при установке (build, prepublishOnly), использовать платформозависимые пакеты или документировать необходимость скрипта с чёткими инструкциями.
Как другие менеджеры пакетов обрабатывают скрипты установки?
pnpm блокирует скрипты по умолчанию — пакеты должны быть в конфигурации allowedScripts. Yarn Classic запускает скрипты (устаревшее поведение), а Yarn Berry (v2+) требует настройки. Deno вообще не поддерживает скрипты жизненного цикла — зависимости загружаются как плоские URL. Bun запускает скрипты (npm-совместимость), но поддерживает --ignore-scripts. npm — единственный крупный менеджер пакетов, запускающий скрипты по умолчанию.
Что делать разработчикам до внедрения RFC?
Установите ignore-scripts=true в .npmrc уже сегодня — это лучшая практика безопасности независимо от судьбы RFC. Проверьте зависимости на использование скриптов установки через npm query или npx npm-query-lifecycle-scripts. В CI/CD всегда используйте npm ci с --ignore-scripts, выборочно разрешая скрипты только для доверенных пакетов. Авторам пакетов стоит начать миграцию на безопасные альтернативы уже сейчас.
Как это связано с атакой Mini Shai-Hulud на npm?
Червь Mini Shai-Hulud (апрель–май 2026) эксплуатировал выполнение скриптов установки по умолчанию для компрометации 170+ пакетов. Вредоносный код внедрялся через хуки preinstall, которые запускались автоматически при npm install, а затем украденные токены использовались для публикации скомпрометированных версий других пакетов. RFC об opt-in — прямой ответ на такие атаки. Читайте наш полный разбор атаки Mini Shai-Hulud на цепочку поставок npm.
Какие альтернативы postinstall существуют?
Для сборки: используйте скрипты build и npm run build. Для нативных бинарников: упаковывайте предварительно собранные бинарники по платформам (паттерн os/optionalDependencies). Для генерации кода: переходите на prepublishOnly. Для уведомлений: замените на заметку в README. Многие пакеты, ранее использовавшие postinstall для компиляции (например, node-sass), уже перешли на предварительно собранные бинарники. Для глубокого погружения в безопасность цепочки поставок читайте разбор утечки GitHub Grafana и атаки TeamPCP через расширение VS Code.

Безопасность начинается с осознания

RFC по скриптам установки npm представляет фундаментальный сдвиг в подходе JavaScript-экосистемы к безопасности. Он признаёт, что поведение по умолчанию, сделавшее npm успешным — автоматическое выполнение скриптов установки — стало его главной слабостью.

Как разработчики, мы доверяли скриптам установки по умолчанию, потому что не было альтернативы. RFC это меняет. Экосистема переходит от "доверять по умолчанию, аудировать в исключениях" к "аудировать по умолчанию, доверять в исключениях". Это правильное направление.

Если вы создаёте веб-приложение и хотите работать с разработчиком, который серьёзно относится к безопасности зависимостей — не как к запоздалой мысли, а как к встроенной практике — свяжитесь со мной. Я full-stack разработчик с более чем 20-летним опытом, и каждый проект я строю с --ignore-scripts, зафиксированными зависимостями, проверками целостности lockfile и автоматическим сканированием безопасности с первого дня.

Контакты

Создадим что-то надёжное

Есть проект? Помогу выбрать безопасный, современный стек технологий и реализовать его. Бесплатная первичная консультация.