flawopen.com/Teardowns/CVE-2024-32002
Imagina a un mensajero entregando un paquete interno en la 'Sala 101'. Un atacante coloca un cartel en la puerta que dice: 'La Sala 101 se ha trasladado a la Caja Fuerte Principal'. En lugar de verificar si el cartel es legítimo, el mensajero sigue la flecha a ciegas y deposita el paquete en la caja fuerte. En Git, el mensajero era el clonador de submódulos, el cartel engañoso era un enlace simbólico (symlink), y la caja fuerte era el directorio oculto .git/hooks/, donde los scripts se ejecutan automáticamente.
git clone --recursive <url>En builtin/submodule--helper.c y dir.c, Git inicializaba el árbol de trabajo del submódulo sin comprobar si algún directorio intermedio era un enlace simbólico que apuntaba fuera del árbol de trabajo.
// Git clone created submodule directory blindly
static int clone_submodule(const struct module_clone_data *clone_data)
{
struct strbuf sb = STRBUF_INIT;
// BUG: clone_data->path could traverse an existing symlink
strbuf_addf(&sb, "%s", clone_data->path);
safe_create_leading_directories(sb.buf);
return do_clone(clone_data);
}
// Fixed: Refuse to clone into or through symlinked path components
static int clone_submodule(const struct module_clone_data *clone_data)
{
struct strbuf sb = STRBUF_INIT;
// FIX: Validate that no parent component is a symlink
if (path_has_symlinks(clone_data->path))
die(_("fatal: submodule path '%s' contains a symlink"),
clone_data->path);
strbuf_addf(&sb, "%s", clone_data->path);
return do_clone(clone_data);
}
sub que apunta a .git/modules/sub (el almacén interno de metadatos de Git).SUB/hooks, el sistema resolvía SUB a través del symlink directamente hacia .git/modules/sub/hooks/.post-checkout. Al completar la clonación, Git ejecutaba el hook de forma automática con los permisos del usuario.Ruta/A y ruta/a apuntan al mismo nodo en disco..git/ mediante alias.