Червь Miasma активирует вредоносную нагрузку через ИИ-агенты и редакторы кода при открытии репозиториев GitHub

security

Атака, зафиксированная 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

Комментарии: 0