📦 Что произошло с банками — пока не знаем. Зато можем рассказать о вредоносном коде в Axios
В последний день марта стало известно об атаке на одну из самых популярных JavaScript-библиотек — Axios. Это HTTP-клиент с более чем 100 млн загрузок в неделю из npm — сервиса распространения программных модулей для разработчиков.
Злоумышленник скомпрометировал аккаунт главного специалиста, ответственного за развитие и работоспособность IT-проекта — мейнтейнера — и опубликовал две вредоносные версии пакета, содержащие троян удаленного доступа (RAT). Инцидент обнаружили исследователи StepSecurity.
🔎 Подробностями делится Владимир Кочетков, руководитель исследований AppSec в Positive Technologies.
Атакующий получил доступ к npm-аккаунту мейнтейнера jasonsaayman, сменил привязанный email и опубликовал версии
[email protected] и
[email protected] напрямую в npm — минуя CI/CD-пайплайн и GitHub. Именно поэтому зараженные релизы не появились среди тегов репозитория на GitHub, что стало одним из первых признаков подмены.
В обе версии была добавлена фантомная зависимость
[email protected] — пакет-обманка, маскирующийся под легитимную библиотеку crypto-js с идентичным описанием и ссылкой на оригинальный репозиторий. Эта зависимость нигде не импортировалась в исходном коде Axios. Ее единственное назначение — выполнить postinstall-скрипт setup.js при установке пакета.
👾 Как работает вредоносная нагрузка
Скрипт setup.js использовал двухслойную обфускацию (XOR-шифр с ключом OrDeR_7077 и base64). После деобфускации он обращался к C2-серверу sfrclak.com и загружал платформенно-специфичный RAT:
🍏 macOS — бинарник маскировался под системный процесс Apple и размещался в /Library/Caches/com.apple.act.mond
🖥 Windows — через VBScript и PowerShell разворачивался исполняемый файл wt.exe в %PROGRAMDATA% с механизмом персистентности
🖥 Linux — Python-бэкдор сохранялся во временной директории /tmp/ld.py
После выполнения вредоносный модуль зачищал следы: удалял собственные файлы, а package.json подменял на «чистую» заглушку с номером версии 4.2.0 вместо 4.2.1 — намеренное расхождение для затруднения расследования.
😵 Масштаб и последствия
Вредоносные версии были доступны в npm менее трех часов —
[email protected] около 2 часов 53 минут,
[email protected] около 2 часов 15 минут. Тем не менее любой проект, в котором зависимость была указана как ^1.14.0 или ^0.30.0, мог автоматически установить зараженную версию при сборке. А учитывая 100 млн загрузок Axios в неделю, потенциальный охват атаки огромен. По данным Malwarebytes, любой CI/CD-процесс, запустивший установку с включенными скриптами, мог привести к утечке всех инжектированных секретов.
Что важно: конечные пользователи браузерных приложений напрямую не затронуты — заражение происходило на этапе установки и сборки, а не в рантайме приложения.
🛡 Как защититься
✅ Проверьте lock-файлы (package-lock.json, yarn.lock) на наличие
[email protected],
[email protected] или
[email protected]. Обратите внимание, что npm audit может не выявить компрометацию — вредонос зачищает следы после установки.
✅ Если вредоносные версии обнаружены — откатитесь к безопасным
[email protected] или
[email protected], а затронутые машины (локальные и CI/CD-раннеры) считайте потенциально скомпрометированными.
✅ Ротируйте все секреты: API-ключи, облачные токены, deploy-ключи, npm-токены — все, к чему мог получить доступ вредоносный процесс.
✅ Проверьте наличие IoCs: сетевые обращения к sfrclak.com (IP 142.11.206.73, порт 8000) и характерные файлы на диске.
🧑🏫 Уроки для разработчиков
Этот инцидент — очередное напоминание о том, что без AppSec-инструментов под реальной угрозой оказываются качество кода и его защищенность. Одного скомпрометированного аккаунта мейнтейнера достаточно для внедрения вредоносного кода в проекты по всему миру.
Для снижения рисков стоит использовать фиксированные версии зависимостей вместо диапазонов, включить двухфакторную аутентификацию (2FA) на npm, применять --ignore-scripts при установке пакетов и мониторить изменения зависимостей специализированными инструментами — SCA-анализаторами.