flawopen.com/Teardowns/CVE-2024-32002
Imaginez un coursier livrant un colis au 'Bureau 101'. Un attaquant place une pancarte sur la porte indiquant : 'Le bureau 101 a été déplacé dans le coffre-fort de la direction'. Au lieu de vérifier la légitimité du panneau, le coursier suit aveuglément la flèche et dépose le colis dans le coffre. Dans Git, le coursier était le cloneur de sous-modules, le panneau trompeur était un lien symbolique, et le coffre-fort était le dossier caché .git/hooks/, où les scripts s'exécutent automatiquement.
git clone --recursive <url>Dans builtin/submodule--helper.c et dir.c, Git initialisait l'arborescence du sous-module sans vérifier si l'un des répertoires parents du chemin était un lien symbolique pointant vers l'extérieur.
// 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 pointant vers .git/modules/sub.SUB/hooks vers la cible du symlink sub.post-checkout est injecté dans les hooks Git et s'exécute automatiquement à la fin du clone.Dir/A et dir/a entrent en collision sur les systèmes clients courants.lstat..git/.