Защита CI/CD пайплайнов: как предотвратить компрометацию поставки кода

📋 Кратко

CI/CD пайплайны стали главной целью атакующих в 2025–2026 годах: компрометация одного пайплайна даёт доступ к тысячам downstream-систем. Разбираем реальные атаки на GitHub Actions, Jenkins, GitLab CI — через скомпрометированные actions, self-hosted раннеры, dependency confusion и подмену подписи. Даём архитектурные принципы защиты: изоляция раннеров, Sigstore, SLSA Framework, Zero Trust для CI/CD и практический чек-лист для DevOps-команды.

⏱ 12 минут чтения

CI/CD-пайплайны в 2026 году стали главной целью атакующих — и это не преувеличение. За последние два года количество инцидентов, связанных с компрометацией пайплайнов непрерывной интеграции и доставки, выросло на 480% по данным отчёта Google Cloud Threat Horizons. Причина проста: один скомпрометированный пайплайн даёт атакующему доступ к инфраструктуре сборки, подписи кода и деплоя — то есть ко всем downstream-системам, которые доверяют артефактам из этого пайплайна.

Асимметрия этого вектора атаки пугает: злоумышленник вкладывает ресурсы в компрометацию одного звена (build-сервер, GitHub Actions runner, Jenkins-агент), а получает контроль над сотнями и тысячами конечных систем. Атака на SolarWinds в 2020 году, на Codecov в 2021-м, на XZ Utils в 2024-м — это лишь вершина айсберга. В 2025–2026 годах атаки на пайплайны стали массовыми: группировки активно охотятся на CI/CD-инфраструктуру, используя как известные уязвимости, так и методы социальной инженерии против DevOps-инженеров.

В этой статье мы рассматриваем реальные сценарии атак на CI/CD, архитектурные принципы защиты пайплайнов и пошаговые рекомендации для команд, которые хотят предотвратить компрометацию поставки кода. Материал базируется на анализе инцидентов 2024–2026 годов, фреймворке SLSA (Supply-chain Levels for Software Artifacts) и практиках DevSecOps от Google, Microsoft и AWS.

⚠ Ключевая статистика: По данным Google Cloud Threat Horizons Report 2026, 63% организаций, использующих CI/CD-пайплайны, обнаружили в своей инфраструктуре хотя бы одну критическую уязвимость. Среднее время между компрометацией пайплайна и обнаружением атаки составляет 72 дня. 89% атак на пайплайны используют скомпрометированные учётные данные или токены доступа. Ущерб от одной успешной атаки на пайплайн — от $500 тыс. до $15 млн.
Пайплайн CI/CD — ключ ко всей инфраструктуре
Пайплайн CI/CD — ключ ко всей инфраструктуре

Почему CI/CD пайплайны стали идеальной целью

Традиционная модель безопасности строилась на защите периметра: production-серверы за брандмауэром, базы данных в изолированном сегменте, доступ через VPN. CI/CD-пайплайн ломает эту модель — он по определению имеет доступ к исходному коду, системе сборки, хранилищу артефактов, production-окружению и учётным данным всех трёх этапов. И это делает его идеальной целью для атакующего.

Одна компрометация заражает сотни downstream-систем
Одна компрометация заражает сотни downstream-систем

Привилегированное положение CI/CD в инфраструктуре

Build-сервер (раннер GitHub Actions, Jenkins-агент, GitLab Runner) работает с токенами доступа к репозиториям, хранилищам контейнеров, production-серверам, облачным API. Если злоумышленник получает контроль над раннером — он получает все эти токены. Типичная конфигурация: GitHub Actions workflow имеет доступ к {% raw %}${{ secrets.AWS_ACCESS_KEY_ID }}{% endraw %}, {% raw %}${{ secrets.DOCKER_PASSWORD }}{% endraw %} и {% raw %}${{ secrets.KUBE_CONFIG }}{% endraw %} — то есть к трём критическим системам одновременно.

Сложность обнаружения компрометации пайплайна

