Axios взломан: как атака на npm-пакет с 100 млн загрузок в неделю стала угрозой для каждого JS-разработчика

31 марта 2026 года в 00:21 UTC на npm появилась новая версия axios@1.14.1. Через 39 минут — axios@0.30.4. Обе были помечены как актуальные релизы. Обе содержали скрытый троян. За следующие три часа — до того как npm удалил заражённые версии — тысячи CI/CD-пайплайнов и девелоперских машин по всему миру выполнили npm install axios и загрузили вредоносный код.
Axios — самый популярный HTTP-клиент для JavaScript. Более 100 миллионов загрузок в неделю, 174 000 зависимых npm-пакетов. Это не была атака на нишевую библиотеку. Это был удар в центр экосистемы.
Как это работало
Атакующие скомпрометировали npm-аккаунт ведущего мейнтейнера Axios jasonsaayman — предположительно через социальную инженерию, получив долгоживущий access token. Email аккаунта был изменён на Proton Mail адрес под контролем злоумышленников.
За 18 часов до основной атаки они опубликовали plain-crypto-js@4.2.0 — чистый, безвредный пакет. Просто чтобы он появился в реестре и не вызвал подозрений. Затем вышел plain-crypto-js@4.2.1 — уже вредоносный.
В заражённых версиях Axios единственное изменение в package.json — добавление одной строки:
"dependencies": {
"plain-crypto-js": "^4.2.1"
}Этот пакет объявлял postinstall хук — скрипт setup.js, который запускался автоматически при npm install, до того как npm заканчивал разрешение зависимостей. Через две секунды после начала установки малварь уже звонила домой на C2-сервер.
Что делал троян
Dropper использовал двухслойную обфускацию: reversed Base64 с заменой символов и XOR-шифр с ключом OrDeR_7077. После деобфускации скрипт определял ОС и скачивал платформо-специфичный payload второго этапа:
- Windows — PowerShell RAT, создающий
%PROGRAMDATA%\system.batс автозапуском через Registry Run key - macOS — скомпилированный C++ бинарник через AppleScript
- Linux — Python-скрипт Все три варианта — реализации одного и того же RAT: идентичный C2-протокол, набор команд, интервал маячков. Это указывает на единую команду разработчиков с общей спецификацией.
После запуска RAT немедленно проводил разведку: перечислял директории пользователя, запущенные процессы, переменные окружения. Целенаправленно искал секреты — GitHub Actions credentials, AWS/GCP/Azure ключи, SSH ключи, npm токены, и отдельно — конфиги AI-инструментов включая ~/.claude.json и MCP server configs.
Затем удалял себя: стирал setup.js, заменял вредоносный package.json чистым. Следы в node_modules исчезали.
Microsoft Threat Intelligence атрибутировал атаку Sapphire Sleet — северокорейскому государственному актору. Unit 42 (Palo Alto) подтвердил пересечение инфраструктуры с кампанией TeamPCP, которая за предшествующие две недели скомпрометировала четыре других опенсорс-проекта: Trivy, KICS, LiteLLM, Telnyx.
Что делать прямо сейчас
Проверить заражение:
# Ищем в lockfile признаки компрометации
grep -r "plain-crypto-js" package-lock.json yarn.lock pnpm-lock.yaml
# Проверяем версии axios
grep -r "\"axios\"" node_modules/axios/package.jsonЕсли нашёл axios@1.14.1, axios@0.30.4 или plain-crypto-js любой версии — машина считается полностью скомпрометированной. Не чисти — переустанавливай с нуля.
Ротация секретов — обязательна для всего что было доступно с заражённой машины: GitHub токены, cloud credentials, npm токены, SSH ключи, deploy keys.
Понизить версию до безопасной:
npm install axios@1.14.0 --ignore-scriptsФлаг --ignore-scripts критичен — он отключает postinstall хуки.
Для CI/CD: Проверь логи за окно 00:21–03:25 UTC 31 марта 2026. Если пайплайн запускал npm install axios без пиннинга версии — считай окружение скомпрометированным.
Системный урок
Эта атака не уникальна по механике — она уникальна по масштабу. Тот же сценарий использовался против десятков меньших пакетов. Axios просто сделал последствия глобальными.
Три вещи которые защищают от таких атак:
- Lockfile + pinned versions —
npm ciвместоnpm installв CI. Lockfile фиксирует точные версии и хеши. --ignore-scripts— отключает postinstall хуки глобально или для конкретной установки. Большинству пакетов они не нужны.- Dependency cooldown — некоторые пакетные менеджеры позволяют игнорировать версии опубликованные менее N часов назад, давая сообществу время флагнуть проблему.
Поверхность атаки — это вендор вашего вендора вашего вендора. Axios — это то как это выглядит на практике.
npm сохраняет метаданные удалённых версий. Временна́я метка axios@1.14.1 — 2026-03-31T00:21:58.168Z — никуда не делась.