Axios взломан на npm — вредоносные версии устанавливают RAT-троянец на все ОС

Вредоносные версии axios 2.x на npm устанавливают RAT-троянец на Windows, Linux и macOS. Атака использует postinstall-скрипт и C2-сервер для удалённого управления.

Обложка: Axios взломан на npm — вредоносные версии устанавливают RAT-троянец на все ОС

Если ваш проект использует axios — проверьте package-lock.json прямо сейчас. 31 марта 2026 года злоумышленники взломали npm-аккаунт основного мейнтейнера библиотеки и опубликовали версии с троянцем удалённого доступа (RAT).

Скомпрометированы версии axios@1.14.1 и axios@0.30.4 — обе ветки, актуальная и легаси. Вредоносный код устанавливает кроссплатформенный RAT, который работает на macOS, Windows и Linux. Пакеты были доступны в npm-реестре около 3 часов, прежде чем npm их удалил.

Ключевые выводы

— Скомпрометированы axios@1.14.1 и axios@0.30.4 через взлом npm-аккаунта мейнтейнера

— Вредоносная зависимость plain-crypto-js устанавливает RAT-троянец на все ОС

— axios — самый популярный HTTP-клиент в JS-экосистеме: более 100 млн загрузок в неделю

— Безопасные версии: 1.14.0 (для 1.x) и 0.30.3 (для 0.x)

— Все секреты на затронутых системах нужно ротировать немедленно

Axios — HTTP-клиент для Node.js и браузеров с более чем 100 миллионами загрузок в неделю. Атаки на цепочки поставок (supply chain attacks) — это компрометация инфраструктуры распространения ПО: вместо атаки на конечную цель злоумышленник внедряет вредоносный код в доверенный пакет, который жертва сама устанавливает.

Как произошла атака

Злоумышленники получили доступ к npm-аккаунту jasonsaayman — основного мейнтейнера axios. Email аккаунта был изменён с легитимного адреса на ifstap@proton.me. Предположительно, был украден долгоживущий классический npm access token.

Легитимные релизы axios публикуются через GitHub Actions с криптографической привязкой npm OIDC Trusted Publisher и содержат SLSA-провенанс (Supply chain Levels for Software Artifacts — стандарт подтверждения целостности сборки). Вредоносные версии были опубликованы вручную через npm CLI — без привязки к GitHub, без SLSA-провенанса, без соответствующего тега в репозитории.

Атака была подготовлена заранее: за 18 часов до компрометации axios в npm был опубликован пакет-приманка plain-crypto-js — клон легитимного crypto-js с тем же описанием и именем автора. Сначала чистая версия 4.2.0, затем вредоносная 4.2.1 с постустановочным скриптом.

Хронология атаки

Все события — по UTC, 30–31 марта 2026 года:

  • 30 марта, 05:57 — атакующий публикует чистый plain-crypto-js@4.2.0 для формирования истории публикаций
  • 30 марта, 23:59 — выходит вредоносный plain-crypto-js@4.2.1 с постустановочным скриптом
  • 31 марта, 00:05Socket детектирует вредоносный пакет — через 6 минут после публикации
  • 31 марта, 00:21 — публикуется axios@1.14.1 со скомпрометированного аккаунта
  • 31 марта, 01:00 — публикуется axios@0.30.4 — обе ветки поражены за 39 минут
  • 31 марта, ~03:15 — npm удаляет обе вредоносные версии, dist-tag latest откатывается к 1.14.0
  • 31 марта, 04:26 — npm публикует заглушку безопасности для plain-crypto-js — пакет заблокирован

Итого: axios@1.14.1 был доступен около 2 часов 53 минут, axios@0.30.4 — около 2 часов 15 минут.

Что делает вредоносный код

В исходном коде axios изменений нет — добавлена только зависимость plain-crypto-js@^4.2.1. Сам пакет никогда не импортируется в коде; он существует исключительно для запуска postinstall-хука при npm install.

Дроппер setup.js

Файл setup.js весит 4209 байт и использует двухслойную обфускацию: сначала reversed Base64-декодирование (с подстановкой символов), затем XOR-шифр с ключом OrDeR_7077. Дроппер определяет ОС и загружает платформенный payload с C2-сервера.

Payload по платформам

macOS: AppleScript-дроппер скачивает бинарный RAT с C2-сервера и сохраняет его как /Library/Caches/com.apple.act.mond — замаскирован под системный демон Apple. Запускается через /bin/zsh.

Windows: PowerShell копируется в %PROGRAMDATA%\wt.exe (маскировка под Windows Terminal). VBScript-дроппер запускает скрытый PowerShell-скрипт с обходом Execution Policy.

Linux: Python-скрипт RAT скачивается в /tmp/ld.py и запускается через nohup в фоновом режиме.

Возможности RAT

При первом запуске RAT отправляет на C2-сервер «отпечаток» системы: hostname, имя пользователя, версию ОС, архитектуру CPU, часовой пояс, время установки ОС и загрузки, список процессов, а также содержимое директорий /Applications, ~/Library и ~/Application Support. Затем RAT опрашивает C2 каждые 60 секунд. Поддерживаемые команды:

  • runscript — выполнение произвольных shell-команд и Python-кода
  • peinject — загрузка и запуск дополнительных бинарных payload
  • rundir — перечисление содержимого директорий
  • kill — самоуничтожение процесса

Антифорензика

