Перейти к содержимому
>_ITDITDПлатформа веб-безопасности

Руководства по безопасности

Черви в цепочке поставок npm: как учётные данные крадут при установке пакета и как защититься

В августе 2026 года ChainDrop меньше чем за четыре часа заразил 444 пакета npm — и они вышли с действительной подписью provenance. Червь собирает учётные данные при установке, а затем украденным токеном GitHub копирует ваши приватные репозитории в публичные. Что действительно останавливает такую атаку.

Опубликовано 2026-08-22 Обновлено 2026-10-04 Последняя проверка 2026-08-22 8 мин чтения

Для кого эта статья: для всех, кто разрабатывает с npm или pnpm, хранит код на GitHub или развёртывает из CI. Она основана на публичных исследованиях компаний и лабораторий и не содержит шагов эксплуатации или образцов.

Что произошло (ChainDrop, август 2026)

  1. 4 августа 2026

    Был взломан аккаунт GitHub мейнтейнера популярных пакетов для кэширования. Атакующий запустил существующие в проектах процессы выпуска релизов в GitHub Actions и опубликовал заражённые версии в npm.
  2. В течение четырёх часов

    Заражены 444 пакета и 2 212 версий, включая пакеты с суммарным числом загрузок более 500 миллионов в неделю.
  3. При установке

    Хуки установки собирали учётные данные npm, GitHub, облаков (AWS/GCP/Azure), ключи SSH, данные Kubernetes и CI/CD — по опубликованному анализу, в том числе короткоживущие токены OIDC, извлечённые из памяти раннеров CI.
  4. Затем

    Украденные учётные данные использовались, чтобы переопубликовать все пакеты, которые жертва могла публиковать (самораспространение), а собранные секреты выгружались в публичные репозитории GitHub, созданные атакующим.
444
заражённых пакетов
2 212
заражённых версий
500 млн+
суммарных загрузок затронутых пакетов в неделю
4 часа
на всё это ушло

Главный вред в этом семействе: ваши приватные репозитории становятся публичными

Черви семейства Shai-Hulud используют украденный токен GitHub, чтобы скопировать приватные репозитории жертвы в публичные — сообщалось об именах, оканчивающихся на -migration. GitHub взломан не был. Токен, снятый с вашего ноутбука или раннера CI, делает это как обычное разрешённое действие с вашими правами. Поэтому «подождать, пока платформа исправит» здесь не защита.

Почему атаку не остановили

Добавление зависимости / установка в CI

↓ preinstall / postinstall запускаются автоматически

Произвольный код на вашей машине или раннере

↓ собираются секреты npm / GitHub / облаков / SSH / CI

Обычные действия с украденными токенами

приватные репозитории копируются в публичные / пакеты переопубликуются для распространения

Хук установки, сбор учётных данных, затем обычные вызовы API. Каждый этап формально является разрешённым поведением.

Что не помогло

  • Подписи и provenance — выданы законно под правами мейнтейнера, поэтому проверка прошла
  • «Это большой популярный пакет» — заражённые были именно такими
  • Только фиксация версий — при чистой установке или следующем обновлении вы всё равно её получите
  • Ожидание исправления от платформы — использовались действительные токены и публичные API

Что помогает

  • Скрипты установки отключены по умолчанию — код не выполняется
  • Пауза перед переходом на новый релиз — вы пропускаете период между публикацией и удалением
  • Короткоживущие токены с узкими правами — ограничивают, что и как долго может сделать украденный токен
  • Ограничение исходящего трафика на раннерах CI — закрывает путь для выгрузки данных

Пять дел на сегодня

1

Проверьте свой lock-файл

Убедитесь, нет ли в нём версий, о заражении которых сообщалось (например, keyv@6.0.0, flat-cache@6.1.24, file-entry-cache@11.1.6). Чистый результат — хорошая новость, но шаги со второго готовят вас к следующей похожей атаке, поэтому продолжайте.

2

Отключите скрипты установки по умолчанию

Переведите CI на npm ci --ignore-scripts; для pnpm задайте ignore-scripts=true в .npmrc и явно разрешите только те зависимости, которым действительно нужна сборка. Это самое ценное изменение, потому что оно убирает этап выполнения кода, на котором держится эта атака.

3

Выжидайте несколько дней после релиза

Не берите релиз в момент выхода — достаточно паузы от 3 до 7 дней. Когда между публикацией и удалением проходят часы или дни, как здесь, одно ожидание уже позволяет атаку пропустить. Если вы используете автоматические PR с обновлениями, заложите эту задержку в их настройки.

