Как предотвратить атаки внедрения в GitHub Actions: Руководство по обнаружению и защите
Узнайте, как защитить репозитории GitHub от атак внедрения в рабочие процессы (workflow injections), используя встроенные инструменты, безопасные практики и автоматическое сканирование.
Как предотвратить атаки внедрения в GitHub Actions
Атаки внедрения в рабочие процессы GitHub Actions входят в число наиболее распространённых уязвимостей в репозиториях GitHub, согласно отчёту GitHub’s 2024 Octoverse. Эти атаки эксплуатируют ненадёжные входные данные в рабочих процессах (workflows), позволяя злоумышленникам выполнять вредоносные команды с правами уровня workflow. Специалисты по безопасности могут снизить эти риски с помощью встроенных инструментов GitHub, безопасных практик кодирования и автоматического сканирования.
Технические детали атак внедрения в workflow
Атаки внедрения в GitHub Actions происходят, когда злоумышленник отправляет вредоносные входные данные — например, название issue или имя ветки — которые впоследствии выполняются рабочим процессом. Уязвимость возникает из-за синтаксиса ${{}}, который расширяет ненадёжные входные данные во время предобработки, потенциально изменяя поведение workflow. Например:
- name: print title
run: echo "${{ github.event.issue.title }}"
Злоумышленник может создать название issue, например `touch pwned.txt`, которое выполнится как команда при запуске workflow. Поскольку рабочие процессы часто наследуют повышенные права, это может привести к несанкционированному доступу или утечке данных.
Основные векторы атак
- Расширение ненадёжных входных данных: Прямое использование
${{}}в командахrun. - Повышение привилегий: Рабочие процессы с избыточными правами (например, доступ на запись или раскрытие секретов).
- Триггер
pull_request_target: Обходит стандартные ограничения безопасности, предоставляя форкам PR доступ к секретам и правам на запись.
Анализ последствий
Успешные атаки внедрения в workflow могут привести к:
- Выполнению произвольного кода: Вредоносные команды выполняются с правами workflow.
- Утечкам данных: Раскрытие секретов репозитория или конфиденциальных файлов.
- Компрометации репозитория: Несанкционированные изменения кода или CI/CD-конвейеров.
Риск распространяется не только на ветку main — злоумышленники могут атаковать любую публично доступную ветку с уязвимыми workflow.
Стратегии защиты
1. Использование переменных окружения для ненадёжных входных данных
Избегайте прямого расширения ненадёжных входных данных в командах run. Вместо этого передавайте данные через переменные окружения:
- name: print title
env:
TITLE: ${{ github.event.issue.title }}
run: echo "$TITLE"
Хотя это не санитизирует входные данные, такой подход ограничивает поверхность атаки, предотвращая внедрение команд.
2. Принцип минимальных привилегий
Ограничивайте права workflow с помощью ключа permissions для GITHUB_TOKEN:
permissions:
contents: read
issues: write
По умолчанию предоставляйте доступ только на чтение, если права на запись не требуются явно.
3. Избегайте использования pull_request_target
Используйте pull_request вместо pull_request_target, чтобы блокировать форкам PR доступ к секретам или правам на запись. Если использование pull_request_target неизбежно, проводите аудит workflow на предмет рисков внедрения и ограничивайте права.
4. Сканирование workflow с помощью CodeQL
CodeQL от GitHub теперь поддерживает автоматическое сканирование рабочих процессов GitHub Actions. Включите его следующим образом:
- Стандартная настройка: Автоматически сканирует защищённые ветки.
- Расширенная настройка: Добавьте
actionsв список целевых языков в конфигурации CodeQL.
Трэкинг заражённых данных (taint tracking) в CodeQL выявляет потоки ненадёжных данных, обнаруживая скрытые риски внедрения.
Рекомендации
- Сканируйте все ветки: Уязвимости в feature-ветках могут быть эксплуатированы, даже если
mainзащищена. - Сочетайте инструменты с ручной проверкой: Ни один инструмент не эффективен на 100% — поддерживайте мышление, ориентированное на безопасность.
- Обучайте команды: Делитесь четырёхчастной серией GitHub по защите workflow.
Следующие шаги
Включите сканирование кода с помощью CodeQL в своих репозиториях для проактивного обнаружения атак внедрения в workflow. Для расширенных конфигураций добавьте actions как целевой язык в настройках CodeQL.
Дополнительные сведения см. в документации GitHub по безопасности workflow.