
CVE-2026-52813 (Gogs Path Traversal → Git Hooks RCE) writeup defensivo: análise de causa raiz e de patch, regras de detecção Sigma/SIEM, IOCs, scanner de versão não intrusivo. Sem PoC armado.
Pesquisa de segurança / writeup voltado para blue team. Este repositório não contém PoC weaponizado. Pesquisadores que precisarem reproduzir devem usar o PoC público referenciado no advisory oficial.
| Item | Descrição |
|---|
| CVE | CVE-2026-52813 |
| Aliases | GHSA-c39w-43gm-34h5 / GO-2026-5305 |
| Versões afetadas | Gogs < 0.14.3 |
| Versão corrigida | 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 |
| Pré-requisito | Uma conta registrada comum (com registro aberto por padrão = RCE não autenticado) |
Ao criar uma organização no Gogs, o formulário Web tem a validação de caracteres AlphaDashDot que bloqueia /, mas a API REST POST /api/v1/user/orgs não tem. O atacante envia um nome de organização contendo ../ via API, contorna a validação e chega direto a os.MkdirAll(repoutil.UserPath(org.Name), 0777) (internal/database/org.go:165), gravando o diretório do repositório em caminhos arbitrários do sistema de arquivos. Combinado com a árvore de trabalho temporária do editor Web do Gogs (local-r/<repo_id>/), é possível depositar um hooks/update malicioso dentro do checkout local de outro repositório, executado automaticamente pelo git → RCE como usuário git.
| Versão do Gogs | Status |
|---|---|
< 0.14.3 | Afetado, atualize imediatamente |
>= 0.14.3 | Corrigido |
A atualização é a única correção definitiva:
# Docker
docker pull gogs/gogs:0.14.3
# 或源码
git checkout v0.14.3 && go build
Mitigações temporárias (quando não for possível atualizar):
app.ini → [service] DISABLE_REGISTRATION = true), reduzindo o pré-requisito de "não autenticado" para "exige conta existente";POST /api/v1/user/orgs e POST /api/v1/org/*/repos em que os campos username / name contenham .. ou / (veja detection/);/data/gogs/data/tmp/ (selinux/apparmor).Formulário 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!
}
→ O campo username de POST /api/v1/user/orgs pode carregar caracteres arbitrários direto até a camada de banco de dados.
internal/database/users.go:1532 isNameAllowed apenas bloqueia nomes reservados/prefixos e sufixos (como admin, -bot) e não valida o conjunto de caracteres, então ../ passa.
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 含 ../ → 任意路径写入
Ao processar edições de arquivos Web/API, o Gogs faz checkout do repositório em /data/gogs/data/tmp/local-r/<repo_id>/. O <repo_id> é exatamente o id do repositório no banco de dados. O atacante:
writer, obtendo id == n;username = "../../../../data/gogs/data/tmp/local-r/n/nested" → o diretório físico cai dentro da árvore de trabalho de writer;rce-x sob essa organização → cai em local-r/n/nested/rce-x.git;writer, faz commit e push de nested/rce-x.git/hooks/update como arquivo comum (ele fica dentro da árvore de trabalho de writer);writer → o Gogs executa git em local-r/n/ → o git executa hooks/update → RCE.Ponto-chave: o hook malicioso entra como conteúdo comum de repositório via push normal e não exige a configuração
ENABLE_GIT_HOOKS— é isso que o diferencia da rota de "abuso tradicional de git hooks".
Análise detalhada do diff do patch em patch/ANALYSIS.md.
Regras completas em detection/:
../) e exploração bem-sucedida (materialização no sistema de arquivos)As duas mais críticas:
username/name contendo .. ou / no corpo JSON de POST /api/v1/user/orgs e POST /api/v1/org/*/repos./data/gogs/data/tmp/local-r/*/ (nested/, rce-*.git, hooks/update).GET /api/v1/version se uma instância do Gogs é < 0.14.3, com suporte a varredura em lote e saída CSV, adequado para inventário de ativos.Este repositório não fornece ferramentas de exploração weaponizadas. Para reproduzir, use o PoC público referenciado no advisory oficial e somente em ambiente isolado auto-hospedado.
As regras de detection/ precisam ser validadas em um Gogs afetado; lab/docker-compose.yml fornece um ambiente isolado do Gogs 0.14.2 para o blue team testar se as regras de detecção são acionadas. Não exponha à internet pública, use apenas localmente.
| Data | Evento |
|---|---|
| 2026-06-08 | CVE reservado |
| 2026-06-24 | Divulgação pública, lançamento do Gogs 0.14.3 |
| 2026-06-24 | Publicação do advisory oficial GHSA-c39w-43gm-34h5 |
Na internet, há quem descreva este CVE como "Execução remota de código por injeção de parâmetro gitrebase no Gogs" — isso está errado. Esta vulnerabilidade não tem relação com git rebase / gitrebase; a causa raiz é o path traversal na API. Este documento segue a análise da vulnerabilidade real.
MIT — veja LICENSE.