После обычного npm install сборка начала падать, в package-lock.json появились неожиданные изменения или сайт после релиза ведёт себя иначе — это наблюдаемый симптом, а не готовый диагноз. Причиной может быть обычная несовместимость, смена настроек npm, ошибка CI/CD или скомпрометированная зависимость. Для бизнеса важен один и тот же результат: релиз нельзя считать безопасным, пока команда не восстановила понятную цепочку от исходного кода до production-артефакта.
28 июля 2026 года GitHub собрал в одном обзоре меры против атак на npm и GitHub Actions: защиту workflow, staged publishing, новые правила установки npm, задержку обычных обновлений Dependabot и инструменты реагирования на утечку учётных данных. Эти изменения полезны, но не доказывают компрометацию конкретного проекта и не заменяют техническое расследование.
Если после обновления зависимостей появились неизвестные файлы, новые сетевые обращения, ошибки сборки или неожиданные изменения интерфейса, не продолжайте повторные выкладки «на удачу». Сначала зафиксируйте состояние, ограничьте распространение изменений и сохраните данные для диагностики.
Что изменилось в npm и GitHub Actions летом 2026 года
В npm v12 install-time защита стала поведением по умолчанию. Скрипты жизненного цикла зависимостей, включая preinstall, install и postinstall, больше не должны запускаться автоматически без явного разрешения; Git-зависимости и пакеты по удалённым URL также требуют разрешения. Это делает неявный код заметнее, но старый проект может перестать собираться, если он годами полагался на native-сборку или нестандартный источник.
npm также начал автоматически проверять новые пакеты до того, как они становятся доступными для установки. Публикация может пройти, попасть на ручную проверку или быть заблокирована. Автоматизации, которые сразу после публикации пытаются установить новую версию, должны учитывать промежуточное состояние, а не считать любую задержку аварией.
Для обычных version updates Dependabot ввёл стандартный cooldown: pull request появляется после того, как релиз пробыл в registry не менее трёх дней. Security updates при этом не задерживаются. Пауза снижает риск мгновенно принять сломанную или вредоносную версию, но не гарантирует, что проблема будет обнаружена за это время.
Staged publishing отделяет подготовку пакета от его фактического выпуска. CI может собрать версию, но публикация завершается только после дополнительного подтверждения с 2FA. Это уменьшает ценность украденного publish-токена, однако не защищает приложение от уже разрешённого вредоносного скрипта, небезопасного workflow или секрета с избыточными правами.
Кому это актуально
Проверка нужна не только владельцам публичных npm-пакетов. В зоне внимания находятся:
- сайты и API на Node.js, Next.js, React или Vue;
- PHP-, Python- и Java-проекты, где фронтенд собирается через npm;
- интернет-магазины, личные кабинеты и CRM с общей библиотекой компонентов;
- мобильные приложения, которые используют общий JavaScript SDK или backend;
- проекты с GitHub Actions, self-hosted runners, приватным registry или несколькими подрядчиками;
- legacy-репозитории, где никто не может объяснить все строки в
package.jsonи workflow.
Особенно важен аудит, если сборка выполняется с доступом к production-секретам, платёжным интеграциям, CRM, облачному хранилищу или ключам деплоя. Тогда проблема в зависимости может затронуть не только код сайта, но и соседние системы.
Какие риски закрывает проверка
Первый риск — выпуск неподтверждённого артефакта. Один и тот же commit может дать разный результат, если версия Node.js или npm не закреплена, lock-файл изменился, пакет загружается по URL либо postinstall-скрипт получает доступ к сети.
Второй риск — утечка секретов из CI/CD. Workflow может иметь права на репозиторий, registry, сервер, облако и уведомления. Если недоверенный код запускается в таком окружении, простая переустановка пакета не отменяет уже выданные токены.
Третий риск — поспешное восстановление. Удаление node_modules, очистка runner или повторный деплой до фиксации логов уничтожают часть следов. Команда получает работающий сайт, но не понимает, что именно произошло и нужно ли менять доступы.
Четвёртый риск — остановка релизов после перехода на npm v12. Новые безопасные настройки могут выявить законные install-скрипты и Git-зависимости, без которых старый проект не собирается. Их нельзя разрешать все одной настройкой: каждое исключение должно иметь владельца, причину и проверяемую версию.
Что собрать до начала диагностики
Владельцу проекта не обязательно самостоятельно искать вредоносный код. Полезнее быстро собрать воспроизводимый контекст:
- Время последней успешной сборки и первого проблемного релиза.
- Commit, pull request и diff файлов
package.json,package-lock.json, workspace-конфигурации и workflow. - Точные версии Node.js, npm, runner и базового Docker-образа.
- Логи установки, тестов, сборки и деплоя без публикации секретных значений.
- Список новых или обновлённых зависимостей и источник каждой из них: registry, Git, URL, файл или директория.
- Хеш или сохранённую копию подозрительного артефакта, если политика компании это допускает.
- Перечень секретов, доступных workflow, и время их последней ротации.
- Бизнес-сценарии, которые изменились: вход, форма, каталог, оплата, заказ, CRM, API или административная часть.
Не вставляйте токены, содержимое
.env, cookie, ключи или персональные данные в публичный тикет. Для диагностики достаточно назвать тип доступа, его область и время использования; сами секреты передают только через согласованный защищённый канал.
Безопасная последовательность проверки
1. Остановить распространение неизвестного изменения
Поставьте на паузу автоматический production-деплой и публикацию внутренних пакетов. Не удаляйте логи и не перезапускайте все jobs подряд. Если рабочий сайт доступен, не нужно немедленно выключать его без признаков активной атаки: сначала определите, какой контур затронут и есть ли безопасный откат.
2. Сверить манифест, lock-файл и источники
Проверьте, согласовано ли изменение прямых зависимостей с задачей релиза. Затем посмотрите транзитивные версии, integrity, разрешённые install-скрипты и зависимости не из registry. Необычная запись не равна заражению: Git-fork или локальный пакет могут быть законным техническим долгом, но это должно подтверждаться историей проекта.
Отдельно сравните артефакт с последней доверенной сборкой. Важны не только файлы JavaScript, но и server bundle, sourcemaps, статические ресурсы, Docker-слои и конфигурация, которая попала в образ.
3. Проверить GitHub Actions и права
Разделите workflow по уровню доверия. Сборка pull request из внешнего fork не должна получать production-секреты или изменять общий кеш привилегированного релиза. Проверьте используемые actions, закрепление их версий, события запуска, permissions, работу с cache и то, кто может подтвердить production job.
Если есть признаки доступа неизвестного кода к секретам, ротацию выполняют из чистого доверенного окружения. Сначала составляют список зависимых систем и порядок замены, чтобы не превратить защитную меру в одновременный отказ сайта, API, CRM и фоновых задач.
4. Пересобрать в чистом воспроизводимом контуре
После фиксации исходного состояния соберите проект в новом окружении с закреплёнными версиями Node.js и npm. Разрешайте install-скрипты и нестандартные источники адресно. Результат должен совпадать с ожидаемым артефактом и проходить тесты, а не просто завершать команду установки без ошибки.
Перед production-релизом проверьте критичные пользовательские маршруты на staging: авторизацию, формы, поиск, корзину, оплату, создание заказа, webhook и обмен с CRM. Supply-chain инцидент может проявиться не как падение сервера, а как тихое изменение одного сценария.
5. Вернуть управляемый процесс релиза
После устранения причины зафиксируйте версии runtime, правила добавления зависимостей, список разрешённых скриптов, порядок публикации пакетов и владельцев секретов. Для собственных пакетов рассмотрите trusted publishing или staged publishing; для обычных обновлений — cooldown и обязательную ручную проверку изменений lock-файла.
Почему автоматическая защита не заменяет процесс
Сканирование registry видит только то, что умеет распознавать, и не знает архитектуру вашего проекта. Cooldown даёт время для появления сигналов, но не проверяет совместимость с вашей сборкой. Отключённые по умолчанию скрипты уменьшают поверхность атаки, но команда всё равно может разрешить опасное исключение.
Поэтому надёжность строится слоями: минимальные права workflow, короткоживущие учётные данные, проверяемые источники, воспроизводимая сборка, staging, тесты бизнес-сценариев, наблюдаемость и план отката. Один флажок npm не закрывает всю цепочку.
Как это решает OpenStart
OpenStart начинает не с массового обновления пакетов, а с фиксации симптома и границ инцидента. Мы сопоставляем историю изменений, lock-файл, сборочные логи, workflow, права, артефакты и поведение сайта; отделяем несовместимость npm v12 от подозрительной зависимости и от ошибки конкретного релиза.
Если нужно восстановить рабочий контур, подключаем диагностику и восстановление сайта. Для Node.js и Next.js-проектов можно начать с аудита backend, зависимостей и интеграций, а затем перевести обновления и релизы в регулярную поддержку.
Результат диагностики — не обещание «теперь ничего не случится», а проверяемый набор решений: что произошло, какие контуры затронуты, какие доступы заменены, из чего собран новый артефакт, какие сценарии протестированы и какие риски остаются.
Что запросить у подрядчика
До следующего релиза попросите не общую фразу «зависимости обновлены», а конкретные материалы:
- список изменённых прямых и транзитивных зависимостей;
- объяснение каждого разрешённого install-скрипта и нестандартного источника;
- версии Node.js, npm, runner и Docker-образа;
- ссылку на job, где собран проверяемый артефакт;
- перечень тестов бизнес-сценариев и результат staging-проверки;
- схему прав workflow и список систем, доступных из CI/CD;
- план отката и критерии остановки релиза;
- краткий отчёт о ротации доступов, если были признаки компрометации.
FAQ
Любое изменение package-lock.json означает атаку?
Нет. Lock-файл меняется при законном обновлении npm, зависимостей или платформы. Поводом для расследования становится несогласованный diff, неизвестный источник, новый install-скрипт, несовпадение артефакта или изменение поведения сайта.
Нужно ли срочно переходить на npm v12?
Решение зависит от проекта. Новые defaults полезны, но legacy-сборка может требовать подготовки. Сначала проверьте совместимость на отдельной ветке и staging, опишите необходимые исключения и только затем меняйте production-процесс.
Staged publishing защищает сайт от вредоносной зависимости?
Не напрямую. Он снижает риск несанкционированной публикации вашего пакета, но не проверяет весь код приложения и не отменяет аудит входящих зависимостей, workflow и секретов.
Что делать, если токен мог попасть в скомпрометированную job?
Ограничьте дальнейшие запуски, сохраните логи, определите область прав и замените токен из чистого окружения. Проверьте журналы использования и связанные доступы; не публикуйте значение токена в задаче или переписке.
Можно ли проверить только PageSpeed и понять, что релиз безопасен?
Нет. PageSpeed помогает оценить скорость страницы, но не показывает происхождение зависимостей, права CI/CD, утечку секретов и целостность backend или интеграций. Нужна проверка цепочки сборки и критичных бизнес-сценариев.
Официальные источники
- GitHub: Disrupting supply chain attacks on npm and GitHub Actions, 28.07.2026
- GitHub Changelog: npm install-time security and GAT bypass2fa deprecation, 08.07.2026
- GitHub Changelog: npm publish-time malware scanning and dual-use metadata, 28.07.2026