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 не призвело до неочікуваних збоїв у процесах збирання.