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

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 просто сделал последствия глобальными.

Три вещи которые защищают от таких атак:

  1. Lockfile + pinned versionsnpm ci вместо npm install в CI. Lockfile фиксирует точные версии и хеши.
  2. --ignore-scripts — отключает postinstall хуки глобально или для конкретной установки. Большинству пакетов они не нужны.
  3. Dependency cooldown — некоторые пакетные менеджеры позволяют игнорировать версии опубликованные менее N часов назад, давая сообществу время флагнуть проблему.

Поверхность атаки — это вендор вашего вендора вашего вендора. Axios — это то как это выглядит на практике.

npm сохраняет метаданные удалённых версий. Временна́я метка axios@1.14.12026-03-31T00:21:58.168Z — никуда не делась.

5

28.04.2026

|

www.elastic.co
2026