
PoC de RCE de diffpatch de Gitea (CVE-2026-60004) - de escritura en repositorio a RCE como cuenta de servicio de Gitea
PoC de ejecución remota de código en el endpoint diffpatch de Gitea. Una cuenta con permisos de escritura en un repositorio (en instancias con registro abierto basta con registrarse de forma anónima) puede ejecutar comandos shell arbitrarios en el servidor como la cuenta de servicio de Gitea.
POST /api/v1/repos/{owner}/{repo}/diffpatch aplica un parche controlado por el atacante en un clon temporal compartido de tipo bare:
git apply --index --recount --cached --binary # Git ≥ 2.32 时追加 -3 三路合并回退
Cadena de ataque: enviar el mismo parche dos veces → conflicto add/add → el respaldo de fusión a tres bandas hace checkout de la ruta del índice (incluso con --cached) → en un repositorio bare, root = $GIT_DIR, y el hooks/post-index-change extraído (100755) se convierte en un hook de Git activo → Git lo ejecuta automáticamente al escribir el índice → RCE.
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H470d34b1)-3)diffpatch debe estar disponible# 设置账户密码
export GITEA_PASSWORD='account-password'
python3 gitea_diffpatch_rce_poc.py \
https://<gitea-base-url> \
<username> \
'id; uname -srm; pwd'
| Parámetro | Descripción |
|---|---|
url | URL base de Gitea |
username |
Dependencias: Python 3 + cliente git local.
Flujo del PoC: autenticación → creación de un repositorio privado inicializado → construcción del parche hooks/post-index-change → envío dos veces consecutivas a diffpatch (provoca un conflicto add/add) → Git ejecuta el hook → recuperación de la salida del comando a través de Smart HTTP autenticado. Sin devoluciones de llamada salientes; la salida se devuelve dentro de la respuesta (in-band).
Solo para investigación de seguridad, verificación de vulnerabilidades y pruebas defensivas. Este PoC crea repositorios en la instancia objetivo, envía parches y desencadena la ejecución de comandos en el servidor. Ejecútelo únicamente en instancias de prueba propias; no lo utilice contra entornos no autorizados ni de producción.
| Nombre de usuario de Gitea existente (disponibilidad: registro abierto por defecto) |
command | Comando shell que se ejecutará en el objetivo |
GITEA_PASSWORD | Contraseña de la cuenta (variable de entorno o entrada interactiva) |