Инцидент с компрометацией одной из ключевых библиотек экосистемы JavaScript вскрыл системные проблемы безопасности цепочки поставок программного обеспечения. Злоумышленники, получив доступ к учётной записи ведущего разработчика проекта Axios, опубликовали вредоносные версии пакета, которые устанавливали кроссплатформенного трояна удаленного доступа (Remote Access Trojan, RAT) на системы пользователей. Атака, произошедшая 30-31 марта 2026 года, затронула миллионы проектов по всему миру, поскольку библиотека Axios используется для выполнения HTTP-запросов и имеет свыше 100 миллионов еженедельных загрузок через менеджер пакетов npm.
Описание
Вредоносные версии 1.14.1 и 0.30.4 содержали так называемую "фантомную" зависимость - пакет "plain-crypto-js@4.2.1", который никогда не импортировался в исходном коде Axios. Его единственной целью было исполнение скрипта "postinstall" в момент установки библиотеки. Этот скрипт, в свою очередь, разворачивал вредоносную нагрузку, адаптированную под операционную систему жертвы: macOS, Windows или Linux. После выполнения полезной нагрузки скрипт самоуничтожался, стирая следы и подменяя свой собственный файл манифеста на чистую версию. Специалисты, проводившие расследование, отмечают, что подобная тактика усложняет последующий анализ инцидента.
Атака была тщательно спланирована. Примерно за 18 часов до публикации отравленных версий Axios злоумышленник зарегистрировал домен для командного центра и опубликовал на npm чистую версию пакета-носителя "plain-crypto-js@4.2.0", чтобы создать историю и избежать срабатывания систем безопасности на "свежие" пакеты. Спустя несколько часов была выпущена вредоносная версия 4.2.1. Важным аспектом стало то, как был скомпрометирован аккаунт ведущего мейнтейнера в npm. Злоумышленник изменил привязанную к учётной записи электронную почту и вручную опубликовал пакеты, используя украденный токен доступа npm. Это позволило обойти защитный механизм OIDC Trusted Publisher, который криптографически привязывает публикацию пакета к проверенному рабочему процессу в GitHub Actions. Легитимные релизы Axios всегда используют эту привязку, тогда как вредоносные версии её не имели, что стало ключевым признаком аномалии.
Технический анализ вредоносного кода выявил высокий уровень изощрённости. Скрипт "setup.js" использовал многослойное обфусцирование строк, включая XOR-шифр с ключом и динамическую подгрузку модулей Node.js через вызовы "require()" с декодируемыми именами. Это делало код практически нечитаемым для статического анализа. В зависимости от платформы выполнялись разные сценарии. На Windows запускалась цепочка из VBScript и PowerShell, где финальная вредоносная нагрузка исполнялась непосредственно в памяти процесса без записи на диск с помощью "[scriptblock]::Create()". На macOS использовался AppleScript для загрузки исполняемого файла, маскирующегося под системный демон Apple. На Linux через "curl" загружался и исполнялся Python-скрипт. После запуска трояна происходила очистка: удалялись файлы "setup.js" и "package.json", а на место последнего переименовывался заранее подготовленный чистый файл "package.md".
Несмотря на сложность атаки, автоматические сканеры безопасности npm обнаружили подозрительный пакет "plain-crypto-js@4.2.1" уже через шесть минут после его публикации и присвоили ему 0% оценки безопасности цепочки поставок. Вскоре после этого администрация npm удалила все скомпрометированные версии как Axios, так и вредоносной зависимости, а также отозвала токены доступа. Однако окно уязвимости, хотя и короткое, позволило трояну проникнуть в системы. Телеметрия исследователей показывает активность, соответствующую этой угрозе, в организациях из государственного сектора, финансов, розничной торговли, здравоохранения и других отраслей.
Этот инцидент стал наглядной демонстрацией уязвимостей в современных практиках разработки. Использование плавающих версий зависимостей (например, "^1.14.0") привело к тому, что многие проекты автоматически получили отравленное обновление. Запуск скриптов "postinstall" по умолчанию в CI/CD-пайплайнах предоставил вредоносному коду мгновенную точку входа. Между тем, недостаточное внедрение строгих механизмов аутентификации публикаций, таких как OIDC Trusted Publisher, позволило злоумышленнику использовать украденный токен. Для специалистов по безопасности ключевым уроком является необходимость мониторинга сетевого трафика в изолированных средах сборки, анализа не только "package.json", но и файлов блокировок ("package-lock.json"), а также жёсткой фиксации версий всех зависимостей. Разработчикам же настоятельно рекомендуется добавлять флаг "--ignore-scripts" при выполнении "npm install" или "npm ci" в автоматизированных процессах, чтобы предотвратить исполнение непроверенного кода.
Индикаторы компрометации
IPv4
- 142.11.206.73
Domains
- callnrwise.com
- sfrclak.com
URLs
- http://sfrclak.com:8000/6202033
- packages.npm.org/product0
- packages.npm.org/product1
- packages.npm.org/product2
SHA1
- 07d889e2dadce6f3910dcbc253317d28ca61c766
- 2553649f2322049666871cea80a5d0d6adc700ca
- d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71
SHA256
- 591a70e8b166265804c1e2add3f5554b38364a8750248a8c5be751c5cd9b1655
- 617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101
- 92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a
- e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09
- ed8560c1ac7ceb6983ba995124d5917dc1a00288912387a6389296637d5f815c
- f7d335205b8d7b20208fb3ef93ee6dc817905dc3ae0c10a0b164f4e7d07121cd
- fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf