tj-actions/changed-files - CVE-2025-30066 - секретная утечка

CVE‑2025‑30066: когда tj‑actions/changed‑files приводит к утечке секретной информации

Утечка секретной информации не всегда связана с плохим кодом или уязвимыми библиотеками. Иногда это зависит от того, как мы управляем секретной информацией во время непрерывной интеграции, и CVE‑2025‑30066 — хрестоматийный пример того, к чему это может привести. Действие GitHub tj‑actions/changed‑files, широко используемое для обнаружения изменённых файлов в pull requests, стал скрытым каналом для утечки секретной информации. Вот что произошло и как вы можете заблокировать свой CI/CD секреты pipeline.

Что произошло в CVE‑2025‑30066?

В середине марта 2025 года tj‑actions/changed‑files был скомпрометирован. Злоумышленник переписал существующие теги версий (до версии 45.0.7), чтобы указать на вредоносную версию. commit. Это изменило поведение действия, и разработчики этого не заметили; новая версия не была выпущена, была лишь скрыта подделка тега.

Полезная нагрузка была простой, но опасной: она извлекала удалённый скрипт Python в кодировке Base64, который сканировал память исполнителя на предмет учётных данных, сохраняя их в журналах или извлекая из системы. Это не было логической ошибкой кода в tj-actions/changed-files; это было злоупотреблением тем, как утечка секретных данных может происходить в рабочих процессах непрерывной интеграции (CI), использующих это повторно используемое действие. CVE-2025-30066 была связана не с переполнением буфера, а с ошибкой в конструкции CI, которая допускала утечку секретных данных.

Воздействие: любой репозиторий, использующий уязвимые версии tj-actions/changed-files, рисковал утечкой секретной информации, особенно если конфиденциальные токены или файлы обрабатывались небезопасно в шаблонах файлов или выходных данных CI.

Почему это влияет на рабочие процессы, основанные на повторно используемых действиях

Рабочие процессы DevSecOps активно использовать tj-actions/changed-files для:

  • Автоматизиция pull request проверки
  • Определить измененные файлы по определенным путям
  • Избегайте избыточных задач непрерывной интеграции

Но эти рабочие процессы часто упускают из виду один момент: как шаблоны glob могут содержать конфиденциальные данные. Разработчики предполагают, что tj‑actions/changed‑files по умолчанию ведут себя безопасно. Однако, если вы glob конфиги/** и секреты хранятся в configs/secrets.env, вы только что добавили секретный файл в выходные данные или журналы CI. Это не ошибка в действии, это ошибка CI/CD Ошибка проектирования, приводящая к утечке секретной информации. CVE‑2025‑30066 — яркий пример.

Как произошла утечка секретной информации (анализ уязвимостей)

Давайте разберем основную ошибку, лежащую в основе CVE‑2025‑30066:

  • Шаблоны сглаживания, такие как **/*.env непреднамеренно сопоставил секретные файлы
  • tj‑actions/changed‑files обрабатывал эти секреты как измененные файлы
  • Секреты оказались в выходных данных шагов, журналах или последующих заданиях

Это произошло из-за того, что секретные данные хранились в путях с контролем версий (плохая идея), а конфигурация CI явно не исключила их из подстановки (тоже плохо). Так что это не ошибка кода, а ненадлежащее проектирование CI, приводящее к утечке секретных данных через выходные данные tj-actions/changed-files.

Практический путь эксплуатации: от работы инженера-консультанта до раскрытия учетных данных

Пример настройки CI, вызвавшей утечку секретной информации через tj‑actions/changed‑files:

yaml
jobs:
  detect_changes:
    runs‑on: ubuntu‑latest
    steps:
      ‑ uses: actions/checkout@v3
      ‑ name: Check changed files
        id: changed
        uses: tj‑actions/changed‑files@v45
        with:
          files: configs/**

If configs/secrets.env изменена:

  • Он был отмечен tj‑actions/changed‑files.
  • Он был включен в шаги.измененные.выходы.все_измененные_файлы
  • Более поздние шаги регистрировали это или передавали в скрипты, раскрывая секреты.

Эта утечка произошла из-за того, что логика CI обрабатывала секреты как обычные файлы. Именно здесь и начинается утечка секретов, вызванная не переполнением буфера, а неправильным использованием tj-actions/changed-files в некорректной архитектуре CI.

Распространение происходит с такими выходами:

yaml
‑ name: Use changed file list
  run: echo "Changed files: ${{ steps.changed.outputs.all_changed_files }}"

If секреты.env Если файл находится в этом списке, его имя и, возможно, содержимое могут появиться в журналах сборки. Даже условная логика, например:

yaml
if: contains(steps.changed.outputs.all_changed_files, 'secrets.env')

Может выявлять чувствительные артефакты. Это CI/CD ошибка проектирования, допускающая утечку секретной информации, а не изъян в коде Действия.

Как безопасно использовать многоразовые рабочие процессы и предотвращать утечки

Вам не нужно отказываться от tj-actions/changed-files. Используйте многоразовые Actions с ориентацией на секреты:

Лучшие практики обращения с секретами

  • Никогда не используйте контроль версий секретов.
  • Избегайте шаблонов шаров, соответствующих чувствительным путям
  • Используйте секреты на основе среды (GITHUB_ENV, хранилища, секреты GitHub)

CI/CD Конфигурация Guardrails

  • Всегда прикрепляйте действия к неизменяемым SHA, а не к тегам (никогда не используйте @v45)
  • Обрабатывать выходные данные tj‑actions/changed‑files как испорченные, очищать или фильтровать их.
  • Устанавливать выходы только в случае их очистки

⚠️ Небезопасный пример:

yaml
jobs:
  detect_changes:
    runs‑on: ubuntu‑latest
    steps:
      ‑ uses: actions/checkout@v3
      ‑ name: Detect all changes
        id: changed
        uses: tj‑actions/changed‑files@v45
        with:
          files: '**/*'  # ⚠️ This glob includes secrets.env, which may leak credentials

