Кратко / Главное
- В течение многих лет одна команда `npm install` могла спровоцировать атаки на цепочку поставок на вашей машине.
- NPM 12 наконец-то захлопывает эту дверь, по умолчанию отключая автоматическое выполнение скриптов.
Конец вседозволенности в выполнении кода
`npm 12` наконец-то захлопывает дверь в «дикий запад» установки пакетов, завершая опасную эру, когда `npm install` одновременно служил для бесконтрольного и скрытого выполнения кода. В течение многих лет скрипты `pre-install` и `post-install`, наряду с их аналогами `install`, автоматически запускались для каждой зависимости, превращая рутинную задачу в основной вектор для коварных атак на цепочку поставок. Такое поведение по умолчанию превращало простую загрузку пакета в игру с высокими ставками.
Модель неявного доверия лежала в основе всей экосистемы JavaScript, позволяя любому пакету выполнять произвольный код во время установки без явного согласия пользователя. Злоумышленники мастерски использовали это слабое место. Самораспространяющийся червь Shai-Hulud, например, скомпрометировал сотни пакетов для эксфильтрации учетных данных и автономного распространения, в то время как его вариант «Mini Shai-Hulud» от мая 2026 года нацелился на известные проекты, такие как `TanStack`, используя `GitHub Actions`.
Сообщество годами обсуждало эту критическую уязвимость, находясь между насущными потребностями в безопасности и огромной проблемой поддержания обратной совместимости в обширной, зависящей от скриптов экосистеме. Теперь `npm 12` разрубает этот Гордиев узел. Он отключает автоматическое выполнение скриптов по умолчанию, принуждая к явному процессу одобрения через `npm approve-scripts`. Этот давно назревший переход от неявного доверия к явному разрешению наконец-то ставит безопасность на первое место, открывая более безопасное, хотя и немного менее удобное, будущее.
Ваш новый привратник: `npm approve-scripts`
`npm install` в версии 12 больше не выполняет слепо произвольный код из ваших зависимостей. Дни, когда скрипты `pre-install`, `install` и `post-install` запускались по умолчанию, окончательно прошли, положив конец критическому вектору для атак на цепочку поставок, таких как Shai-Hulud и недавние компрометации TanStack. Эта всеобъемлющая блокировка распространяется даже на необходимые нативные сборки `node-gyp` и скрипты `prepare`, полученные из `Git`, файловых или ссылочных зависимостей, эффективно нейтрализуя любое неожиданное выполнение кода до его начала.
Встречайте `npm approve-scripts`, вашего нового привратника. Эта команда вводит явный, поддающийся аудиту рабочий процесс, позволяющий разработчикам просматривать каждый скрипт и выборочно включать только те, которым они действительно доверяют. После одобрения `npm` сохраняет эти разрешения непосредственно в вашем файле `package.json`, создавая прозрачную, версионируемую запись разрешенного кода, который выполняется во время установки. Это заменяет предыдущую опасную автоматизацию обдуманным, информированным согласием.
Это не просто новая команда; это глубокий философский сдвиг для всей экосистемы JavaScript. `npm` решительно переходит от модели неявного доверия – где любая зависимость могла запускать что угодно – к модели явного разрешения. Разработчики вновь получают абсолютный, детальный контроль над тем, какой именно код выполняется на их машинах, превращая `npm install` из потенциальной угрозы в преднамеренную, безопасную операцию. Скриптопокалипсис заканчивается не тихим стоном, а твердым, поддающимся аудиту «Нет».
Блокировка дополнительных векторов атаки
В то время как скрипты `pre-install` и `post-install` были наиболее заметными векторами для атак на цепочку поставок, проницательные противники никогда не клали все яйца в одну корзину. Они также использовали менее очевидные пути, такие как прямые Git dependencies и удаленные URL-тарболы, чтобы внедрять вредоносный код в ничего не подозревающие проекты. Злоумышленники широко использовали эти методы в инцидентах, таких как вариант Mini Shai-Hulud, который нацеливался на пакеты в пространстве имен TanStack, часто внедряя вредоносные файлы `.npmrc` через эти косвенные маршруты.
npm 12 захлопывает эти второстепенные двери простым, явным требованием. Разработчики теперь должны использовать `--allow-git` для разрешения зависимостей на основе Git и `--allow-remote` при установке пакетов из тарболов на основе URL. Это не просто неудобство; это критическая точка трения, призванная заставить принимать осознанные решения, устраняя неявное доверие к внешним источникам и значительно сужая поверхность атаки.
Никто не сможет сослаться на незнание, когда npm 12 выйдет в июле; предупреждения об этих breaking changes активны с npm v11.16.0+. Этот льготный период предоставляет командам широкие возможности для аудита своих конвейеров сборки и обновления объявлений зависимостей, избегая внезапных сбоев. Для получения более подробной информации о предстоящих изменениях ознакомьтесь с Upcoming breaking changes for npm v12 - GitHub Changelog.
Необходимый шаг, но достаточно ли его?
Наконец, npm признает реальность. Бесконтрольное выполнение скриптов, основной вектор атак на цепочку поставок, заканчивается с npm 12 после многих лет повсеместной эксплуатации. Этот давно назревший переход к явному одобрению скриптов, наконец-то догоняющий более заботящиеся о безопасности альтернативы, превращает `npm install` из наивного упражнения на доверие в охраняемую операцию. Это необходимая эволюция, хотя она и наступит в июле 2026 года, спустя годы после того, как прозвучали первые тревожные сигналы.
Даже с этими долгожданными изменениями битва за целостность цепочки поставок продолжается. Многие эксперты по безопасности, включая меня, просто выступают за pnpm, который может похвастаться превосходными настройками по умолчанию, такими как блокировка экзотических подзависимостей и задержка принятия новых пакетов. Проактивная позиция pnpm, которая давно отстаивает более ограничительную, безопасную позицию из коробки, предлагает убедительную альтернативу для проектов, требующих немедленной, надежной защиты.
Эти обновления значительно сужают поверхность атаки, сокращая векторы скриптов `pre-install` и `post-install`, которые подпитывали инциденты, такие как Shai-Hulud и компрометация TanStack. Явная блокировка Git dependencies и удаленных тарболов дополнительно закрывает хорошо известные пути атаки. Однако злоумышленники неустанно адаптируются. Ожидайте перехода к другим уязвимостям, возможно, к эксплуатации вредоносных файлов `.npmrc`, неправильных конфигураций CI/CD или сложной социальной инженерии. Бдительность разработчиков, тщательная проверка каждой зависимости и процесса сборки, остается конечным, незаменимым брандмауэром в этом развивающемся ландшафте угроз.
Часто задаваемые вопросы
Каково самое большое изменение в NPM 12?
Самое значительное изменение заключается в том, что `npm install` больше не будет автоматически запускать скрипты pre-install, install или post-install для зависимостей. Теперь пользователи должны явно одобрять их.
Как запускать скрипты для доверенных зависимостей в NPM 12?
Вам нужно использовать новую команду `npm approve-scripts`. Она предложит вам одобрить скрипты из ваших зависимостей, и ваш выбор будет сохранен в вашем package.json.
Почему NPM вносит эти изменения в безопасность сейчас?
Эти изменения являются прямым ответом на волну изощренных атак на цепочки поставок, таких как червь Shai-Hulud, которые использовали автоматическое выполнение скриптов для кражи учетных данных и распространения вредоносного ПО.
Другие менеджеры пакетов, такие как PNPM или Yarn, уже настолько безопасны?
Да, другие менеджеры пакетов, такие как PNPM и Yarn, уже некоторое время реализуют аналогичное поведение по умолчанию в области безопасности, например, блокировку автоматических скриптов установки.
