Экосистему JavaScript потрясла масштабная атака на цепочку поставок. Специалисты Microsoft Threat Intelligence выявили вредоносную активность, затронувшую тридцать два пакета из пространства имён @redhat-cloud-services. В общей сложности атакующие опубликовали более девяноста заражённых версий этих библиотек. Инцидент затронул тысячи проектов, прямо или косвенно использующих эти компоненты. Речь идёт об одной из самых изощрённых кампаний последнего времени - злоумышленники смогли обойти стандартные механизмы доверия и скомпрометировать конвейер непрерывной интеграции и доставки (CI/CD) проекта RedHatInsights/javascript-clients.
Описание
Корень проблемы - в компрометации официального рабочего процесса публикации. Атакующие получили контроль над конвейером CI/CD, который использовал протокол OpenID Connect (OIDC) для аутентификации в реестре npm. В результате легитимный механизм выпуска пакетов через GitHub Actions был захвачен. Вредоносные версии несли подлинные подписи происхождения (provenance), что делало их неотличимыми от оригиналов для систем проверки целостности, включая стандарт SLSA (уровни цепочки поставок программных артефактов). Microsoft сообщила о находке команде npm, которая оперативно удалила заражённые репозитории и усилила защиту пространства имён.
Установка любого из вредоносных пакетов запускала цепочку заражения автоматически. Всё начиналось с preinstall-хука в файле package.json - этот скрипт срабатывал без участия пользователя. Он загружал и исполнял сильно обфусцированный файл размером 4,29 мегабайта. Первый слой скрывал код с помощью ротационного шифра (ROT), за которым следовало расшифрование двух блоков алгоритмом AES-128-GCM. Один блок содержал код для загрузки среды исполнения Bun, второй - основную вредоносную полезную нагрузку. После этого выполнялся уже не Node.js, а Bun, что затрудняло обнаружение системами мониторинга.
Полезная нагрузка была дополнительно защищена обфускатором Obfuscator.io и собственной криптографической схемой на основе PBKDF2-HMAC-SHA-256 с 200 тысячами итераций. Это серьёзно усложняло обратную разработку. После распаковки вредоносная программа начинала сбор всех учётных данных, до которых могла дотянуться. Она целенаправленно атаковала токены GitHub, токены npm, ключи доступа к облачным платформам (AWS, Azure, Google Cloud), секреты HashiCorp Vault, токены Kubernetes и даже учётные данные CircleCI. В локальной среде злоумышленники крали SSH-ключи, cookie-файлы браузеров, данные криптокошельков.
Особую опасность представлял механизм кражи секретов из памяти процессов на раннерах GitHub Actions. Вредоносная программа находила по PID процесс Runner.Worker, сканировала его память и извлекала строки, помеченные как isSecret:true. Это позволяло обходить штатное маскирование секретов. Для повышения привилегий в Linux-среде атакующие монтировали каталог /mnt и добавляли правило passwordless sudo - то есть любой запущенный от имени runner код мог выполнять команды с правами root.
Эксфильтрация данных строилась на трёх каналах. Первый - создание публичного репозитория в аккаунте жертвы с наименованием "Miasma: The Spreading Blight", куда записывались похищенные JSON-файлы. Второй - внедрение собственного кода в неосновные ветки репозиториев жертвы через Git Data API с поддельным коммитом от github-actions@github.com. Третий канал был зарезервирован для отправки данных на api.anthropic.com, но в обнаруженном образце этот путь был отключён. Сами токены передавались в двойном Base64-кодировании, а трафик маскировался под библиотеку python-requests.
Распространение заражения напоминало червя. Вредоносная программа перечисляла все репозитории и организации жертвы, внедряла себя в неосновные ветки, а также использовала похищенные npm-токены для перепубликации уже скомпрометированных пакетов с поддельными аттестациями SLSA через Sigstore (Fulcio и Rekor). Таким образом атака могла распространяться каскадно на всё более широкий круг проектов.
Злоумышленники подготовили механизм самоуничтожения. В коде присутствовал фиктивный токен-приманка IfYouInvalidateThisTokenItWillNukeTheComputerOfTheOwner. Если жертва отзывала этот токен, специальный триггер выполнял команду rm -rf ~/, стирая домашнюю директорию владельца. Это превращало любое расследование в потенциальную катастрофу.
Масштаб ущерба сложно переоценить. Под удар попали не только прямые пользователи пакетов из пространства @redhat-cloud-services, но и все проекты, зависящие от них транзитивно. Скомпрометированные токены открывали доступ к исходному коду, облачной инфраструктуре и реестру npm, что позволяло атакующим продолжать цепочку заражения. Подделка подписей SLSA подрывает доверие ко всей системе аттестации цепочек поставок.
Специалистам по безопасности Microsoft рекомендует немедленно проверить деревья зависимостей на наличие затронутых пакетов. Советуют закрепить известные безопасные версии и отключить выполнение скриптов при установке командой npm install с флагом --ignore-scripts. Все токены доступа - npm, GitHub, облачных провайдеров - нужно ротировать. Следует проверить учётные записи GitHub на наличие подозрительных публичных репозиториев с описанием "Miasma: The Spreading Blight" и провести аудит логов CI/CD на предмет необычных сетевых подключений и активности скриптов.
Этот инцидент - тревожный сигнал для всего сообщества разработчиков. Компрометация CI/CD пайплайна крупного проекта ставит под вопрос надёжность даже официально опубликованных пакетов с цифровыми подписями. Только комплексная защита на всех уровнях - от контроля зависимостей до мониторинга процессов сборки - может снизить риски подобных атак в будущем.
Индикаторы компрометации
Package
- @redhat-cloud-service
- @redhat-cloud-services/chrome-2.3.4)
- @redhat-cloud-services/frontend-components-advisor-components-3.8.2
- @redhat-cloud-services/frontend-components-notifications-6.9.3
- @redhat-cloud-services/frontend-components-testing-1.2.4
- @redhat-cloud-services/hcc-kessel-mcp-0.3.4
SHA256
- 25e121e3b7d300c0d0075b33e5eca39a3e6a659fb9cfee52b70ef71686628f1b
- 396cac9e457ec54ff6d3f6311cb5cc1da8054d019ce3ffa1de5741506c7a4ea4
- d5a97614d5319ce9c8e01fa0b4eb06fb5b9e54fa13b23d718174a1546444123b
- d8d170af3de17bb9b217c52aaaffdf9395f35ef015a57ef676e406c121e5e223
- f0641e053e81f0d01fa46db35a83e0a34494886503086866d956d14e81fd3e1c
- f88258e21592084a2f93a572ade8f9b91c0cd0e242f5cf6121ed7bad0f7bdd1f