Вышеизложенное — это именно то злоупотребление, которое стоит за утечкой секретной информации и CVE‑2025‑30066.

Безопасная альтернатива:

yaml
jobs:
  detect_changes:
    runs‑on: ubuntu‑latest
    steps:
      ‑ uses: actions/checkout@v3
      ‑ name: Detect non‑sensitive file changes
        id: changed
        uses: tj‑actions/changed‑files@<SHA>  # pinned to SHA
        with:
          files: 'src/**'
          files‑ignore: '**/secrets.env'  # ⚠️ Excludes secret file

Делая это, вы избегаете CI/CD ошибка проектирования, которая приводит к утечке секретной информации через tj-actions/changed-files.

Дополнительно:

  • Отключить или ограничить ведение журнала, в котором могут появляться секреты
  • Используйте секретные функции маскировки GitHub
  • Ограничить доступ к журналам сборки и артефактам

Quick Secrets‑Безопасное использование CI: контрольный список

Best Practice
Не храните секреты в файлах с контролем версий
Используйте хранилища или GitHub Secrets для учетных данных
Всегда закрепляйте tj-actions/changed-files в неизменяемых SHA-файлах
Фильтрация или очистка выходных данных из tj‑actions/changed‑files
Никогда не включайте секретные пути в шаблоны глобусов
Маскируйте или ограничивайте журналы, которые могут раскрыть конфиденциальные данные
Регулярно проверяйте унаследованные конфигурации CI

Роль Xygeni: обеспечение соблюдения конфиденциальности CI в больших масштабах

Ксигени Secures CI/CD pipelines, сосредоточившись на как секреты обрабатываются, используются и раскрываются в реальном мире Рабочие процессы DevOps. Речь идёт не только о сканировании кода, но и о внедрении передовых практик управления секретами в режиме реального времени. pipeline анализа.

Обнаружение небезопасного использования выходных данных

  • Сканирование действий GitHub для использования echo, run и выводит, где ${{ steps.*.outputs.* }} могут включать конфиденциальные значения
  • Определяет, когда секреты упоминаются или печатаются напрямую, намеренно или по ошибке.

Мониторинг утечки секретов

  • Обнаруживает высокоэнтропийные значения (ключи API, токены) в журналах и выходных данных шагов
  • Запускает оповещения, когда в системе появляются секреты. pipeline журналы, даже если они замаскированы ниже по течению

Неправильно настроенное использование действия

  • Отслеживает все действия GitHub pipelineдля обнаружения использования скомпрометированных версий (например, tj-actions/changed-files@v45)
  • Аудит шаблонов сопоставления файлов, которые включают потенциальные секреты, такие как **/*.env, *.key или .env.*

CI на основе политики Guardrails

  • Обеспечивает закрепление SHA для сторонних действий
  • Блокирует использование небезопасных файловых шаблонов, которые могут занести секреты в журналы.
  • Препятствует pipelines от передачи конфиденциальных значений в рамках выходных данных рабочего процесса

Рассматривая рабочие процессы как часть поверхности угроз, Xygeni гарантирует, что секретная гигиена — это не просто передовая практика, а встроенная защита.

Вывод: утечка секретной информации может начаться с простого действия — злоупотребления

CVE‑2025‑30066 не была ошибкой библиотеки; это была CI/CD Ошибка проектирования, вызванная неправильным использованием tj-actions/changed-files. Что должны усвоить команды DevSecOps:

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

Непрерывная интеграция (CI) — это код. Рабочие процессы — это код. Журналы и выходные данные — это код. Защищайте свои секреты на каждом этапе, иначе рискуете столкнуться с утечкой, для которой не нужен хакер, а нужен лишь плохой CI/CD выбор дизайна.

sca-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
7-дневная бесплатная пробная версия
Кредитная карта не требуется.

Защитите свою разработку и доставку программного обеспечения

с пакетом продуктов Xygeni