После выполнения дроппер удаляет себя (setup.js) и подменяет package.json чистой версией без postinstall-секции. При инспекции node_modules после заражения следов вредоносного скрипта не остаётся.

Это означает, что проверка node_modules постфактум бесполезна. Единственный надёжный способ определить компрометацию — проверить package-lock.json на наличие вредоносных версий и IoC-пути на файловой системе (см. ниже).

Кто обнаружил

Атаку независимо обнаружили несколько компаний: Socket задетектировал вредоносный plain-crypto-js через 6 минут после публикации. StepSecurity подтвердил компрометацию через AI Package Analyst и инструментирование GitHub Actions-раннера. Детальный технический разбор также опубликовала SafeDep.

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

Файловая система:

			/Library/Caches/com.apple.act.mond          # macOS
%PROGRAMDATA%\wt.exe                          # Windows
%TEMP%\6202033.vbs                             # Windows
%TEMP%\6202033.ps1                             # Windows
/tmp/ld.py                                     # Linux
node_modules/plain-crypto-js/                  # все ОС
		

Сеть:

			C2 домен:  sfrclak[.]com
C2 IP:     142.11.206[.]73
C2 URL:    http://sfrclak[.]com:8000/6202033
		

SHA256 хеши:

			setup.js:  e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09
ld.py:     fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf
		

Что делать прямо сейчас

Быстрая проверка — есть ли вредоносные версии в вашем lockfile:

			grep -E 'axios@(1\.14\.1|0\.30\.4)|plain-crypto-js' package-lock.json
		

Если команда ничего не вернула — ваш проект не затронут. Если нашлись совпадения:

  1. Откатить axios: npm install axios@1.14.0 (для 1.x) или npm install axios@0.30.3 (для 0.x) — это автоматически удалит plain-crypto-js
  2. Проверить IoC-пути на файловой системе для вашей ОС (см. выше)
  3. Заблокировать C2 на сетевом уровне: sfrclak[.]com / 142.11.206.73
  4. Ротировать все секреты на затронутых системах: npm-токены, SSH-ключи, API-ключи, переменные из .env
  5. Проверить CI/CD-логи за 30–31 марта — ротировать все secrets из затронутых пайплайнов
  6. Перейти на npm ci --ignore-scripts в CI/CD как постоянную политику

Если обнаружены артефакты RAT — считайте систему полностью скомпрометированной и пересоберите из заведомо чистого состояния.

Защита от транзитивных зависимостей

Если axios используется как транзитивная зависимость (его тянет другой пакет), прямой npm install axios@1.14.0 не поможет — нужно зафиксировать версию через overrides в package.json:

			{
  "overrides": {
    "axios": "1.14.0"
  },
  "resolutions": {
    "axios": "1.14.0"
  }
}
		

Поле overrides работает в npm 8+, resolutions — в Yarn.

Частые вопросы
1
Какие версии axios скомпрометированы?

Скомпрометированы axios@1.14.1 и axios@0.30.4. Безопасные версии — 1.14.0 (для ветки 1.x) и 0.30.3 (для ветки 0.x). Обе вредоносные версии уже удалены из npm-реестра. Если вы не запускали npm install в период с 00:21 до 03:15 UTC 31 марта — ваш проект, скорее всего, не затронут.

2
Как понять, затронут ли мой проект?

Выполните в корне проекта команду grep -E 'axios@(1\.14\.1|0\.30\.4)|plain-crypto-js' package-lock.json. Если команда вернула результат — проект затронут: откатите axios, проверьте IoC-пути на файловой системе и ротируйте все секреты.

3
Нужно ли отказываться от axios?

Нет. Вредоносные версии удалены, аккаунт мейнтейнера восстановлен. Инцидент связан с компрометацией npm-аккаунта, а не с уязвимостью в коде самого axios. Рекомендуется закрепить версию 1.14.0, использовать lockfile и npm ci --ignore-scripts в CI/CD.

4
Как защититься от подобных атак?

Используйте lockfile и команду npm ci вместо npm install в CI/CD. Включите флаг --ignore-scripts для блокировки постустановочных скриптов. Следите за SLSA-провенансом пакетов — его отсутствие в новом релизе доверенного пакета является красным флагом. Инструменты вроде Socket и StepSecurity автоматизируют такой мониторинг.

5
Присвоен ли CVE?

На момент публикации CVE официально не присвоен. Инцидент задокументирован в GitHub issue #10604. Отчёт для генерации CVE подан, но номер пока не выделен. Следите за обновлениями issue — там же публикуются заявления мейнтейнеров о ходе расследования.

Выводы

Инцидент с axios — один из самых масштабных supply chain атак в npm по потенциальному охвату: при 100 миллионах загрузок в неделю даже 3-часовое окно доступности вредоносных версий критично. Для сравнения: компрометация event-stream в 2018 году затронула пакет с 2 миллионами загрузок в неделю.

Скорость реакции экосистемы впечатляет: Socket обнаружил вредоносный plain-crypto-js через 6 минут, npm отозвал пакеты менее чем за 3 часа. Но сам факт, что атакующему хватило одного украденного токена для публикации от имени доверенного мейнтейнера, ставит вопрос о необходимости обязательного использования OIDC Trusted Publishing для критической инфраструктуры npm.

Проверьте свои зависимости, ротируйте секреты и убедитесь, что ваш CI/CD-пайплайн защищён от автоматической установки непроверенных версий.