Крупная атака на цепочку поставок npm: через взлом учётной записи @antv злоумышленники украли данные миллионов проектов

security

В начале февраля 2026 года специалисты Microsoft выявили масштабную атаку на экосистему пакетного менеджера npm. Злоумышленник скомпрометировал учётную запись одного из мейнтейнеров организации @antv и опубликовал вредоносные версии популярных пакетов для визуализации данных. Последствия затронули библиотеки, которые используют более миллиона разработчиков еженедельно.

Описание

Атаки на цепочки поставок остаются одним из самых опасных векторов в информационной безопасности. В этом случае компрометация произошла внутри популярного opensource-сообщества, что вызвало каскадное заражение зависимостей. Под удар попали не только разработчики, использующие библиотеки @antv напрямую, но и тысячи проектов, которые подключали их опосредованно - через такие пакеты, как echarts-for-react (более миллиона загрузок в неделю). Вредоносная полезная нагрузка (payload) представляла собой обфусцированный JavaScript-файл размером около 499 КБ. Он активировался автоматически во время установки пакета через npm install и был специально нацелен на кражу учётных данных из среды выполнения GitHub Actions.

Согласно данным Microsoft, атака затронула конвейеры непрерывной интеграции и доставки (CI/CD) и облачные рабочие нагрузки по всей экосистеме. Вредоносная нагрузка обладала широким набором возможностей: кража учётных данных на нескольких платформах (GitHub, Amazon Web Services, HashiCorp Vault, npm, Kubernetes, 1Password), извлечение секретов из памяти процесса Runner.Worker на GitHub Actions, повышение привилегий, двухканальная эксфильтрация данных и подделка атрибутов происхождения артефактов (SLSA, стандарт проверки целостности цепочки поставок). Эти возможности указывают на целенаправленную попытку избежать обнаружения и сфокусироваться именно на окружениях CI/CD, где сосредоточены самые ценные токены и ключи доступа.

Организация @antv разрабатывает библиотеки для построения графиков (G2, G6), которые встроены в тысячи панелей управления (dashboard) и приложений. Сначала злоумышленник получил доступ к учётной записи мейнтейнера. Затем были опубликованы вредоносные версии пакетов @antv. Далее заражение распространялось по цепочке зависимостей: echarts-for-react, size-sensor и другие пакеты подхватили вредоносный код. При выполнении npm install срабатывал предустановочный хук (preinstall), который запускал цепочку: Node → shell → Bun (среда выполнения JavaScript). Если Bun отсутствовал в системе, он автоматически устанавливался и запускал нагрузку второго этапа.

Технический анализ показал многоуровневую обфускацию. Первый слой содержал более 1700 строк, закодированных в формате Base64, с перемешанным массивом, который расшифровывался через функцию поиска с ключом 0xa31de. Второй слой использовал собственный шифр на основе алгоритмов PBKDF2 и SHA-256 для критических строк, таких как домен командного центра (C2), который расшифровывался только во время выполнения. Кроме того, вредоносная программа проверяла, запущена ли она именно на GitHub Actions под Linux, и немедленно завершала работу в других окружениях. Она также избегала работы с защищёнными ветками репозиториев (main, master, dependabot/, renovate/, gh-pages), чтобы не привлекать внимания.

Особое внимание уделено краже учётных данных.

Вредоносная нагрузка извлекала токены GitHub (GITHUB_TOKEN, персональные токены доступа и токены установки), проверяла их через API /user и перечисляла секреты репозиториев и организаци:

  • Amazon Web Services она опрашивала метаданные экземпляров (169.254.169[.]254), читала файлы .aws/ и вызывала SecretsManager во всех регионах.
  • HashiCorp Vault она искала токены по двенадцати путям (например, /var/run/secrets/vault/token, ~/.vault-token) и подключалась к локальному серверу Vault.
  • npm проверяла токены через /-/whoami, обменивала OIDC-токены на доступ к публикации и перечисляла пакеты.
  • Kubernetes читала токены сервисных аккаунтов и перечисляла секреты пространств имён.
  • 1Password вредоносная программа взаимодействовала с CLI-интерфейсом, пыталась извлечь мастер-пароль и обходила двухфакторную аутентификацию.

Закрепление в системе (persistence) достигалось путём внедрения правил sudoers через bind mount - злоумышленник прописывал запись runner ALL=(ALL) NOPASSWD:ALL в /etc/sudoers.d, что давало полный доступ без пароля. Также изменялся файл /etc/hosts для перенаправления DNS-запросов. Эксфильтрация осуществлялась двумя каналами: основной - HTTPS-соединение к зашифрованному домену C2 на порту 443 с предварительной проверкой DNS и "здоровья" канала; резервный - через Git Data API: вредоносная программа создавала blob, tree или commit в репозиториях жертвы на незащищённых ветках. Третичный канал - создание публичных репозиториев под учётными записями жертв с обратным описанием. На момент написания отчёта Microsoft наблюдалось более 2200 таких репозиториев.

Авторы учётной записи @antv подтвердили в тикете репозитория, что ситуация решена. Тем не менее последствия атаки могут быть долгосрочными. Украденные токены npm позволяют дальше отравлять другие пакеты, токены GitHub - манипулировать репозиториями, а учётные данные AWS - получать доступ к облачной инфраструктуре. Подделка атрибутов SLSA подрывает доверие к самому механизму верификации цепочек поставок. Для специалистов по безопасности это напоминание: необходимо тщательно контролировать права доступа к аккаунтам мейнтейнеров, внедрять многофакторную аутентификацию и проверять целостность пакетов перед развёртыванием в CI/CD. Крупные атаки такого рода - не единичный случай, а тренд, который потребует пересмотра подходов к управлению зависимостями в opensource.

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

Domain Port Combinations

  • t.m-kosche.com:443

SHA256

  • a68dd1e6a6e35ec3771e1f94fe796f55dfe65a2b94560516ff4ac189390dfa1c
  • fb5c97557230a27460fdab01fafcfabeaa49590bafd5b6ef30501aa9e0a51142

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