Cover Image for Крупный инцидент с npm: как защитить проекты от supply-chain атак
[npm][JavaScript][Security][SupplyChain][Node.js]
12 августа 2025 г.

Крупный инцидент с npm: как защитить проекты от supply-chain атак

В июле 2025 года экосистема npm столкнулась с одной из крупнейших supply-chain атак в своей истории. Злоумышленники получили доступ к аккаунтам мейнтейнеров популярных пакетов и опубликовали вредоносные версии, которые успели установить миллионы разработчиков.

Что произошло

Список скомпрометированных пакетов:

Как проходила атака:

  1. Фишинг через поддельный домен npnjs.com → мейнтейнеры вводили данные.
  2. Атакующие получали доступ и публиковали вредоносные сборки напрямую в npm.
  3. Вредоносный код маскировался под postinstall-скрипт, который загружал DLL или открывал WebSocket-бэкдор.
  4. Публикации обходили GitHub-репозитории — обычный мониторинг коммитов не помогал.

Суммарный охват — более 180M загрузок в неделю.

Источники:


Как защититься от подобных атак

1. Фиксируйте точные версии

В package.json:

"eslint-config-prettier": "10.1.0"

Вместо:

"eslint-config-prettier": "^10.1.0"

Команда для npm, чтобы по умолчанию записывать точные версии при будущих установках:

npm config set save-exact true

А в .npmrc (в репозитории) можно дополнительно зафиксировать это правило:

save-exact=true

Как быстро зафиксировать версии во всех зависимостях проекта

Если в package.json у вас уже указаны версии с ^ или ~, можно быстро убрать их и зафиксировать точные номера.

Для npm:

npx npm-check-updates -f "/.*/" --removeRange --upgrade
  • npm-check-updates — утилита для работы с версиями зависимостей.
  • Параметр --removeRange удалит ^ и ~ из всех записей.

npm-check-updates вообще не смотрит на package-lock.json. Он работает только с твоим package.json, подменяя в нём версии зависимостей на самые свежие из npm (с учётом фильтров и ограничений, если ты их задаёшь). Если ты хранишь свой вот package-lock.json в репозитории. То безопаснее будет фиксировать версии прямо из package-lock. Вот рабочий Node.js-скрипт, который берёт точные версии всех пакетов из package-lock.json и проставляет их в package.json без ^ и ~.

2. Используйте lock-файлы

Храните package-lock.json в репозитории. Это фиксирует все зависимости, включая вложенные.

3. Настройте аудит зависимостей

  • npm audit

4. Минимизируйте postinstall-скрипты

Избегайте зависимостей, которые выполняют код при установке, если в этом нет критической необходимости.

5. Включите 2FA для npm-аккаунта

Это усложнит захват даже при утечке пароля.

6. Проверяйте письма и домены

Не переходите по ссылкам из “официальных” писем, пока не проверите адрес. Разница между npmjs.com и npnjs.com — всего одна буква.


Вывод

Supply-chain атаки становятся всё более частыми, и даже популярный пакет с многолетней историей может быть взломан. Минимизация автоматических обновлений, контроль зависимостей и бдительность — ключевые шаги для защиты ваших проектов.

Читать далее

Присоединяйтесь к нашему сообществу