Злоумышленники скомпрометировали учетную запись npm ведущего мейнтейнера Axios — широко используемой библиотеки HTTP-клиента на JavaScript — и использовали ее для публикации вредоносных версий пакета, которые развертывали кроссплатформенный троян удаленного доступа на машинах разработчиков. Этот инцидент представляет собой атаку на цепочку поставок npm с самыми серьезными последствиями за всю историю, учитывая, что Axios загружается около 100 миллионов раз в неделю и используется во фронтенд-фреймворках, бэкенд-сервисах и бесчисленном количестве корпоративных приложений.
К счастью, зараженные версии axios@1.14.1 и axios@0.30.4 были обнаружены несколькими компаниями по безопасности, отслеживающими реестр npm, в течение нескольких минут после публикации, что спровоцировало быстрое реагирование, в результате которого вредоносные пакеты были удалены командой npm спустя два-три часа. Тем не менее, учитывая высокую активность загрузок этого проекта, короткого временного окна оказалось достаточно, чтобы затронуть значительное число сред разработки.
По данным облачной компании по безопасности Wiz, Axios используется в 80% облачных сред и сред разработки кода; компания зафиксировала выполнение вредоносного ПО примерно в 3% затронутых сред. Исследователи из Snyk отметили, что «даже двухчасовое вредоносное окно представляет собой огромный потенциальный радиус поражения» с учетом популярности библиотеки. Почти 175 000 других проектов на npm указывают Axios как зависимость, что означает огромный каскадный эффект в экосистеме.
Эта атака последовала за серией атак на цепочки поставок, затронувших несколько проектов с открытым исходным кодом в различных репозиториях пакетов за последние несколько недель, большинство из которых приписываются группе, известной как TeamPCP. Однако Google Threat Intelligence Group (GTIG) приписала атаку на Axios северокорейскому злоумышленнику, которого они отслеживают как UNC1069.
«Северокорейские хакеры имеют большой опыт в атаках на цепочки поставок, которые они исторически использовали для кражи криптовалюты», — заявил Джон Халтквист, главный аналитик GTIG. «Полный масштаб этого инцидента все еще неясен, но, учитывая популярность скомпрометированного пакета, мы ожидаем, что он будет иметь далеко идущие последствия».
В своем анализе исследователи Snyk также отметили изощренность методов, использованных в атаке.
«Злоумышленник также продемонстрировал значительную операционную изощренность: предварительно разместил вредоносную зависимость, использовал «чистую» историю версий, дважды обфусцировал дроппер, создал специфичные для платформы RAT и реализовал самоудаление для противодействия криминалистическому анализу», — заявили исследователи Snyk в своем отчете. «Это не было оппортунистическим действием».
Как развивалась атака
Злоумышленники начали подготовку атаки на Axios примерно за 18 часов до того, как учетная запись под названием nrwise опубликовала пакет plain-crypto-js@4.2.0. Это был чистый приманка, предназначенная для создания истории реестра и придания легитимности. Вредоносная полезная нагрузка появилась позже в тот же день в plain-crypto-js@4.2.1, который содержал хук postinstall, выполняющий скрипт-дроппер при подтягивании его другим пакетом в качестве зависимости.
Вскоре после полуночи по UTC 31 марта новая версия пакета Axios, axios@1.14.1, была опубликована в npm, а через 39 минут последовала axios@0.30.4. Обе версии указывали plain-crypto-js@4.2.1 в качестве зависимости в своих файлах package.json, но остальные компоненты остались без изменений.
Пакет, который появляется в манифесте, но не имеет использования или импорта в кодовой базе, называется фантомной зависимостью и является высоконадежным индикатором компрометации, согласно исследователям из StepSecurity. Другим индикатором было то, что эти версии появились только в npm и не были указаны в репозитории GitHub проекта как тегированные релизы.
Легитимные релизы 1.x Axios были настроены на использование механизма OIDC Trusted Publisher npm, привязанного к GitHub Actions, но релиз 1.14.1 был опубликован вручную с использованием украденного токена без соответствующего коммита или тега в репозитории.
В комментариях на GitHub основной мейнтейнер проекта Джейсон Сэйман признал, что, хотя для v1.x была настроена доверенная публикация, ветка v0.x все еще полагалась на устаревший долгоживущий токен. Участник сообщества дополнительно указал, что рабочий процесс публикации v1.x все еще передавал NODE_AUTH_TOKEN в npm, который имеет приоритет над OIDC, когда оба присутствуют, что означает, что долгоживущий токен также использовался для v1.x вместо предполагаемого механизма доверенной публикации.
Кроссплатформенное вредоносное ПО
Обфусцированный и зашифрованный скрипт postinstall связался с командно-контрольным (C2) сервером на домене, зарегистрированном злоумышленниками за день до этого, и загрузил специфичные для платформы полезные нагрузки RAT второго уровня.
На macOS бинарный файл записывается в /Library/Caches/com.apple.act.mond и может самостоятельно подписывать внедренные полезные нагрузки с помощью codesign —force —deep —sign, обходя защиты macOS Gatekeeper. Вредоносное ПО собирает отпечатки системы, получает имя хоста, имя пользователя, версию macOS, время загрузки и установки, архитектуру ЦП и запущенные процессы, а затем каждые 60 секунд связывается с C2-сервером.
На машинах под управлением Windows полезная нагрузка представляет собой скрипт PowerShell, скопированный в %PROGRAMDATA%\wt.exe, маскирующийся под Windows Terminal. Вредоносное ПО обеспечивает постоянство через ключ реестра Run с именем «MicrosoftUpdate» и файл пакетной загрузки. Тем временем системы Linux получают скрипт Python, сохраненный как /tmp/ld.py, который выполняется через nohup python3.
RAT поддерживает четыре команды: peinject для развертывания дополнительных бинарных файлов, runscript для выполнения кода оболочки или AppleScript, rundir для перечисления каталогов и kill для самоликвидации.
По данным исследователей из Socket, после выполнения вредоносное ПО пытается замести следы, удаляя setup.js, удаляя вредоносный package.json, содержащий хук postinstall, и заменяя его чистой копией, которая сообщает версию 4.2.0 вместо 4.2.1. Это означает, что пользователи, запускающие npm list в затронутой директории проекта, увидят plain-crypto-js@4.2.0, что может ввести их в заблуждение, заставив поверить, что установленная версия предшествует атаке.
Обнаружение и реакция мейнтейнера
Фирмы по безопасности, отслеживающие npm, пометили plain-crypto-js@4.2.1 в течение нескольких минут после его публикации, что спровоцировало ряд ответных мер, в том числе со стороны команды реестра npm, которая удалила пакеты. Однако сам проект Axios столкнулся с трудностями в сдерживании проблемы, поскольку инцидент произошел ночью для ведущего мейнтейнера.
Основной соавтор проекта отреагировал на сообщение сообщества о проблеме на GitHub также в течение нескольких минут, но его права были ниже, чем у мейнтейнера, чей токен был скомпрометирован.
Это подчеркивает потенциальный пробел в реагировании на инциденты, с которым могут столкнуться проекты с открытым исходным кодом, поскольку даже если участники проекта немедленно заметят взлом, злоумышленник может иметь более высокие привилегии через украденный токен и замедлить попытки контроля ущерба.
В недавнем инциденте с Trivy злоумышленники заспамили проблему на GitHub комментариями от ботов, чтобы усложнить мейнтейнерам реагирование и общение с сообществом.
Готовьтесь к новым компрометациям
Каскадный эффект инцидента с Axios стал очевиден, когда инструменты сканирования зависимостей пометили сотни нижестоящих проектов, которые подтянули вредоносные версии. Один пользователь опубликовал предупреждения более чем в 50 репозиториях после обнаружения plain-crypto-js в своих lock-файлах, а другой обнаружил десятки других — от личных блогов до корпоративных приложений.
Это демонстрирует, как быстро компрометация популярного пакета npm распространяется по экосистеме, даже если взлом обнаружен в течение нескольких часов.
Организациям следует немедленно провести аудит lock-файлов и установленных зависимостей на предмет вредоносных версий. Если вредоносные версии были установлены, следует считать среды разработки полностью скомпрометированными. Группы безопасности должны изолировать затронутые системы, ротировать все учетные данные, присутствующие на них, такие как токены npm, ключи облачного провайдера, приватные SSH-ключи, секреты CI/CD и т. д.
«Не ротируйте на месте; отзывайте и перевыпускайте», — посоветовали исследователи Snyk. «Не пытайтесь очистить скомпрометированные системы. Восстанавливайте из известного чистого снимка».
В долгосрочной перспективе организациям следует использовать npm ci —ignore-scripts в конвейерах CI/CD, чтобы предотвратить выполнение хуков postinstall во время автоматизированных сборок, и рассмотреть политики возраста пакетов, такие как настройка minimumReleaseAge в npm. Это дает командам разработчиков возможность блокировать установку пакетов, не достигших минимального возраста, что заблокировало бы эту атаку, поскольку «plain-crypto-js» существовал менее 24 часов до того, как был подтянут в дерево зависимостей Axios.
Использование инструментов ИИ, таких как Claude Code или OpenAI Codex, в корпоративных средах через их соответствующие настольные приложения расширяет влияние за пределы сред разработки. Эти инструменты все чаще используются не-разработчиками в их рабочих процессах, а LLM, как правило, в значительной степени полагаются на экосистемы npm и PyPI для инструментов командной строки.
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Lucian Constantin




