Mastodon Mastodon Mastodon Mastodon

Самораспространяющийся червь в npm: как компрометация Keyv затронула сотни пакетов

Фото автора

CyberSecureFox Editorial Team

Опубликовано:

4 августа 2026 года в экосистеме npm зафиксирована масштабная атака на цепочку поставок: вредоносный код, впервые обнаруженный в [email protected], распространился за пределы пространств имён Keyv и Cacheable, затронув сотни пакетов множества организаций. Вредонос использует механизм preinstall-скриптов для кражи учётных данных из сред разработки и CI/CD, а затем автоматически переиздаёт заражённые версии других пакетов, доступных через украденные npm-токены. Любая система, выполнившая заражённую версию, должна рассматриваться как скомпрометированная — при этом перед ротацией токенов необходимо сначала удалить установленный вредоносом наблюдатель за отзывом учётных данных, иначе ротация сама запустит обработчик атакующего.

Масштаб кампании и расхождения в оценках

Оценки масштаба заражения существенно различаются между исследовательскими группами. По данным SafeDep, верифицировано 353 вредоносных версии в 79 пакетах реестра npm, а мониторинг зафиксировал более широкий охват — 442 версии в 353 пакетах. Aikido сообщает о как минимум 868 пакетах и 1 381 заражённой версии. Ни одна из расширенных оценок не была воспроизведена независимо на основе полного публичного списка на момент подготовки материала.

Принципиально важно: все эти числа описывают количество вредоносных артефактов в реестре, а не число скомпрометированных систем. Фактическое заражение рабочей станции или CI-раннера зависит от того, была ли разрешена конкретная заражённая версия в зависимостях проекта и выполнился ли её lifecycle-скрипт.

Техническая анатомия атаки

Первичный вектор: npm-пакет

Первой подтверждённой вредоносной версией стала [email protected]. В package.json была добавлена команда node setup.mjs в качестве preinstall-хука, а в пакет включены файлы setup.mjs и Math_Symbol.js. Скомпилированный код библиотеки при этом остался без изменений — функциональность пакета не нарушалась, что затрудняло обнаружение.

По данным SafeDep, первая стадия проверяет наличие среды выполнения Bun, при необходимости загружает версию 1.3.13 с официальных GitHub-релизов, после чего передаёт управление скомпилированному бандлу размером 727 680 байт. Этот бандл собирает широкий спектр секретов:

  • Токены GitHub и npm
  • Учётные данные облачных сервисов
  • Секреты HashiCorp Vault и Kubernetes
  • Данные подключения к базам данных
  • Приватные ключи
  • Содержимое памяти раннеров GitHub Actions

Socket независимо подтвердил наличие в коде функций модификации, версионирования и переиздания пакетов от имени украденной npm-идентичности — именно этот механизм обеспечивает червеобразное распространение.

Второй вектор: хуки в репозитории

Помимо npm-пакета, в репозитории Keyv обнаружен альтернативный путь выполнения вредоносного кода. Файл .claude/settings.json содержит хук SessionStart, вызывающий .vscode/setup.mjs. Файл .vscode/tasks.json содержит задачу «Environment Setup» с параметром runOn: folderOpen, вызывающую .claude/setup.mjs. Коммит, внедривший эти хуки, имел зелёный значок верификации GitHub и был подписан от имени github-actions[bot]. Верифицированная подпись подтверждает лишь валидность криптографической операции, но не идентифицирует того, кто контролировал учётные данные.

Эти хуки не выполняются безусловно. VS Code блокирует автоматические задачи в недоверенных рабочих пространствах и запрашивает подтверждение по умолчанию. Claude Code применяет механизм доверия к настройкам, поставляемым из репозитория. Однако разработчик, привычно одобряющий доверие к проекту, активирует выполнение вредоносного кода.

На 17:40 IST 4 августа оба файла хуков оставались в ветке main, а core/keyv/package.json по-прежнему объявлял версию 6.0.0 с вредоносным preinstall-скриптом.

