Технологии

Megalodon превратил GitHub Actions в бэкдор для 5 561 репозитория

Susan Hill

Автоматизированная кампания запушила 5 718 коммитов в 5 561 репозиторий GitHub за шесть часов в один из понедельников мая. Коммиты выглядели как обычное обслуживание CI («ci: add build optimization step», «build: improve ci performance», «chore: optimize pipeline runtime») и приходили от авторов с банальными именами: build-bot, auto-ci, pipeline-bot. К концу утра 18 мая в каждом из этих репозиториев лежал файл workflow с base64-закодированной bash-полезной нагрузкой внутри.

Кампания называется Megalodon. Исследовательская группа SafeDep раскрыла её 21 мая после того, как разобрала коммиты и прошла по следу артефактов до единственного сервера команд и управления по адресу 216.126.225.129:8443. Интересно не то, что GitHub был атакован. Интересно то, что атакующему вообще не нужно было компрометировать GitHub. Он использовал GitHub Actions — систему CI/CD, созданную именно для того, чтобы обеспечивать целостность кода, — как средство доставки бэкдора.

Два workflow: один массовый, один спящий

Megalodon работал в двух режимах. Массовый вариант добавлял новый файл workflow под именем SysDiag, который срабатывал при каждом push и каждом pull request и собирал всё, что проходило сквозь него. Прицельный вариант, Optimize-Build, действовал терпеливее: он подменял существующий workflow триггером workflow_dispatch, который остаётся спящим, пока кто-нибудь не запустит его вручную. Спящий бэкдор в CI-каталоге проекта заметить гораздо сложнее, чем новый workflow по имени SysDiag, потому что большинство мейнтейнеров не ревьюят файл, который они сами когда-то написали.

Когда workflow запускается, полезная нагрузка читает всё, до чего может дотянуться в окружении CI. Переменные окружения CI. Ключи доступа, секретные ключи и токены сессии AWS. Токены доступа GCP. Приватные SSH-ключи. Учётные данные .npmrc. Конфигурации Docker. Конфигурации Kubernetes. OIDC-токены GitHub Actions, позволяющие атакующему выдавать себя за сам workflow перед любой облачной учётной записью, к которой тот был авторизован. Перед выходом полезная нагрузка греппает исходный код репозитория по более чем тридцати разным паттернам секретов (API-ключи, пароли, фрагменты сертификатов) на случай, если кто-то из людей вклеил один из них. Эндпоинты метаданных AWS IMDSv2, GCP и Azure тоже опрашиваются, чтобы получить идентичность машины в облаке.

Пайплайн, который отгружает собственный бэкдор

Самой тяжёлой жертвой на сегодня стала Tiledesk — open source-платформа для работы с клиентами, девять GitHub-репозиториев которой были задеты. С 19 по 21 мая Tiledesk выложил свой пакет tiledesk-server в npm с уже скомпилированным бэкдором. Версии 2.18.6 — 2.18.12 пакета @tiledesk/tiledesk-server теперь несут код полезной нагрузки, установленный каждым разработчиком, который выполнил npm install в этом окне. Именно этот рычаг был целью Megalodon: вшить бэкдор в один open source-проект, чтобы его релизный пайплайн сам вшил бэкдоры в сотни зависимых проектов.

Black-Iron-Project потерял восемь репозиториев. Сотни проектов поменьше (учётные записи одиночных разработчиков, университетские кластеры, заброшенные песочницы) получили по одному-двум. Атакующий, похоже, не выбирал. Шаблон был такой: ширина важнее точности, одноразовые учётные записи со случайными восьмизначными именами пушили одинаковые сообщения коммитов минуту за минутой. Сервер C2 тихо записывал то, что возвращалось.

Почему файлы CI пережили аудит

Эта атака сработала по той же причине, по которой будет повторяться весь оставшийся 2026 год. Пайплайны CI/CD по своей природе построены на доверии. Разработчик, который не доверяет странному бинарнику из загрузки, без раздумий запустит файл workflow, появившийся в его репозитории на прошлой неделе, потому что файлы workflow именно для этого и существуют: это код, который платформа должна запустить. Журналы аудита есть, но почти никто их не читает. Новые коммиты приходят за подписями вроде build-bot и ci-bot. Диффы маленькие. Строка base64 в конце workflow специально непрозрачная.

Защитный сценарий простой и не радует. Ротируй каждый секрет, который коснулся репозитория с 18 мая по сегодня. Проводи аудит каталога .github/workflows в каждом проекте под управлением. Просматривай коммиты, в которых email автора не совпадает ни с одним известным членом команды. Считай любой base64-блоб внутри файла Actions виновным, пока он не будет декодирован. Организациям, использующим Tiledesk, нужно откатиться на 2.18.5 или ждать чистого релиза. Тем, у кого есть OIDC-доверие между Actions и облачным провайдером, нужно отозвать его и выпустить заново.

Megalodon — первая кампания такого масштаба, которая обращается с самим CI-workflow как с мягкой целью. Не последняя. Урок, который оставляет эта атака, разработчики уже слышали, просто потише: та часть пайплайна, которую ты не читаешь, — это та часть, которую за тебя пишет атакующий.

Обсуждение

Имеется 0 комментариев.