
CVE-2026-52813 (обход каталогов в Gogs → RCE через Git-хуки): оборонительный разбор — анализ первопричины и патча, правила обнаружения Sigma/SIEM, IOC, неинтрузивный сканер версий. Без боевого PoC.
Исследование безопасности / writeup для синей команды. Этот репозиторий не содержит weaponized PoC. Исследователям, которым нужно воспроизведение, следует использовать публичный PoC, указанный в официальном advisory.
| Поле | Значение |
|---|---|
| CVE | CVE-2026-52813 |
| Алиасы | GHSA-c39w-43gm-34h5 / GO-2026-5305 |
| Затронутые версии | Gogs < 0.14.3 |
| Исправленная версия | 0.14.3 — PR #8334 |
| CVSS 3.1 | 10.0 Critical AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CWE | CWE-23 Relative Path Traversal → RCE |
| Предварительные условия | Одна обычная зарегистрированная учётная запись (при открытой регистрации по умолчанию = неавторизованный RCE) |
При создании организации Gogs Web-форма выполняет проверку символов AlphaDashDot и блокирует /, но REST API POST /api/v1/user/orgs — нет. Атакующий отправляет через API имя организации с ../, обходит проверку и попадает прямо в os.MkdirAll(repoutil.UserPath(org.Name), 0777) (internal/database/org.go:165), записывая каталог репозитория в произвольный путь файловой системы. В сочетании с временным рабочим деревом веб-редактора Gogs (local-r/<repo_id>/) это позволяет разместить вредоносный hooks/update в локальном checkout другого репозитория, который автоматически выполняется git → RCE под пользователем git.
| Версия Gogs | Статус |
|---|---|
< 0.14.3 | Затронута, немедленно обновитесь |
>= 0.14.3 | Исправлено |
Обновление — единственное полное исправление:
# Docker
docker pull gogs/gogs:0.14.3
# 或源码
git checkout v0.14.3 && go build
Временные меры (если обновление невозможно):
app.ini → [service] DISABLE_REGISTRATION = true), чтобы снизить предварительное условие с «неавторизованно» до «нужна существующая учётная запись»;POST /api/v1/user/orgs, POST /api/v1/org/*/repos, если в теле запроса поля username / name содержат .. или / (см. detection/);/data/gogs/data/tmp/ (selinux/apparmor).Web-форма (internal/form/org.go, v0.14.2):
type CreateOrg struct {
OrgName string `binding:"Required;AlphaDashDot;MaxSize(35)"` // 正则 ^[a-zA-Z0-9._-]+$
}
API (internal/route/api/v1/org/org.go, v0.14.2):
// api.CreateOrgOption (go-gogs-client) 的绑定 tag:
type CreateOrgOption struct {
UserName string `json:"username" binding:"Required"` // ← 没有 AlphaDashDot!
}
→ Поле username в POST /api/v1/user/orgs может содержать произвольные символы и попадать прямо на уровень БД.
internal/database/users.go:1532 isNameAllowed перехватывает только зарезервированные имена/префиксы-суффиксы (например, admin, -bot), не проверяя набор символов, поэтому ../ проходит.
internal/repoutil/repoutil.go (v0.14.2):
func UserPath(user string) string {
return filepath.Join(conf.Repository.Root, strings.ToLower(user)) // ← 直接拼接
}
internal/database/org.go:165:
os.MkdirAll(repoutil.UserPath(org.Name), os.ModePerm) // org.Name 含 ../ → 任意路径写入
Когда Gogs обрабатывает редактирование файлов через Web/API, он выполняет checkout репозитория в /data/gogs/data/tmp/local-r/<repo_id>/. <repo_id> в точности равен id репозитория в БД. Атакующий:
writer, получает id == n;username = "../../../../data/gogs/data/tmp/local-r/n/nested" → физический каталог оказывается внутри рабочего дерева writer;rce-x → он оказывается в local-r/n/nested/rce-x.git;writer, коммитит и пушит nested/rce-x.git/hooks/update как обычный файл (он оказывается в рабочем дереве writer);writer → Gogs запускает git в local-r/n/ → git выполняет hooks/update → RCE.Ключевой момент: вредоносный hook попадает через обычный push как обычное содержимое репозитория, и не требует конфигурации
ENABLE_GIT_HOOKS— в этом отличие от «традиционного злоупотребления git hooks».
Подробный анализ диффа патча — в patch/ANALYSIS.md.
Полные правила — в detection/:
../) и успешную эксплуатацию (размещение в файловой системе)Два самых важных момента:
POST /api/v1/user/orgs и POST /api/v1/org/*/repos поля username/name содержат .. или /./data/gogs/data/tmp/local-r/*/ (nested/, rce-*.git, hooks/update).GET /api/v1/version проверяет, находится ли инстанс Gogs на версии < 0.14.3; поддерживает пакетное сканирование и вывод в CSV, подходит для инвентаризации активов.Этот репозиторий не предоставляет weaponized эксплойтов. Для воспроизведения используйте публичный PoC, указанный в официальном advisory, и только в изолированной среде.
Правила из detection/ нужно проверять на затронутой версии Gogs; lab/docker-compose.yml предоставляет изолированную среду Gogs 0.14.2 для тестирования синей командой срабатывания правил обнаружения. Не открывайте доступ из интернета, только локально.
| Дата | Событие |
|---|---|
| 2026-06-08 | Резервирование CVE |
| 2026-06-24 | Публичное раскрытие, выпуск Gogs 0.14.3 |
| 2026-06-24 | Опубликован официальный advisory GHSA-c39w-43gm-34h5 |
В интернете можно встретить описание этого CVE как «Gogs gitrebase: инъекция параметров, удалённое выполнение кода» — это неверно. Данная уязвимость не связана с git rebase / gitrebase; первопричина — обход пути в API. Этот документ написан на основе реального анализа уязвимости.
MIT — см. LICENSE.