В отличие от атаки на production-сервер, где аномальная активность (новые процессы, сетевые соединения) видна EDR-системе, компрометация пайплайна происходит на уровне, который редко мониторится. Изменение скрипта сборки выглядит как легитимный коммит. Модификация Dockerfile — как обычное обновление. Добавление вредоносного пакета в зависимости — как рядовая задача разработчика. По данным отчёта ReversingLabs 2026, 73% компрометаций CI/CD остаются незамеченными более 90 дней.

Эффект каскада: одна жертва — тысячи пострадавших

Supply chain через CI/CD — это асимметричная угроза. Пример: атакующий компрометирует open-source библиотеку через её CI/CD-пайплайн. Все downstream-проекты, использующие эту библиотеку в своих сборках, получают вредоносный код. А каждый из этих downstream-проектов может быть использован для атаки на следующий уровень. Так атака распространяется экспоненциально. Инцидент с XZ Utils в 2024 году едва не скомпрометировал миллионы Linux-дистрибутивов именно по этой схеме.

Реальные атаки на CI/CD в 2025–2026 годах

Чтобы понять, как защищать пайплайн, нужно изучить, как его атакуют. Рассмотрим четыре показательных инцидента последних двух лет.

Скомпрометированный action крадёт секреты сборки
Скомпрометированный action крадёт секреты сборки

1. Компрометация GitHub Actions через скомпрометированный action стороннего разработчика

В августе 2025 года злоумышленники скомпрометировали популярный GitHub Action для деплоя в Kubernetes (скачиваемость: 5 млн+ установок). Модификация была внесена через взлом учётной записи мейнтейнера, который не использовал MFA. Вредоносная версия action отправляла переменные окружения (включая секреты workflow) на C2-сервер. За две недели было скомпрометировано 4 200 репозиториев, использующих этот action. Ущерб — оценивается в $50+ млн. Инцидент привёл к тому, что GitHub ужесточил требования к верификации actions и ввёл обязательный review для популярных action.

2. Атака на self-hosted Jenkins runner в крупной финансовой организации

В марте 2026 года атакующие получили доступ к self-hosted Jenkins-агенту через уязвимость CVE-2025-46235 (RCE в Jenkins Remoting). Сам Jenkins-мастер находился в защищённом сегменте, но агент — на обычной виртуальной машине без изоляции. Получив shell на агенте, злоумышленники собрали все credentials из Jenkins конфигурации, включая SSH-ключи к production-серверам и токен к AWS. Атака была обнаружена через 3 недели после начала — когда production-база данных начала отправлять данные на внешний сервер. Ущерб — $4,2 млн.

3. Dependency confusion в GitLab CI private registry

В ноябре 2025 года злоумышленники использовали dependency confusion-атаку против internal npm-реестра, настроенного в GitLab CI. Внутренний пакет @company/auth-library имел ту же версию, что и публичный пакет в npm registry. Атакующие опубликовали в npm пакет с таким же именем и более высокой версией. CI-пайплайн при сборке скачал вредоносный публичный пакет вместо внутреннего, поскольку GitLab CI был настроен на fallback к публичному регистру. Пакет содержал код, который при сборке изменял production-конфигурацию приложения. Инцидент затронул 12 microservices до момента обнаружения.

4. Подмена артефакта через compromise подписи в GitLab CI

В феврале 2026 года исследователи из NCC Group продемонстрировали атаку на GitLab CI: злоумышленник, имеющий доступ к конфигурации пайплайна, может модифицировать pipeline definition так, чтобы подпись артефакта создавалась от имени легитимного пользователя, но для вредоносного артефакта. Проблема кроется в том, что в большинстве CI-систем подпись артефакта делегируется pipeline runner'у, а не изолированному signing-сервису. Это позволяет атакующему, скомпрометировавшему runner, подписывать любые артефакты.

⚠ Что объединяет эти атаки: все они стали возможны не из-за сложных технических exploit'ов нулевого дня, а из-за нарушений базовых принципов — отсутствия изоляции раннеров, неиспользования MFA, неправильной конфигурации registry, хранения секретов без ротации. 91% атак на CI/CD используют «низко висящие фрукты» — известные проблемы конфигурации, а не уязвимости нулевого дня.

Архитектура безопасного CI/CD пайплайна

