Один із найпопулярніших HTTP-клієнтів у JavaScript-екосистемі — Axios, який завантажують понад 83 млн разів на тиждень, став об’єктом масштабної атаки на ланцюг постачання npm. У реєстр були опубліковані дві компрометовані версії пакета, що непомітно додавали фейкову залежність і встановлювали кросплатформений модуль віддаленого доступу (RAT) на macOS, Windows та Linux.
Компрометовані версії Axios і роль підробленої залежності plain-crypto-js
Дослідники StepSecurity виявили, що шкідливий код містили версії Axios 1.14.1 та Axios 0.30.4. Замість змін в основному коді бібліотеки зловмисники додали фіктивну залежність [email protected]. Цей пакет ніколи не використовувався у вихідних файлах Axios і не імпортувався розробниками, тобто був чистим елементом атаки на ланцюг постачання.
Єдина функція plain-crypto-js — виконати скрипт postinstall, який працював як dropper RAT: після встановлення пакета він автоматично завантажував та розгортав попередньо підготовлені шкідливі бінарні файли для трьох основних операційних систем. Після виявлення інциденту зловмисні версії Axios і сам plain-crypto-js були видалені з npm.
Адміністраторам та розробникам рекомендується негайно перейти на безпечні версії Axios 1.14.0 або Axios 0.30.3, а також виконати повну ротацію секретів (токени, ключі, паролі), які могли використовуватися на системах із встановленими скомпрометованими збірками.
Захоплення npm-акаунта та обхід CI/CD-пайплайна
За даними StepSecurity, зловмисники отримали доступ до npm-акаунта основного мейнтейнера Axios під ніком «jasonsaayman» і змінили прив’язаний email на адресу Proton Mail «[email protected]». Водночас шкідливий пакет plain-crypto-js був опублікований користувачем npm «nrwise» з email «[email protected]», що вказує на скоординовану операцію.
Експерти припускають, що для атаки використали довгоживучий classic access token npm. Такий токен дозволив обійти стандартний CI/CD-процес GitHub Actions і напряму публікувати модифіковані версії Axios в реєстр, минаючи автоматичні перевірки та збірки. Дослідження показало високий ступінь підготовки: шкідливу залежність створили приблизно за 18 годин до публікації, окремо зібрали три корисні навантаження під різні ОС, а дві гілки релізів Axios змінили менш ніж за 40 хвилин.
Ланцюг атаки: postinstall-скрипт, C2-сервер і можливості RAT
У серці компрометованого plain-crypto-js знаходився обфускований Node.js-скрипт setup.js, який виконував роль dropper’а. Після установки залежності він автоматично запускався через postinstall, визначав операційну систему та обирав відповідний сценарій атаки.
Для кожної платформи скрипт надсилав унікальний HTTP-запит POST на C2-сервер за адресою packages.npm.org, використовуючи різні шляхи: /product0 для macOS, /product1 для Windows та /product2 для Linux. Це дозволяло управляючому серверу повертати коректний бінарний файл під конкретну ОС, централізуючи керування всіма інфікованими системами.
Функціональність шкідливого ПО та ризики для систем
Для macOS завантажувався C++ RAT, який спершу виконував детальний fingerprinting системи (збір характеристик середовища), а потім кожні 60 секунд виходив на зв’язок із C2-сервером за новими командами. Зловмисники могли запускати додаткові корисні навантаження, виконувати довільні shell-команди, переглядати файлову систему та за потреби завершувати роботу RAT, зменшуючи шанси на виявлення.
Маскування слідів у структурі npm-пакета
Після розгортання основного шкідливого модуля Node.js-скрипт виконував кілька кроків для приховування слідів атаки у встановленому пакеті:
— видаляв postinstall-скрипт із пакета;
— видаляв початковий package.json із прописаним postinstall-хуком;
— перейменовував файл package.md у package.json.
Файл package.md був «чистим» маніфестом без будь-яких хуків. Підміна манифестів робила так, що навіть під час подальшого аналізу встановленого пакета аналітик не бачив postinstall-скрипта та явних індикаторів компрометації. Це класичний приклад цілеспрямованої роботи на ускладнення форензики.
Додаткові уражені пакети та індикатори компрометації
Компанія Socket, що спеціалізується на безпеці ланцюгів постачання, виявила ще два пакети, через які поширювали ту саму шкідливу нагрузку:
— @shadanai/openclaw — містить plain-crypto-js як вендорну залежність глибоко у вкладеній структурі;
— @qqbrowser/[email protected] — постачає підмінений [email protected] у власному каталозі node_modules.
«Чистий» Axios має лише три залежності: follow-redirects, form-data та proxy-from-env. Поява plain-crypto-js у списку залежностей — однозначний індикатор втручання в ланцюг постачання і підставa вважати систему потенційно скомпрометованою.
Рекомендації з кібербезпеки для розробників і бізнесу
Організаціям і розробникам слід:
— перевірити, чи не використовувалися версії Axios 1.14.1 або 0.30.4, а також пакети @shadanai/openclaw та @qqbrowser/openclaw-qbot;
— провести детальний аудит залежностей і lock-файлів (package-lock.json, yarn.lock);
— у разі виявлення шкідливих версій вважати систему скомпрометованою, виконати повне сканування, ротацію всіх секретів і переустановлення залежностей із перевіреного джерела (репозиторію або артефактів, зафіксованих до інциденту).
Додатково варто посилити захист облікових записів мейнтейнерів і розробників: увімкнути двофакторну автентифікацію, обмежувати повноваження та час життя доступних токенів, регулярно проводити ревізію токенів доступу. Використання інструментів аналізу залежностей і виявлення аномалій у скриптах (зокрема postinstall) стає обов’язковою практикою для команд, що працюють з npm та іншими репозиторіями відкритого коду.
Інцидент із Axios наочно демонструє, що атаки на ланцюг постачання відкритого ПЗ — це не поодинокі випадки, а системний тренд. Щоб знизити ризики, компаніям необхідно вибудовувати процеси безпеки навколо всього життєвого циклу розробки: від захисту акаунтів мейнтейнерів і контролю залежностей до безперервного моніторингу та навчання команд. Чим раніше такі практики стануть стандартом, тим менше шансів у подібних атак вплинути на ваші продукти й інфраструктуру.