flawopen.com/Teardowns/CVE-2024-32002

CVE-2024-32002: Git Submodule Symlink RCE

Critical 9.8 CWE-78 / CWE-59 Git < 2.45.1
Languages: en pt-br es fr de ru zh-cn ja hi ko id
ELI5 — Le Panneau Trompeur au Bureau

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.

Target: Git core CLI
Vector: git clone --recursive <url>
Impact: Remote Code Execution (RCE)
Platform: macOS & Windows (Case-Insensitive Filesystems)

Le Diff Fatal dans le Code Source de Git

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.

builtin/submodule--helper.c (Vulnerable)Vulnerable
// 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);
}
builtin/submodule--helper.c (Fixed)Patched
// 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);
}

Le Scénario d'Exploitation en 3 Étapes

Enseignements d'Architecture pour Développeurs

Explore more vulnerability mechanisms & language matrices: Command Injection Matrix →