Обход механизмов доверия

Заражённый релиз Keyv прошёл через легитимный рабочий процесс GitHub Actions и получил валидную аттестацию OpenID Connect (OIDC) и SLSA (Supply-chain Levels for Software Artifacts). Аттестация корректно идентифицировала процесс сборки, но не могла установить, что исходный код, поступивший в этот процесс, был безопасным. Это демонстрирует фундаментальное ограничение: провенанс и подписи верифицируют путь сборки, но не содержание того, что было собрано.

Связь с предыдущими атаками

Semgrep задокументировал идентичные хуки Claude Code и VS Code, имя файла setup.mjs и загрузку Bun 1.3.13 в апрельской компрометации пакета lightning в PyPI. Aikido относит августовскую активность к семейству вредоносного ПО Shai-Hulud. Совпадение артефактов подтверждает связь на уровне семейства вредоносов, однако не устанавливает, кто стоит за августовской кампанией — ни начальный вектор доступа, ни конкретный актор не идентифицированы.

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

Оценка воздействия

Под угрозой находятся все команды и организации, использующие Keyv, Cacheable и связанные пакеты в своих проектах. Keyv — популярная библиотека для унифицированного доступа к хранилищам данных, широко применяемая в Node.js-экосистеме. Компрометация затрагивает не только конечные приложения, но и CI/CD-конвейеры, где lifecycle-скрипты выполняются автоматически.

Не все пакеты, связанные с оригинальным мейнтейнером, были заражены. По данным SafeDep, опубликованные адаптеры @keyv/* и линейка Keyv 5.x оставались чистыми. Однако репозиторий представляет отдельный риск: последующий коммит разместил вредоносные файлы во всех 19 пакетах рабочего пространства, поэтому любой релиз, собранный из заражённого дерева, будет содержать вредоносный код.

Рекомендации по реагированию

  1. Проверьте lockfile-файлы (package-lock.json, yarn.lock, pnpm-lock.yaml) на наличие точных версий из заражённого набора. Не полагайтесь на текущие теги latest — они менялись в ходе инцидента. На момент наблюдения для ряда пакетов, включая [email protected], [email protected] и [email protected], были восстановлены безопасные версии.
  2. Если заражённая версия была установлена и выполнена — считайте все учётные данные на машине скомпрометированными.
  3. Перед ротацией токенов обязательно найдите и удалите наблюдатель за отзывом учётных данных, установленный вредоносом. Ротация без удаления наблюдателя может запустить обработчик атакующего.
  4. Обновите npm-клиент до версии 12, которая блокирует неодобренные lifecycle-скрипты зависимостей по умолчанию. Более ранние версии npm и альтернативные пути установки, допускающие lifecycle-скрипты, остаются уязвимыми.
  5. Не используйте блокировку по пространству имён как единственную меру — это создаёт риск как пропуска заражённых версий, так и ложного блокирования чистых релизов.
  6. Проверьте клоны репозитория Keyv на наличие файлов .claude/settings.json и .vscode/tasks.json с вредоносными хуками. Не одобряйте доверие к рабочему пространству до очистки репозитория.

На момент подготовки материала ни мейнтейнер проекта, ни npm, ни GitHub не выпустили официального заявления об инциденте. Организациям, использующим затронутые пакеты, следует немедленно провести аудит зависимостей по точным версиям из lockfile-файлов, удалить наблюдатель вредоноса перед любой ротацией секретов и перейти на npm 12 для защиты от выполнения неодобренных скриптов зависимостей — именно этот механизм был ключевым вектором распространения червя.


CyberSecureFox Editorial Team

Редакция CyberSecureFox освещает новости кибербезопасности, уязвимости, malware-кампании, ransomware-активность, AI security, cloud security и security advisories вендоров. Материалы готовятся на основе official advisories, данных CVE/NVD, уведомлений CISA, публикаций вендоров и открытых отчётов исследователей. Статьи проверяются перед публикацией и обновляются при появлении новых данных.

Оставьте комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.