После компрометации axios 31 марта 2026 года по разработческим чатам и соцсетям разошёлся компактный набор команд: заблокировать C2-домен через /etc/hosts, сбросить DNS-кеш, проверить наличие файла в /Library/Caches. Совет выглядит разумно, его репостят тысячи людей, и в нём есть рациональное зерно. Но он покрывает ровно одну из трёх платформ, на которые нацелен малварь, а на двух оставшихся создаёт ложное чувство безопасности: разработчик проверяет, ничего не находит и считает себя чистым.
Что советуют — и чего в этом совете не хватает
Типичный набор команд, который разошёлся по чатам:
# заблокировать C2-домен
echo '127.0.0.1 sfrclak.com' | sudo tee -a /etc/hosts
# сбросить DNS-кеш
sudo dscacheutil -flushcache
# проверить наличие файла — если есть, машина заражена
ls /Library/Caches/com.apple.act.mond
Блокировка домена через /etc/hosts — мера осмысленная, но частичная. C2-сервер имеет конкретный IP-адрес (142.11.206.73), и если малварь обращается к нему напрямую, минуя DNS, блокировка домена ничего не даст. Для полноценной защиты нужно блокировать IP на уровне файрвола.
dscacheutil -flushcache — команда, которая существует только в macOS. На Windows и Linux она бессмысленна, а разработчики, копирующие совет на этих платформах, просто получат ошибку.
Проверка файла /Library/Caches/com.apple.act.mond — корректный индикатор компрометации, но исключительно для macOS. На Windows малварь оставляет другие артефакты в других директориях, на Linux — третьи. Человек, который запустит ls /Library/Caches/com.apple.act.mond на Linux-машине, не найдёт файла и сделает неверный вывод.
Но главная проблема в другом: в совете отсутствует первый шаг — проверить, какая версия axios стоит в проекте. Если это не 1.14.1 и не 0.30.4, дальнейшие проверки не нужны. Этот шаг тривиален (npm ls axios), но его почему-то пропускают, сразу переходя к поиску артефактов на диске.
Чтобы понять, какие именно артефакты нужно искать на каждой платформе, стоит разобраться, как была устроена сама атака.
Что произошло
Атакующий готовился как минимум 18 часов, бил по двум мажорным веткам одновременно и заложил самоуничтожение следов в сам дроппер. Хронология событий в UTC:
30 марта, 05:57 — на npm появляется пакет [email protected] от аккаунта nrwise (email: [email protected]). Версия 4.2.0 — чистая, без вредоносного кода. Это приманка: пакет регистрируется заранее, чтобы к моменту атаки он уже выглядел как обычная зависимость.
30 марта, 23:59 — публикуется [email protected]. Эта версия содержит postinstall-скрипт с кросс-платформенным RAT-дроппером.
31 марта, 00:05 — автоматическая система обнаружения малвари Socket Research срабатывает через шесть минут после публикации [email protected].
31 марта, 00:21 — с угнанного аккаунта jasonsaayman, основного мейнтейнера axios, публикуется [email protected]. В package.json добавлена зависимость на [email protected]. Публикация идёт через npm CLI напрямую, в обход GitHub Actions CI/CD пайплайна проекта.
31 марта, 01:00 — публикуется вторая отравленная версия, [email protected], на ветке 0.x. Обе ветки скомпрометированы за 39 минут.
31 марта, 03:15 — npm снимает обе версии axios.
31 марта, 04:26 — на пакет наложен security hold, опубликованы чистые заглушки.
Атакующий скомпрометировал аккаунт jasonsaayman через украденный долгоживущий npm-токен, сменил email на [email protected] и опубликовал пакеты вручную, в обход CI/CD.
Как работает малварь
Зависимость plain-crypto-js нигде не импортируется в коде axios. Её единственная задача — выполнить postinstall-скрипт setup.js при установке пакета. Скрипт использует двухслойную обфускацию: reversed Base64 и XOR-шифрование с ключом OrDeR_7077.
После деобфускации дроппер определяет платформу и загружает соответствующий пейлоад с C2-сервера sfrclak.com:8000 (IP: 142.11.206.73). Трафик маскируется под запросы к npm-реестру — POST-тела содержат строки вида packages.npm.org/product0, product1, product2 для идентификации платформы.
После выполнения дроппер удаляет себя и заменяет свой package.json чистой версией из заранее подготовленного файла package.md, чтобы затруднить форензику.
macOS
Дроппер запускает AppleScript, который скачивает бинарный файл в /Library/Caches/com.apple.act.mond, маскируя его под системный демон Apple. Бинарник — полноценный RAT: выполнение команд, инъекция бинарных файлов, обзор файловой системы. Процесс открепляется от родительского и работает в фоне.
Windows
Механизм сложнее и использует три компонента. Сначала дроппер копирует powershell.exe в %PROGRAMDATA%\wt.exe, маскируя его под Windows Terminal — это известная техника обхода EDR-систем. Затем создаётся VBScript-файл %TEMP%\6202033.vbs, который запускается через cscript //nologo в скрытом окне. VBScript скачивает PowerShell-пейлоад в %TEMP%\6202033.ps1 и запускает его с флагами -WindowStyle Hidden -ExecutionPolicy Bypass.
Принципиальный момент: VBS-файл самоудаляется после выполнения (del "%TEMP%\6202033.vbs" /f). Это означает, что временные файлы в %TEMP% могут отсутствовать даже на заражённой машине. Персистентным артефактом остаётся wt.exe — он создаётся один раз и переживает перезагрузки.
Linux
Дроппер скачивает Python-скрипт в /tmp/ld.py и запускает его. Пейлоад работает как RAT аналогично macOS-версии.
Как проверить на самом деле
Шаг 0: проверить версию axios
Прежде чем искать файлы на диске, нужно выяснить, устанавливалась ли вообще заражённая версия:
npm ls axios
Если в выводе нет версий 1.14.1 или 0.30.4 — ваш проект не затронут. Если вы используете монорепозиторий, проверьте все воркспейсы. Если у вас несколько проектов — проверьте каждый.
macOS
# проверить наличие RAT-бинарника
ls -la /Library/Caches/com.apple.act.mond
# проверить, не запущен ли процесс
ps aux | grep com.apple.act.mond | grep -v grep
# проверить сетевые соединения к C2
lsof -i -nP | grep 142.11.206.73
Если файл существует или процесс запущен — машина заражена.
Windows (PowerShell)
# проверить персистентный артефакт (основной индикатор)
Test-Path "$env:ProgramData\wt.exe"
# проверить временные файлы (могут отсутствовать — самоудаляются)
Get-ChildItem $env:TEMP -Filter '6202033.*' -Force -ErrorAction SilentlyContinue
# проверить сетевые соединения к C2
Get-NetTCPConnection | Where-Object { $_.RemoteAddress -eq '142.11.206.73' }
Если wt.exe существует — машина заражена. Отсутствие файлов 6202033.* не гарантирует безопасность: они самоудаляются после выполнения.
Linux
# проверить наличие пейлоада
ls -la /tmp/ld.py
# проверить запущенные Python-процессы
ps aux | grep ld.py | grep -v grep
# проверить сетевые соединения к C2
ss -tnp | grep 142.11.206.73
Сетевой уровень (все платформы)
Независимо от ОС, стоит проверить, не было ли обращений к C2-серверу:
# заблокировать и домен, и IP
# домен:
echo '127.0.0.1 sfrclak.com' | sudo tee -a /etc/hosts
# IP — на уровне файрвола (iptables, pf, Windows Firewall)
Что делать, если заражены
Если хотя бы одна из проверок выше дала положительный результат:
-
Отключить машину от сети — выдернуть кабель, отключить Wi-Fi. Не выключать машину: данные в оперативной памяти могут понадобиться для расследования.
-
Ротировать все секреты, к которым машина имела доступ: API-ключи, токены, пароли от баз данных, SSH-ключи, AWS/GCP/Azure credentials. Малварь эксфильтрировал переменные окружения, поэтому всё, что хранилось в environment variables или .env-файлах, следует считать скомпрометированным.
-
Откатить версию axios на безопасную: 1.14.0 (для ветки 1.x) или 0.30.3 (для ветки 0.x).
-
Удалить персистентные артефакты:
wt.exeна Windows,com.apple.act.mondна macOS. -
Проверить cron/планировщик задач на предмет подозрительных записей — RAT мог настроить автозапуск.
Заключение
Неполная инструкция по безопасности хуже, чем отсутствие инструкции, потому что она создаёт иллюзию проверки. Разработчик на Windows выполняет три команды для macOS, не находит ничего и уверен, что не затронут. Прежде чем репостить совет по безопасности, стоит прочитать его до конца и задать один вопрос: работает ли это на моей платформе?
Источники: Socket Research, StepSecurity, Aikido, The Hacker News, Snyk, Wiz