Новая атака на npm: вредоносные пакеты перехватывают команды популярных инструментов Google

Атака на цепочку поставок NPM

В реестре npm 12 августа 2026 года зафиксирована вредоносная кампания, в рамках которой злоумышленник опубликовал 21 пакет. Их особенность - в том, что они не подделывают имена существующих пакетов, а используют пробел в экосистеме: перехватывают имена исполняемых команд (бинарников), которые объявляют легитимные пакеты с пространством имён (scope). В результате при установке таких "пустышек" на компьютер жертвы или в сборочную среду они выполняют вредоносный код. Через несколько часов все пакеты были удалены, но сама техника остаётся актуальной.

Описание

Механика атаки связана с тем, как npm обрабатывает поле bin в описании пакета. Когда разработчик публикует пакет с областью видимости, например @angular/service-worker, он указывает, что после установки становится доступна команда ngsw-config. Однако само имя ngsw-config не содержит приставки и не зарезервировано за этим пакетом. Любой желающий может зарегистрировать одноимённый пакет. Поскольку имя бинарника не защищено скоупом, возникает конфликт имён, которым пользуется атакующий.

Как показало исследование, ни одна из стандартных мер защиты от подмены зависимостей не закрывает эту лазейку. Ограничение публикации внутри корпоративного пространства имён не помогает, потому что бинарное имя всё равно оказывается вне этого пространства. Списки разрешённых реестров и фиксация версий в файлах блокировки зависимостей также не учитывают имена команд. Единственный способ избежать перехвата - заранее занять все потенциально опасные имена в публичном реестре.

Каждый из вредоносных пакетов содержал файл описания с автоматически запускаемым скриптом. При установке пакета скрипт собирал минимальные данные о системе: имя хоста, тип платформы, архитектуру процессора и версию Node.js. Затем эти данные отправлялись на управляющий сервер, поддомен которого был уникален для каждого пакета. Никаких паролей, файлов или переменных окружения похищено не было. Такое поведение характерно для доказательства концепции атаки: злоумышленник подтверждает, что пакет действительно устанавливается в целевых средах.

Разведка проводилась системно. Большинство имён (18 из 21) нашлись в метаданных публичных пакетов npm с областью видимости, принадлежащих Google. Остальные три имени не имели соответствующих публикаций в реестре, но встречались в исходном коде репозиториев Google на GitHub и в поисковике кода Sourcegraph. Это говорит о том, что атакующий искал имена не только среди выложенных пакетов, но и в ещё не опубликованных проектах, что расширяет поверхность атаки.

Публикация прошла в две волны.

  1. Сначала в 13:23 UTC появились два пакета с версией 3.2.1, которая соответствовала реальным версиям легитимных инструментов, но была подделана: в официальной линейке такой версии не существовало.
  2. Спустя четыре часа, в 16:57, были опубликованы остальные 19 пакетов с версией 1.0.0.

В 17:22 все 21 пакет были удалены в алфавитном порядке в течение 32 секунд, что указывает на использование автоматизированного скрипта. Пауза между волнами, вероятно, нужна была для проверки получения сигналов с установленных пакетов.

Подобные техники уже описывались ранее: в 2024 году исследователи обращали внимание на возможность перехвата команд при запуске через npx, а в 2025 году на конференции DEF CON была представлена формализация "npx-путаницы". Отличие новой кампании в том, что атака нацелена не на отдельного разработчика, который вручную вызывает команду, а на автоматические процессы установки зависимостей. Если внутренняя сборочная система ссылается на имя ngsw-config как на самостоятельную зависимость, публичный вредоносный пакет будет установлен раньше, чем легитимный, и получит контроль над средой.

Для защиты организациям, публикующим пакеты с областью видимости, рекомендуется провести аудит всех объявленных бинарных имён и проверить, не заняты ли они в публичном реестре. Незанятые имена следует регистрировать как пакеты-заглушки, чтобы злоумышленники не могли ими воспользоваться. Дополнительно стоит обратить внимание на необычные версии в файлах блокировки зависимостей и появление пакетов, которые не были явно запрошены разработчиками. Проверка того, какие команды становятся доступны после установки, также поможет выявить подозрительные добавления.

Индикаторы компрометации

Packag

  • bazelisk 1.0.0
  • broadcast-graphics-mcp 1.0.0
  • chromecast-webdriver-cli 1.0.0
  • chrome-enterprise-premium-mcp 1.0.0
  • chromeos-webdriver-cli 1.0.0
  • code-assist-mcp 1.0.0
  • gaarf 3.2.1
  • gaarf-bq 1.0.0
  • gaarf-node 1.0.0
  • gaarf-node-bq 1.0.0
  • gemini-cli-a2a-server 1.0.0
  • github-policy-bot 1.0.0
  • karma-proxy 1.0.0
  • localize-extract 1.0.0
  • localize-translate 1.0.0
  • ngsw-config 1.0.0
  • tfjs-inference 1.0.0
  • tizen-webdriver-cli 1.0.0
  • upload-to-gcp 3.2.1
  • wct-st 1.0.0
  • xbox-one-webdriver-cli 1.0.0

npm publisher

rootdaddy-msrc (ayyitscompton@gmail.com)

C2 domain

*.instances.poc.jchunt.top (wildcard DNS, resolves to 152.53.138.110)

C2 apex

jchunt.top (behind Cloudflare at 104.21.61.226, 172.67.216.7)

Payload

postinstall.js sends system fingerprint (hostname, platform, architecture, Node version) via HTTPS POST

Комментарии: 0