Атака, зафиксированная 3 июня 2026 года, обозначила опасный поворот в цепочках поставок программного обеспечения. Новая волна червя Miasma отказалась от заражения через реестр npm и напрямую нацелилась на рабочие папки разработчиков. Теперь вредоносный код срабатывает не в момент установки пакета, а когда программист просто открывает скопированный репозиторий в современном инструменте. Такой подход угрожает каждому, кто пользуется ИИ-агентами или редакторами с функцией автозапуска. Более 120 проектов на GitHub, включая официальный репозиторий Microsoft, уже получили скрытые инструкции, превращающие безобидное действие в запуск многоступенчатого загрузчика.
Описание
Злоумышленники добавили в несколько репозиториев коммит с безобидной подписью "chore: update dependencies [skip ci]". Сообщение подавляло процессы непрерывной интеграции, чтобы не привлекать внимания. Сам коммит не менял зависимости, а вносил шесть файлов конфигурации для пяти популярных инструментов. Один из этих файлов - дроппер (программа-доставщик), скрытый в .github/setup.js. Остальные пять служили спусковыми крючками. Каждый файл задействовал легитимную возможность автозапуска: для Claude Code и Gemini CLI настраивался хук начала сеанса (команда, исполняемая при старте агента), для Cursor - всегда активное правило, предписывающее агенту выполнить скрипт, а для VS Code - задача, срабатывающая при открытии папки. Пакетный менеджер тоже не остался в стороне - тестовый скрипт в package.json перенаправили на запуск того же дроппера. Таким образом, клонирование репозитория оставалось безопасным, а вот его открытие в любом из перечисленных приложений немедленно запускало цепочку заражения.
Совместное расследование StepSecurity и JFrog ранее пролило свет на первую, npm-версию той же кампании. Однако новая волна полностью перенесла точку входа из пакетного менеджера в редактор. Дроппер .github/setup.js представляет собой одну строку JavaScript, обёрнутую в try/catch. Она собирает массив кодов символов, применяет к ним шифр Цезаря со сдвигом и передаёт результат функции eval. Статическая расшифровка (без исполнения) вскрывает загрузчик, использующий алгоритм AES-128-GCM. Загрузчик расшифровывает два встроенных блоба. Первый - основная полезная нагрузка, второй - вспомогательная программа-загрузчик среды выполнения. Вредоносный код проверяет, установлена ли среда Bun, и при необходимости загружает её с официального зеркала GitHub. Затем он запускает полезную нагрузку именно под Bun, а не под Node.js, что изолирует активность от штатного окружения разработчика.
Полезная нагрузка, в свою очередь, работает как универсальный сборщик учётных данных. Она сканирует файлы и переменные окружения на предмет секретов облачных платформ, Kubernetes, npm, GitHub и других сервисов. Добытые токены доступа отправляются в заранее созданные публичные репозитории-ловушки. После этого червь использует украденные ключи для самовоспроизводства. Он с высокой скоростью вносит вредоносные коммиты во все репозитории, доступные скомпрометированной учётной записи. Именно так один и тот же отпечаток возник сразу в пяти проектах сопровождающего icflorescu - пауза между коммитами составила менее минуты. Автоматизация и единообразие изменений не оставляют сомнений: действовал не человек, а скрипт.
Масштаб кампании выходит далеко за пределы одной учётной записи. Поиск по GitHub выявил характерную пару файлов - .claude/settings.json и .gemini/settings.json с вызовом node .github/setup.js - в 123 репозиториях, принадлежащих десяткам владельцев. Среди них оказались как личные проекты, так и репозиторий Azure/durabletask с 1718 звёздами. Там злоумышленник применил украденный персональный токен доступа реального контрибьютора Microsoft и подделал дату коммита, указав 2020 год. Так вредоносный код затерялся в спящей ветке. Это доказывает, что червь не просто размножался вслепую, а умел манипулировать метаданными для лучшей маскировки.
Каждая волна пересобирала дроппер заново. Менялись ключи шифрования, сдвиг Цезаря и, как следствие, хеш файла. Неизменными оставались архитектура загрузчика и набор файлов-триггеров. Такой приём усложняет обнаружение по статическим сигнатурам. Чтобы остаться незамеченным, авторы вредоносной программы расширили и парк инструментов-жертв. Если первые образцы Miasma обходились только Claude Code и VS Code, то теперь список пополнился Gemini CLI и Cursor. Поверхность атаки росла вместе с популярностью ИИ-агентов.
Для разработчиков критически важно изменить отношение к конфигурационным файлам в корне проекта. Папки .vscode, .claude, .gemini, .cursor обычно исключаются из рецензирования. Именно их и эксплуатирует данная угроза. Появление в репозитории правил Cursor или хуков сеанса - это не шум редактора, а сигнал компрометации. Особенно если рядом лежит файл .github/setup.js или подозрительно изменён package.json. Ни в коем случае нельзя открывать такой проект в VS Code, Cursor или запускать агентов Claude Code и Gemini. Безопасное клонирование означает сначала проверку содержимого, и только потом работу с кодом.
Индикаторы заражения уже документированы. Для исходной ветки icflorescu хеш дроппера setup.js известен, для Azure/durabletask он отличается, но структура совпадает. Основная полезная нагрузка червя сохраняет постоянный хеш внутри волны. Временные файлы создаются в /tmp с именами вида p<случайные символы>.js и b-<случайные символы>/bun. Сеть репозиториев-ловушек использует аккаунты windy629, HerGomUli и liuende501. Все они содержат репозитории с характерным описанием "Miasma - The Spreading Blight".
Эта атака окончательно размыла границу между безобидным чтением кода и запуском вредоносной программы. Автозапуск конфигураций, призванный ускорить настройку проекта, превратился в готовый механизм доставки. Внедрение инструкций прямо в файлы правил ИИ-агента сродни атаке на сам процесс мышления модели. Разработчикам стоит помнить: клонирование репозитория больше не гарантирует безопасность. Проверка состава файлов перед открытием в инструментах разработки становится такой же обязательной гигиенической процедурой, как и аудит зависимостей.