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 — Papan Petunjuk Kantor yang Menyesatkan

Bayangkan seorang kurir mengantarkan paket internal ke 'Ruang 101'. Penyerang memasang tanda di pintu: 'Ruang 101 telah dipindahkan ke Brankas Direksi'. Tanpa memeriksa keasliannya, kurir mengikuti tanda panah dan meletakkan paket di dalam brankas. Di Git, kurir tersebut adalah proses clone submodule, tanda palsu adalah symlink, dan brankas adalah direktori tersembunyi .git/hooks/ tempat skrip dieksekusi secara otomatis.

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

Diff Kode Sumber Git yang Fatal

Di builtin/submodule--helper.c dan dir.c, Git menginisialisasi submodule tanpa memeriksa apakah ada elemen direktori induk pada jalur klon yang merupakan symlink.

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);
}

Alur Eksploitasi 3 Langkah

Pelajaran Penting untuk Pengembang

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