flawopen.com/पैच विश्लेषण/CVE-2024-32002
कल्पना कीजिए कि एक कूरियर 'कमरा 101' में एक सामान्य पार्सल पहुंचाने जा रहा है। एक हमलावर दरवाजे पर एक तीर का निशान लगा देता है: 'कमरा 101 अब मुख्य सुरक्षा तिजोरी में स्थानांतरित हो गया है'। कूरियर बिना सवाल किए उस तीर का अनुसरण करता है और पार्सल सीधे मुख्य तिजोरी में छोड़ देता है।
Git में वह कूरियर सबमॉड्यूल क्लोनिंग प्रक्रिया थी, वह भ्रामक तीर सिंबॉलिक लिंक (Symlink) था, और वह तिजोरी .git/hooks/ डायरेक्टरी थी — जहाँ कोई भी स्क्रिप्ट पहुंचते ही Git द्वारा स्वचालित रूप से निष्पादित हो जाती है।
git clone --recursive <url>macOS और Windows पर फ़ाइल सिस्टम केस-इनसेंसिटिव होते हैं, जिसका अर्थ है कि sub और SUB दोनों एक ही डायरेक्टरी की ओर ले जाते हैं। Git क्लोन करते समय पहले sub नाम से एक सिंबॉलिक लिंक बनाता था जो .git/modules/sub की ओर पॉइंट करता था। इसके तुरंत बाद, SUB/hooks सबमॉड्यूल को क्लोन करते समय Git ने यह जांच नहीं की कि पाथ में कोई सिंबॉलिक लिंक मौजूद है। परिणामस्वरूप, हुक स्क्रिप्ट्स सीधे लक्षित रिपॉजिटरी के .git/hooks/post-checkout में लिख दी गईं।
builtin/submodule--helper.c में Git सबमॉड्यूल क्लोन करते समय पाथ के घटकों को आंख मूंदकर बना रहा था। पैच ने क्लोन शुरू करने से पहले यह सुनिश्चित करने के लिए path_has_symlinks() जांच जोड़ी कि पाथ में कोई सिंबॉलिक लिंक शामिल न हो:
// 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/modules/sub/hooks में पुनर्निर्देशित हो जाती है।post-checkout निष्पादन योग्य स्क्रिप्ट लिखी जाती है। जैसे ही git clone --recursive पूरा होता है, Git इसे स्वचालित रूप से चला देता है।Path/A और path/a एक ही फ़ाइल हैं)।path_has_symlinks())।.git/) को अभेद्य रखें: यूजर-नियंत्रित डेटा और निष्पादन योग्य आंतरिक हुक्स के बीच कभी भी साझा पाथवे की अनुमति नहीं होनी चाहिए।