flawopen.com/Teardowns/CVE-2024-32002
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.
git clone --recursive <url>Di builtin/submodule--helper.c dan dir.c, Git menginisialisasi submodule tanpa memeriksa apakah ada elemen direktori induk pada jalur klon yang merupakan symlink.
// 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 yang mengarah ke .git/modules/sub.SUB/hooks melalui symlink ke direktori internal Git.post-checkout disimpan ke dalam folder hooks dan langsung dieksekusi saat proses clone selesai.Folder/A dan folder/a merujuk pada file yang sama..git/.