flawopen.com/Teardowns/CVE-2024-32002
社内便の配達員が「101号室」に荷物を届ける場面を想像してください。攻撃者がドアに『101号室は役員金庫室へ移転しました』という張り紙を貼りました。配達員は疑うことなく矢印に従い、金庫室の中に荷物を運び込みました。Gitにおける配達員はサブモジュールのクローン処理、張り紙はシンボリックリンク、そして金庫室はスクリプトが自動実行される隠しフォルダ .git/hooks/ でした。
git clone --recursive <url>builtin/submodule--helper.c および dir.c において、Gitはサブモジュールのパス上にワークツリー外を指すシンボリックリンクが含まれているかを検証していませんでした。
// 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);
}
.git/modules/sub を指すシンボリックリンク sub をコミットします。SUB/hooks への書き込みがシンボリックリンク経由で内部フックフォルダに誘導されます。post-checkout フックが書き込まれ、git clone完了時に自動実行されます。Path/A と path/a は同一ファイルとして扱われます。.git/ の保護を徹底しました。