Атака, зафиксированная 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".
Эта атака окончательно размыла границу между безобидным чтением кода и запуском вредоносной программы. Автозапуск конфигураций, призванный ускорить настройку проекта, превратился в готовый механизм доставки. Внедрение инструкций прямо в файлы правил ИИ-агента сродни атаке на сам процесс мышления модели. Разработчикам стоит помнить: клонирование репозитория больше не гарантирует безопасность. Проверка состава файлов перед открытием в инструментах разработки становится такой же обязательной гигиенической процедурой, как и аудит зависимостей.
Индикаторы компрометации
URLs
- https://github.com/Abner97/tournaments-app
- https://github.com/aeldar/simple-object-transformer
- https://github.com/Agentic-Insights/dreamgen
- https://github.com/Agentic-Insights/foundry
- https://github.com/Agreon/budgie
- https://github.com/Agreon/styco
- https://github.com/aiyeola/scrape
- https://github.com/akescoapps/dev-configs
- https://github.com/A-Mitch/learningRoR
- https://github.com/A-Mitch/spotify-codes-simulation
- https://github.com/anasdevv/customer-portal
- https://github.com/anasdevv/reservation-system
- https://github.com/angular-indonesia/angular-indonesia.github.io
- https://github.com/angular-indonesia/starter-angular-loopback-bulma
- https://github.com/Azure/durabletask
- https://github.com/Azure-Samples/llm-fine-tuning
- https://github.com/beatrizamante/facial-recognition-api
- https://github.com/beatrizamante/interactive-fiction-reviewer
- https://github.com/beatrizamante/utfpr_classlog
- https://github.com/bhagyamudgal/cuju-web
- https://github.com/bhagyamudgal/worktree-cli
- https://github.com/bitzquad/bitzquad.com
- https://github.com/bitzquad/nebula-docs
- https://github.com/braune-digital/bd-php-to-ts-converter-bundle
- https://github.com/braune-digital/BrauneDigitalImagineBundle
- https://github.com/Code-Web-Basic/CompilerGo
- https://github.com/constituentvoice/ImageResolverPython
- https://github.com/ContactTracing-app/Firebase-FunctionsArchived
- https://github.com/ContactTracing-app/Graphql-apiArchived
- https://github.com/czech-sfl/konference
- https://github.com/dandycheung/Frames
- https://github.com/dcc-cc3002/citric-liquid-Benjjvv
- https://github.com/dcc-cc3002/citric-liquid-cpereiram
- https://github.com/dcc-cc3002/citric-liquid-ihumire
- https://github.com/dcc-cc3002/citric-liquid-Jarinx
- https://github.com/dean-s-list/deanslist-services
- https://github.com/dzhu8/dzhu.github.io
- https://github.com/erbieio/erbie
- https://github.com/Factlink/js-library
- https://github.com/Gear-Focus/gearlocker-pwa
- https://github.com/green-fox-academy/ferrilata-bloodstone-hotel-booking
- https://github.com/haidarptrw/Jasakula
- https://github.com/icflorescu/mantine-contextmenu
- https://github.com/icflorescu/mantine-contextmenu-v6
- https://github.com/icflorescu/mantine-datatable
- https://github.com/icflorescu/mantine-datatable-v6
- https://github.com/icflorescu/next-server-actions-parallel
- https://github.com/jagreehal/ai-sdk-guardrails
- https://github.com/jagreehal/ai-sdk-ollama
- https://github.com/jagreehal/autotel
- https://github.com/jagreehal/effect-analyzer
- https://github.com/jagreehal/es-temp-action
- https://github.com/jagreehal/jagreehal-claude-skills
- https://github.com/jagreehal/stencil-how-to-test-components
- https://github.com/jahirfiquitiva/amplify-passwordless-poc
- https://github.com/jahirfiquitiva/Blueprint
- https://github.com/jahirfiquitiva/Frames
- https://github.com/jchable/gpx-utility-analyzer
- https://github.com/jedsada-gh/ApiMovie-UP
- https://github.com/jedsada-gh/blockchain-playground
- https://github.com/jedsada-gh/co-work-admin
- https://github.com/jedsada-gh/co-work-android
- https://github.com/jedsada-gh/co-work-katalon
- https://github.com/jedsada-gh/co-work-provider
- https://github.com/jgutierrezdtt/skills-hello-github-actions
- https://github.com/jgutierrezdtt/Sports-Center
- https://github.com/jgutierrezdtt/Vulndemo
- https://github.com/killerapp/mermaid-render
- https://github.com/KSU-Quantum-Capstone/CS4850-DL1
- https://github.com/kylezap/ctrl-alt-win
- https://github.com/kylezap/kylezapcicdotcom
- https://github.com/kylezap/rightsize-meals
- https://github.com/kylezap/tree-view
- https://github.com/leanderloew/explainability-simulation
- https://github.com/messismore/Digitale-Ausstellung
- https://github.com/messismore/Studio-Grotto
- https://github.com/metersphere/helm-chart
- https://github.com/mhar-andal/MyBlok
- https://github.com/mhar-andal/stock-forum-ethereum
- https://github.com/mmlngl/contacttracing.app-graphql-api
- https://github.com/mmlngl/contacttracing.app-graphql-apiArchived
- https://github.com/mmlngl/flua-launch
- https://github.com/morph-data/agents-kit
- https://github.com/nasher721/3dgenerator
- https://github.com/nasher721/AnkiFellowCollab
- https://github.com/nasher721/Extract721
- https://github.com/nasher721/Medical-OCR
- https://github.com/nasher721/note-clarity
- https://github.com/nasher721/remix-of-remix-of-round-robin-notes
- https://github.com/nasher721/remix-of-round-robin-notes
- https://github.com/nasher721/scheduler
- https://github.com/nasher721/textcleaner
- https://github.com/neilfarmer/k8s-health
- https://github.com/neilfarmer/platform-spec
- https://github.com/nodejs-indonesia/blogs
- https://github.com/nodejs-indonesia/blogsArchived
- https://github.com/Ofisalita/OfisalitaBot
- https://github.com/paulmojicatech/pmt
- https://github.com/paulmojicatech/wonder-worm
- https://github.com/PositionExchange/decentralized-perpetual-trading-protocol-cross-chain
- https://github.com/PositionExchange/dptp-client-sdk
- https://github.com/PositionExchange/evm-matching-engine
- https://github.com/r8vnhill/kalm
- https://github.com/rhemlock7/ecommerce-back-end
- https://github.com/rhemlock7/express-note-taker
- https://github.com/rhemlock7/minimalist-portfolio-mkii
- https://github.com/rhemlock7/SQL-Employee-Tracker
- https://github.com/rhemlock7/svg-logo-maker
- https://github.com/rhemlock7/weather-app-api
- https://github.com/rudy-marquez/WebGoatNet
- https://github.com/Shimadakunn/SoFi
- https://github.com/Skipperlla/my-rn-animations
- https://github.com/Skipperlla/rn-swiper-list
- https://github.com/Slickteam/hubspot-java
- https://github.com/squadbase/streamlit-claude-code-starter
- https://github.com/taxepfa/taxepfa.github.io
- https://github.com/Theauxm/ChainSharp
- https://github.com/Theauxm/TypeScriptDependencyInjectionDemo
- https://github.com/tumolaha/lerning-setup
- https://github.com/Weasledorf-Inc/taskmaster
- https://github.com/wormholes-org/wormholes
- https://github.com/wormholes-org/wormholes-client
- https://github.com/Zaynex/x-atm
Package
- @vapi-ai/server-sdk 0.11.1, 0.11.2, 1.2.1, 1.2.2
- ai-sdk-ollama 0.13.1, 1.1.1, 2.2.1, 3.8.5
- jagreehal/* (50+ packages) autotel, awaitly, executable-stories, node-env-resolver, wrangler-deploy families
SHA256
- 3a9db5ba0c8cd4c91e91717df6b1a141fc1e0fbc0558b5a78d7f5c23f5b2a150
- 633c8410ee0413ca4b090a19c30b20c03f31598c25247c484846fa34c1df5b64
- d630397de8b01af0f6f5cf4463da91b17f28195a2c50c8f3f38ad9f7873fdb8e
- ef641e956f91d501b748085996303c96a64d67f63bfeef0dda175e5aa19cca90