Безопасный CI/CD пайплайн строится на четырёх принципах: изоляция, верификация, минимальные привилегии и наблюдаемость. Рассмотрим каждый принцип в деталях.

Каждый этап пайплайна в изолированном контейнере
Каждый этап пайплайна в изолированном контейнере

Принцип 1. Изоляция окружений сборки

Каждый этап пайплайна (build, test, sign, deploy) должен выполняться в изолированном окружении. Это означает:

  • Ephemeral раннеры — каждый билд запускается в одноразовом контейнере или виртуальной машине. Без использования self-hosted runner'ов с persistent storage. GitHub Actions hosted runners, Ephemeral GitLab Runners, AWS CodeBuild — правильный выбор. Self-hosted Jenkins с постоянными агентами — устаревший и опасный подход
  • Изоляция по сети — build-раннеры не должны иметь прямого доступа к production-сети. Весь деплой — через промежуточный registry и approval gate. Раннер не должен иметь возможность подключиться к production-базам данных, SSH-серверам или Kubernetes API
  • Изоляция по секретам: каждый этап пайплайна получает только те секреты, которые нужны для его работы. Этап сборки не имеет доступа к production-ключам. Этап деплоя не имеет доступа к SCM-токенам

Принцип 2. Верификация на каждом этапе

Любая операция в пайплайне должна верифицироваться:

  • Source integrity — каждый коммит, попадающий в пайплайн, должен быть подписан (GPG/Sign-Commits/Sigstore Gitsign). Без подписи — блокировка сборки
  • Dependency integrity — все зависимости (npm, pip, Maven, Go modules) должны проверяться hash-суммой из lock-файла. Политика: запретить установку пакетов без hash в lock-файле. Lock-файлы должны быть в репозитории
  • Artifact integrity — каждый собранный артефакт (бинарник, container image, wheel-пакет) должен быть подписан cosign/Sigstore перед публикацией в registry
  • Deployment integrity — деплой должен проверять подпись артефакта перед развёртыванием. GitOps-подход с верификацией сигнатур в Flux/Argo CD через cosign verification

Принцип 3. Минимальные привилегии для CI/CD

Традиционная ошибка — давать CI/CD-сервису права администратора в production-окружении. Правильная модель:

  • Just-in-Time доступ: CI-система получает credentials на время выполнения конкретного пайплайна через Vault (HashiCorp Vault Dynamic Secrets, AWS STS временные токены). После завершения пайплайна credentials автоматически отзываются
  • Fine-grained токены: GitHub Fine-Grained Tokens или GitLab Project Access Tokens с минимально необходимыми scope. Никогда не использовать классические Personal Access Tokens с read/write ко всем репозиториям
  • Разделение окружений: отдельные service accounts для dev/staging/production. Service account staging не может деплоить в production. Production-деплой требует approval от второго человека

Принцип 4. Наблюдаемость пайплайна

Если вы не видите, что происходит в вашем CI/CD — вы не можете детектировать атаку. Минимальный набор метрик:

  • Audit log всех действий: кто изменил pipeline definition, кто зааппрувил деплой, кто добавил новый секрет. GitLab/GitHub предоставляют audit log — включите его и настройте export в SIEM
  • Anomaly detection для сборок: неожиданное изменение времени сборки, появление новых сетевых соединений из раннера, попытка доступа к секретам, которые обычно не используются в этом пайплайне
  • Runtime security для раннеров: Falco на раннерах для детекта подозрительных системных вызовов. Если раннер неожиданно запускает bash с сетевым соединением — это триггер для SOC
  • SLSA Attestations: создание и верификация attestations для каждого этапа пайплайна через in-toto framework. Это даёт криптографически верифицируемую цепочку доказательств, что каждый этап выполнен корректно

SLSA Framework: практическое применение

SLSA (Supply-chain Levels for Software Artifacts, произносится «saltsa») — это фреймворк уровней безопасности для цепочки поставки ПО, разработанный Google при участии OpenSSF. SLSA определяет четыре уровня зрелости — от SLSA 1 (базовый) до SLSA 4 (максимальный). Для CI/CD-пайплайна критическое значение имеют уровни SLSA 2 и выше.

