Проблема не только в плохих workflow#
Trail of Bits три месяца работала над укреплением zizmor, статического анализатора GitHub Actions. Фокус был узкий, но критичный: может ли инструмент правильно парсить YAML, используемый реальными проектами.
GitHub Actions — ядро инфраструктуры open-source. Слабый workflow может раскрыть секреты, выполнить код злоумышленника или опубликовать скомпрометированные артефакты. Пример марта 2026 с aquasecurity/trivy-action показывает, что злоумышленники использовали поведение CI для кражи секретов и внедрения бэкдоров.
Статический анализатор полезен только если он корректно читает workflow. Сбои, неверная интерпретация YAML или неправильные локаторы создают слепые зоны для мейнтейнеров.
Trail of Bits исправила несколько таких ошибок в zizmor. Триггером стал YAML anchors в GitHub Actions (сентябрь 2025), позволяющий определять значение один раз и повторно использовать через алиасы. Это снижает дублирование, но усложняет анализ: часть workflow может зависеть от определения в другом месте файла.
Что тестировалось#
Была собрана реальная тестовая база. Через BigQuery GitHub dataset выбрали 10,000 популярных репозиториев (2022–2025), отфильтровали 6,612 с GitHub Actions и скачали все workflow файлы — всего 41,253 YAML.
zizmor падал на 45 workflow — небольшой процент, но критичный для безопасности. Каждое падение — потенциальная слепая зона.
Только 43 workflow использовали anchors (~0,1%). Некоторые из них — ключевые open-source проекты. GitHub Actions теперь поддерживает anchors, и их использование может расти.
Выделялись два паттерна: повторное использование шагов между job (Bitcoin Core CI) и закрепление action через SHA для последующего reuse. Оба требуют корректного разрешения нелокального YAML.
Ошибки с anchors#
Обнаружено четыре бага:
- Алиасы внутри списков обрабатывались некорректно. Zizmor трактовал содержимое как развернутое, что могло вызвать падение или неверные локаторы.
- Префиксы anchors попадали в значения в flow sequences, что ломало шаги.
- Дублированные anchors вызывали панику — YAML допускает переопределение, Zizmor предполагал уникальность.
- Скалярные алиасы ломали один путь аудита из-за лишнего уровня индирекции.
Эти баги — не эксплуатационные, а парсерные. Статический анализ требует точной модели языка. Trail of Bits исправила их, добавила интеграционные тесты и обновила документацию.
Другие проблемы корпуса#
Корпус выявил баги вне anchors:
- Edge-case десериализации: числа вместо строк, float вместо int, строки вместо mapping. Zizmor отвергал весь workflow.
- Вычислитель выражений GitHub Actions: проверен и согласован с официальными тестами.
- Некоторые падения связаны с upstream зависимостями; были созданы issues и pull requests.
20 issues и 15 PR закрыли проект.
Значение для CI-безопасности#
Zizmor стал лучше анализировать workflows. GitHub Actions — не просто конфигурация, а план исполнения с доступом к секретам, токенам, сборкам, публикациям. Неправильный анализ = слепые зоны = риски supply-chain.
YAML полон сюрпризов: anchors, aliases, implicit typing, дубли, flow sequences и platform-specific особенности создают разрыв между человеческим восприятием и инструментом.
Для мейнтейнеров: anchors не опасны сами по себе, но сложные YAML повышают стоимость проверки. Используя anchors для сокращения дублирования, убедитесь, что линтеры и сканеры их корректно обрабатывают.
Для авторов инструментов метод важнее: соберите реальные данные, запустите анализатор, проанализируйте сбои, превратите их в тесты. Синтетика необходима, но недостаточна.
Что проверить#
- Запустите zizmor или аналогичный анализатор на активных workflow, особенно для релизов и публикаций.
- Следите за падениями и ошибками парсинга; не игнорируйте их.
- Если используются YAML anchors или aliases, убедитесь, что инструменты их поддерживают.
- Предпочитайте закрепленные action references и проверяйте паттерны reuse.
- Внимательно проверяйте workflows с выражениями, где данные PR, issues или пользовательский ввод влияют на shell команды или привилегированные шаги.
Парсер CI — часть периметра безопасности.