Крупный инцидент с npm: как защитить проекты от supply-chain атак
В июле 2025 года экосистема npm столкнулась с одной из крупнейших supply-chain атак в своей истории. Злоумышленники получили доступ к аккаунтам мейнтейнеров популярных пакетов и опубликовали вредоносные версии, которые успели установить миллионы разработчиков.
Что произошло
Список скомпрометированных пакетов:
eslint-config-prettier— 30M+ загрузок/нед. Вредоносные версии: 8.10.1, 9.1.1, 10.1.6, 10.1.7eslint-plugin-prettiersynckit@pkgr/corenapi-postinstallis— 2.8M загрузок/нед., вредоносные версии: 3.3.1–5.0.0
Как проходила атака:
- Фишинг через поддельный домен
npnjs.com→ мейнтейнеры вводили данные. - Атакующие получали доступ и публиковали вредоносные сборки напрямую в npm.
- Вредоносный код маскировался под
postinstall-скрипт, который загружал DLL или открывал WebSocket-бэкдор. - Публикации обходили 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 атаки становятся всё более частыми, и даже популярный пакет с многолетней историей может быть взломан. Минимизация автоматических обновлений, контроль зависимостей и бдительность — ключевые шаги для защиты ваших проектов.
Читать далее
- 12 февраля 2026 г.

Редизайн сайта в эпоху AI и конец привычного SEO
История очередного редизайна моего сайта, GSAP-анимации и почему в эпоху AI дизайн больше не приносит трафик из поиска.
- 9 января 2026 г.

Отчёт о трафике: Декабрь 2025 – Январь 2026
Трафик сайта за последние 30 дней — краткий отчёт и наблюдения.