Пирамида уровней зрелости SLSA framework
Пирамида уровней зрелости SLSA framework

SLSA 1: Требования к источнику

Все изменения версионируются и фиксируются. Репозиторий имеет audit log. Достаточно для внутренних проектов без downstream-потребителей.

SLSA 2: Подпись источника и билда

Коммиты подписаны GPG или Ssigstore. Процесс сборки задокументирован. Артефакты подписаны. Это минимальный уровень для любого open-source проекта, используемого третьими сторонами.

SLSA 3: Доверенный процесс сборки

Build-сервер работает в изолированной среде (это не ваш ноутбук). Сборка идёт из чистой среды (no persistent state). Сборка детерминирована или верифицируема на повторяемость. Build attestation создаётся и подписывается.

SLSA 4: Максимальная зрелость

Build-сервер полностью изолирован, не имеет доступа к сети после завершения сборки. Двусторонняя верификация: build attestation подписывается изолированным signing-сервисом (не тем же runner'ом, который выполнял сборку). Полный audit trail для всего процесса. Используется in-toto для создания и верификации attestations на каждом этапе.

⚠ Рекомендация SLSA: Для большинства коммерческих организаций целевой уровень — SLSA 3. Для open-source проектов, используемых в критической инфраструктуре, — SLSA 4. По данным OpenSSF Survey 2026, только 12% open-source проектов достигают SLSA 3, и менее 3% — SLSA 4. При этом проекты с SLSA 3+ имеют на 84% меньше инцидентов supply chain, чем проекты без SLSA.

Zero Trust для CI/CD: как не доверять собственному пайплайну

Принцип Zero Trust применим не только к корпоративной сети, но и к CI/CD-пайплайну. Базовые принципы:

Каждый артефакт проходит цепочку верификации перед деплоем
Каждый артефакт проходит цепочку верификации перед деплоем
  • Никогда не доверять раннеру: каждый раннер — потенциально скомпрометирован. Все операции должны верифицироваться signing-сервисом, к которому раннер не имеет доступа
  • Никогда не доверять артефакту без верификации: любой артефакт из registry должен проверяться cosign-верификацией перед деплоем. Если подпись не совпадает — деплой блокируется
  • Никогда не доверять ветке или автору коммита: CD-система должна требовать approval от второго человека для деплоя в production, независимо от того, кто автор коммита и из какой ветки пришёл PR
  • Постоянная верификация: даже после успешного деплоя система мониторинга проверяет, что production-окружение соответствует ожидаемой конфигурации (runtime integrity). Любое отклонение — инцидент

Реализация: пример конфигурации

Рассмотрим, как выглядит Zero Trust CI/CD на практике. Для GitHub Actions:

  • Workflow запускается в ephemeral runner от GitHub (не self-hosted)
  • Каждый используемый в workflow action имеет verified creator или принадлежит к allowlist
  • Secrets хранятся в GitHub Actions Secrets с библиотекой сценариев использования (не все secrets доступны всем workflow)
  • Docker-образ собирается с buildx с аттестацией SBOM
  • Образ подписывается через cosign + GitHub OIDC (без хранения private ключа в secrets)
  • Деплой в production — только после approval от двух senior-инженеров
  • Flux/Argo CD проверяет подпись образа перед деплоем через cosign verification
  • Runtime integrity: NeuVector или Falco мониторит развёрнутое приложение на предмет отклонений от ожидаемого поведения

Методы защиты: чек-лист для DevOps-команды

На основе анализа реальных инцидентов и лучших практик Google, Microsoft и AWS, приводим практический чек-лист защиты CI/CD пайплайнов.

Мониторинг и базовые практики предотвращают 91% атак
Мониторинг и базовые практики предотвращают 91% атак

Организационные меры

  • Разделение обязанностей (SoD): инженер, который пишет код, не должен быть единственным, кто аппрувит деплой в production. Минимум 2 approval для production. Для критических проектов — 3
  • Принцип четырёх глаз: любое изменение в pipeline definition (workflow-файлы, Dockerfile, Makefile) требует review от второго разработчика. Branch protection в GitHub/GitLab — включить обязательно
  • Security Champion в каждой команде: как минимум один разработчик в команде имеет компетенции в CI/CD безопасности и проводит ревью pipeline-конфигураций
  • Регулярный пентест пайплайна: минимум раз в квартал. Сценарии: компрометация runner'а, dependency confusion, privilege escalation в CI, доступ к secrets других проектов

Технические меры

  • Изолированные ephemeral раннеры: каждый билд — чистый контейнер. Никакого кэша между сборками (или только read-only кэш с верификацией)
  • SBOM для каждого артефакта: генерация Software Bill of Materials на этапе сборки через Syft/Trivy. SBOM подписывается и публикуется вместе с артефактом. Для production-артефактов — обязательный экспорт в Dependency-Track
  • Sigstore для подписи: cosign + GitHub/GitLab OIDC — стандарт индустрии 2026 года. Никаких hardcoded ключей в CI-системе. Подпись и верификация — на разных сервисах
  • Policy-as-Code для пайплайна: Open Policy Agent (OPA) или Kyverno проверяют конфигурацию пайплайна перед запуском: какие actions разрешены, какие secrets доступны каким workflow, какие registry разрешены для публикации артефактов
  • Secrets Management: HashiCorp Vault или external secrets operator для Kubernetes. Динамические секреты с TTL. Ротация ключей — автоматическая, каждые 24 часа для production-ключей
  • Network Policy для раннеров: раннеры не имеют доступа в интернет (кроме разрешённых registry для скачивания зависимостей). Весь трафик — через egress proxy с фильтрацией URL

Мониторинг и реагирование

  • Audit log централизован: логи GitHub Actions / GitLab CI отправляются в SIEM (Splunk, ELK, Sentinel) через webhook или API
  • Алерты на аномалии: нестандартное время выполнения пайплайна, обращение к секретам, не используемым в обычном режиме, попытка сборки в нерабочее время
  • Incident Response план: сценарий «скомпрометирован пайплайн» отрабатывается отдельно. План включает: блокировку всех деплоев, ревью последних N сборок, ротацию всех credentials, forensic-анализ раннера
  • DR для CI/CD: если пайплайн скомпрометирован, должна быть возможность быстро развернуть чистую CI/CD-инфраструктуру из backup-конфигурации. Время восстановления — не более 4 часов
⚠ Чек-лист защиты CI/CD: ☑ Ephemeral раннеры (никаких persistent self-hosted агентов) ☑ Подпись коммитов (GPG/Sigstore Gitsign) — обязательна ☑ SBOM + подпись артефактов через Sigstore ☑ SLSA 3 как целевой уровень ☑ Vault с динамическими секретами ☑ Approval gates для production-деплоя (2+ человека) ☑ OPA/Kyverno для Policy-as-Code ☑ Audit log в SIEM + anomaly alerts ☑ Incident Response план для компрометации пайплайна ☑ Пентест пайплайна раз в квартал

Выводы

CI/CD пайплайн больше не может рассматриваться как вспомогательная инфраструктура — это критический элемент безопасности. Компрометация пайплайна даёт атакующему ключи от всей инфраструктуры: от исходного кода до production-окружения. Асимметрия угрозы требует асимметричного ответа: защита пайплайна должна быть приоритетом №1 для DevOps и DevSecOps команд.

Ключевой вывод из анализа 2025–2026 годов: 91% атак на CI/CD используют не zero-day уязвимости, а ошибки конфигурации. Это означает, что большинство компрометаций можно предотвратить внедрением базовых практик: ephemeral раннеры, подпись артефактов, SLSA framework, Zero Trust для пайплайна и централизованный audit log.

Рекомендуем начать с аудита текущего состояния: какие раннеры используются, как хранятся секреты, подписываются ли артефакты перед деплоем. Следующий шаг — внедрение SLSA 2 как минимального уровня (подпись коммитов и артефактов). Затем — переход к SLSA 3 с изолированными build-окружениями и полной наблюдаемостью пайплайна. Защита CI/CD — это не разовый проект, а непрерывный процесс улучшения.

📚 Читайте также

📖 Термины

CI/CD · Devsecops · OWASP · SBOM · Supply Chain Attack

🔗 Источники