
Gitea diffpatch RCE (CVE-2026-60004) PoC - de escrita no repositório para RCE como conta de serviço do Gitea
PoC de execução remota de código no endpoint diffpatch do Gitea. Uma conta com permissão de escrita em um repositório (bastando registrar-se anonimamente em instâncias com registro aberto) pode executar comandos shell arbitrários no servidor como a conta de serviço do Gitea.
O POST /api/v1/repos/{owner}/{repo}/diffpatch aplica um patch controlado pelo atacante em um clone temporário bare compartilhado:
git apply --index --recount --cached --binary # Git ≥ 2.32 时追加 -3 三路合并回退
Cadeia de ataque: enviar o mesmo patch duas vezes → conflito add/add → o fallback de merge de três vias faz checkout do caminho do índice (mesmo com --cached) → em um repositório bare, root = $GIT_DIR, e o hooks/post-index-change (100755) obtido via checkout torna-se um Git hook ativo → o Git o executa automaticamente ao gravar o índice → RCE.
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H470d34b1)-3)diffpatch disponível# 设置账户密码
export GITEA_PASSWORD='account-password'
python3 gitea_diffpatch_rce_poc.py \
https://<gitea-base-url> \
<username> \
'id; uname -srm; pwd'
| Parâmetro | Descrição |
|---|---|
url | URL base do Gitea |
username | Nome de usuário Gitea existente (disponibilidade: registro aberto por padrão) |
Dependências: Python 3 + cliente git local.
Fluxo do PoC: autenticação → criação de um repositório privado inicializado → construção do patch hooks/post-index-change → envio duas vezes consecutivas para diffpatch (disparando conflito add/add) → o Git executa o hook → recuperação da saída do comando via Smart HTTP autenticado. Sem callbacks de saída; a saída é retornada in-band.
Apenas para pesquisa de segurança, validação de vulnerabilidades e testes defensivos. Este PoC cria repositórios, envia patches e dispara execução de comandos no servidor na instância alvo; execute apenas em instâncias de teste próprias e não utilize em ambientes não autorizados ou de produção.
command | Comando shell a ser executado no alvo |
GITEA_PASSWORD | Senha da conta (variável de ambiente, ou entrada interativa) |