flawopen.com/पैच विश्लेषण/CVE-2024-32002

CVE-2024-32002: Git सबमॉड्यूल सिंबॉलिक लिंक RCE

अति गंभीर 9.8 (Critical) CWE-78 (कमांड इंजेक्शन) / CWE-59 (सिंबॉलिक लिंक) Git < 2.45.1 में समाधान
उपलब्ध भाषाएं: en pt-br es fr de ru zh-cn ja hi ko id
सरल शब्दों में समझें (ELI5) — कार्यालय का भ्रामक संकेत

कल्पना कीजिए कि एक कूरियर 'कमरा 101' में एक सामान्य पार्सल पहुंचाने जा रहा है। एक हमलावर दरवाजे पर एक तीर का निशान लगा देता है: 'कमरा 101 अब मुख्य सुरक्षा तिजोरी में स्थानांतरित हो गया है'। कूरियर बिना सवाल किए उस तीर का अनुसरण करता है और पार्सल सीधे मुख्य तिजोरी में छोड़ देता है।

Git में वह कूरियर सबमॉड्यूल क्लोनिंग प्रक्रिया थी, वह भ्रामक तीर सिंबॉलिक लिंक (Symlink) था, और वह तिजोरी .git/hooks/ डायरेक्टरी थी — जहाँ कोई भी स्क्रिप्ट पहुंचते ही Git द्वारा स्वचालित रूप से निष्पादित हो जाती है।

महत्वपूर्ण तकनीकी बिंदु (Key Parameters)
हमले का लक्ष्य (Target)
Git core CLI (कमांड लाइन टूल)
हमला वेक्टर (Attack Vector)
git clone --recursive <url>
घातक प्रभाव (Impact)
रिमोट कोड निष्पादन (Remote Code Execution — RCE)
प्रभावित सिस्टम (Platform)
macOS (APFS/HFS+) और Windows (NTFS) — केस-इनसेंसिटिव फ़ाइल सिस्टम

तकनीकी मूल कारण (The Root Cause Mechanism)

केस-इनसेंसिटिव फ़ाइल सिस्टम और पाथ ट्रैवर्सल का मेल

macOS और Windows पर फ़ाइल सिस्टम केस-इनसेंसिटिव होते हैं, जिसका अर्थ है कि sub और SUB दोनों एक ही डायरेक्टरी की ओर ले जाते हैं। Git क्लोन करते समय पहले sub नाम से एक सिंबॉलिक लिंक बनाता था जो .git/modules/sub की ओर पॉइंट करता था। इसके तुरंत बाद, SUB/hooks सबमॉड्यूल को क्लोन करते समय Git ने यह जांच नहीं की कि पाथ में कोई सिंबॉलिक लिंक मौजूद है। परिणामस्वरूप, हुक स्क्रिप्ट्स सीधे लक्षित रिपॉजिटरी के .git/hooks/post-checkout में लिख दी गईं।

Git सोर्स कोड का निर्णायक पैच डिफ़ (Diff)

builtin/submodule--helper.c में Git सबमॉड्यूल क्लोन करते समय पाथ के घटकों को आंख मूंदकर बना रहा था। पैच ने क्लोन शुरू करने से पहले यह सुनिश्चित करने के लिए path_has_symlinks() जांच जोड़ी कि पाथ में कोई सिंबॉलिक लिंक शामिल न हो:

कमजोर कोड (Vulnerable) — builtin/submodule--helper.c
// 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);
}
पैच किया गया कोड (Patched) — builtin/submodule--helper.c
// 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);
}

3-चरणीय शोषण प्रवाह (Exploit Flow)

डेवलपर्स के लिए मुख्य इंजीनियरिंग सबक

अन्य सुरक्षा घटनाएं और विश्लेषण देखें: घटना विश्लेषण सूची (Incidents) →