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);
}
sub, указывающую на .git/modules/sub.SUB/hooks через симлинк прямо в директорию хуков Git.post-checkout записывается в хуки и автоматически выполняется по завершении клонирования.Path/A и path/a ссылаются на один и тот же файл на диске.lstat..git/ должна быть строго защищена от перенаправления записи.