Один из самых популярных HTTP-клиентов в экосистеме JavaScript — Axios — стал жертвой атаки на цепочку поставок npm. В реестр были опубликованы две вредоносные версии пакета, которые незаметно добавляли поддельную зависимость и устанавливали кроссплатформенный вредоносный модуль удалённого доступа (RAT).
Какие версии Axios оказались вредоносными и что в них изменили
Исследователи StepSecurity установили, что версии Axios 1.14.1 и Axios 0.30.4 содержали подложную зависимость [email protected]. При этом исходный код Axios не был модифицирован — опасность скрывалась именно во внешнем пакете.
Эта зависимость никогда не использовалась в коде Axios и не импортировалась разработчиками. Её единственная задача — выполнить скрипт postinstall, который выступает в роли dropper’а RAT, загружая и развёртывая уже готовую вредоносную нагрузку под macOS, Windows и Linux.
После выявления инцидента вредоносные версии Axios и пакет plain-crypto-js были удалены из npm. Пользователям настоятельно рекомендуется немедленно откатиться на безопасные версии Axios 1.14.0 или Axios 0.30.3 и провести ротацию всех секретов и учётных данных (токены, ключи, пароли), которые могли быть задействованы системами, где стояли скомпрометированные сборки.
Компрометация npm-аккаунта и обход CI/CD
По данным StepSecurity, злоумышленники получили доступ к учётной записи основного мейнтейнера Axios в npm («jasonsaayman») и сменили его зарегистрированный email на Proton Mail-адрес под своим контролем («[email protected]»). Вредоносный пакет plain-crypto-js был опубликован пользователем npm с ником «nrwise» и email «[email protected]».
Эксперты предполагают, что атакующий завладел долгоживущим classic access token npm, что позволило обойти GitHub Actions CI/CD-пайплайн проекта и напрямую публиковать модифицированные версии Axios в реестр без стандартных проверок и автоматических сборок.
Исследователь Ашиш Курми отмечает, что атака была заранее спланирована: вредоносная зависимость была подготовлена примерно за 18 часов до публикации, заранее собраны три отдельных полезных нагрузки под разные ОС, а обе ветки релизов Axios были модифицированы менее чем за 40 минут. «Каждый след был спроектирован так, чтобы самоуничтожаться», — подчёркивают эксперты.
Как работает вредоносный postinstall-скрипт и цепочка атаки
Внутри plain-crypto-js ключевую роль играет обфусцированный Node.js dropper «setup.js». После установки зависимости он автоматически запускается через postinstall и выполняет детектирование операционной системы, выбирая один из трёх сценариев атаки.
Каждая платформа отправляет уникальный HTTP-запрос (POST) на единый адрес C2-сервера — packages.npm.org — но с разными путями: /product0 для macOS, /product1 для Windows и /product2 для Linux. Это позволяет управляющему серверу выдавать корректный бинарный файл под конкретную ОС при обращении к одному эндпоинту.
Для macOS загружается C++ RAT, который проводит «отпечаток» системы (fingerprinting), а затем каждые 60 секунд связывается с удалённым сервером за командами. Он умеет запускать дополнительные полезные нагрузки, выполнять произвольные shell-команды, перечислять файловую систему и по команде завершать свою работу.
Маскировка и зачистка следов в npm-пакете
После запуска основного вредоносного модуля Node.js-скрипт выполняет несколько шагов по скрытию признаков атаки в файловой структуре проекта:
— удаляет postinstall-скрипт из установленного пакета;
— удаляет package.json, в котором был прописан postinstall-хук;
— переименовывает файл package.md в package.json.
Файл package.md в составе plain-crypto-js является «чистым» манифестом без каких-либо хуков. Переключая манифесты местами, злоумышленники рассчитывали, что даже при последующем анализе установленного пакета не будет видно ни postinstall-скрипта, ни явных признаков компрометации.
Дополнительные затронутые пакеты и признаки компрометации
Компания Socket, специализирующаяся на безопасности цепочки поставок, сообщила о ещё двух пакетах, через которые распространялась та же вредоносная нагрузка:
— @shadanai/openclaw — внутри него plain-crypto-js внедрён глубоко по вложенному пути в виде vendored-зависимости;
— @qqbrowser/[email protected] — поставляет подменённый [email protected] в каталоге node_modules.
Указано, что «чистый» Axios имеет всего три зависимости: follow-redirects, form-data и proxy-from-env. Появление plain-crypto-js в списке зависимостей — однозначный признак подмены и вмешательства в цепочку поставок.
Разработчикам и компаниям рекомендуется:
— проверить, не использовались ли версии Axios 1.14.1 или 0.30.4, а также указанные связанные пакеты;
— провести аудит зависимостей и lock-файлов (package-lock.json, yarn.lock);
— при обнаружении следов установки вредоносных версий считать систему скомпрометированной, выполнить полное сканирование, ротацию секретов и переустановку зависимостей из доверенного состояния.
Инцидент с Axios наглядно показывает, насколько опасны атаки на цепочку поставок npm и другие экосистемы open source. Учитывая, что Axios загружается более чем 83 миллиона раз в неделю, даже кратковременная компрометация такого пакета создаёт значительный риск для разработчиков, инфраструктуры компаний и конечных пользователей. Повышенное внимание к безопасности учётных записей мейнтейнеров, ограничение и ротация токенов доступа, а также автоматический анализ зависимостей на наличие подозрительных скриптов и неожиданных зависимостей становятся критически важными элементами современной практики кибербезопасности.