Добавлено 5 сентября 2026: это больше не обязано держаться на дисциплине. Официальное руководство по безопасности Node.js среди мер против атак на цепочку поставок называет паузу для зависимостей через --min-release-age (npm v11.10.0+), чтобы не устанавливать недавно опубликованные пакеты. Если это можно сделать настройкой, а не дисциплиной, сделайте настройкой. Процедура, которая зависит от чьей-то памяти, в загруженный день обычно пропускается.

4

Проведите инвентаризацию токенов, сократите срок жизни и права

Замените классические персональные токены GitHub на fine-grained (с детальными правами), сократите срок действия и ограничьте их нужными репозиториями. Не оставляйте токены публикации npm в CI. Обращение с ключами и секретами разобрано в статьях чем опасны .env и API-ключи и минимальные привилегии для SSH-ключей. Цель — чтобы украденный токен мог причинить мало вреда.

5

Проверьте свой аккаунт GitHub

Ищите публичные репозитории, которые вы не создавали (имена на -migration, незнакомые описания), процессы GitHub Actions, которые вы не добавляли, исполняемые настройки в .vscode/tasks.json или .claude/, а также незнакомые API-ключи и SSH-ключи. Об автоматическом отслеживании известных уязвимостей в зависимостях — в статье начало работы с osv-scanner.

Если подозреваете заражение, соблюдайте порядок

Исследователи подчёркивают один момент, который стоит повторить: удалите оставшиеся на машине резидентные компоненты (скрипты, следящие за токенами, и подобное) ДО отзыва токенов. Если сделать наоборот, резидентная часть может отреагировать на отзыв. Примерный порядок:
1. Отключитесь от сети
2. Удалите механизмы закрепления и подозрительные файлы
3. Отзовите и перевыпустите в порядке npm → GitHub → облака → SSH → Kubernetes
4. Удалите node_modules и кэши и выполните чистую переустановку
5. Проверьте свои публичные репозитории и историю публикации пакетов

Если логов нет, ответ — «неизвестно», а не «чисто». Действуйте так, как будто вас взломали.

Взгляд этого сайта: подпись подтверждает происхождение, а не безопасность

Подписи и provenance годами были главной рекомендацией по защите цепочки поставок — и эта кампания их обошла. Это не удивительно: подпись говорит, кто опубликовал пакет, а не то, безопасно ли его содержимое. Действительная подпись со взломанного аккаунта одновременно действительна и опасна. Поэтому мы рассматриваем provenance не как меру, которая делает вас защищёнными, а как инструмент расследования, чтобы оценить масштаб после инцидента. Профилактика держится на двух других вещах: не выполнять чужой код при установке и не оставлять секреты там, где этот код запускается.

Источники

Что прочитать дальше

FAQ

QКак запуск npm install может украсть мои учётные данные?
A

Пакеты могут содержать скрипты, которые выполняются автоматически при установке (preinstall / postinstall). Поэтому добавить зависимость — то же самое, что разрешить этому коду выполняться с вашими правами. Именно так ChainDrop собирал учётные данные npm, GitHub, облаков, SSH и CI/CD.

QЧто значит «приватные репозитории становятся публичными»?
A

Черви этого семейства используют украденный токен GitHub, чтобы скопировать приватные репозитории жертвы в публичные — сообщалось об именах, оканчивающихся на -migration. Сам GitHub взломан не был: токен, взятый с вашего компьютера или из вашего CI, выполняет действие с вашими же правами. Поэтому ожидание исправления со стороны платформы вас не защитит.

QРазве подписанные пакеты с provenance не безопасны?
A

Именно эту защиту здесь и обошли. Атакующий с правами мейнтейнера запустил существующий процесс выпуска релизов проекта, и заражённые версии вышли с действительной подписью provenance. Подпись подтверждает, кто опубликовал пакет, а не то, что его содержимое безопасно. Действительная подпись со взломанного аккаунта остаётся действительной.

QЧто самое полезное можно сделать уже сегодня?
A

Две вещи: отключить скрипты установки по умолчанию (npm ci --ignore-scripts или ignore-scripts=true для pnpm) и не брать новые релизы сразу — подождать несколько дней. Первое вообще не даёт коду выполниться; второе позволяет пропустить самый опасный период — часы или дни между публикацией и удалением.