
प्रूफ-ऑफ-कॉन्सेप्ट शोषण CVE-2018-1000533 के लिए, GitList 0.6.0 में खोज फ़ंक्शन में अस्वच्छ इनपुट के माध्यम से एक दूरस्थ कोड निष्पादन भेद्यता, जो मनमाना कमांड निष्पादन की अनुमति देता है।
GitList एक आधुनिक Git रिपॉजिटरी व्यूअर है।
GitList 0.6.0 और उससे निचले संस्करणों में, सिस्टम फ़ंक्शन को अनुचित रूप से सत्यापित इनपुट पास करने की एक भेद्यता मौजूद है, जिससे PHP उपयोगकर्ता के अधिकारों से मनमाना कमांड निष्पादित किया जा सकता है।
GitList सर्वर 0.6.0 शुरू करने के लिए निम्न कमांड चलाएँ।
docker compose up -d
poc.py चलाने से पहले निर्भरताएँ स्थापित करें।
pip install requests
पर्यावरण सेटअप पूरा होने पर, http://127.0.0.1:8080 पर जाएँ और जाँचें कि example नामक परीक्षण रिपॉजिटरी मौजूद है।
GitList रिपॉजिटरी में कोड खोजने के लिए git grep का उपयोग करता है।
public function searchTree($query, $branch)
{
if (empty($query)) {
return null;
}
$query = escapeshellarg($query);
try {
$results = $this->getClient()->run($this, "grep -i --line-number {$query} $branch");
} catch (\RuntimeException $e) {
return false;
}
यहाँ $query खोज कीवर्ड है, और $branch खोज लक्ष्य शाखा है।
यदि हमलावर खोज शब्द के रूप में --open-files-in-pager=id; पास करता है, तो सिस्टम पर id कमांड निष्पादित हो जाता है।
यह भेद्यता दो कारणों से उत्पन्न होती है :
escapeshellarg() फ़ंक्शन की सीमासैद्धांतिक रूप से, $query = escapeshellarg($query); कोड के बाद, इनपुट मान एकल उद्धरणों में संलग्न स्ट्रिंग बन जाता है। लेकिन escapeshellarg() शेल के दृष्टिकोण से इंजेक्शन को रोकता है, लेकिन git के स्वयं के विकल्प पार्सर को -- से शुरू होने वाली स्ट्रिंग को विकल्प के रूप में व्याख्या करने से नहीं रोकता।
--open-files-in-pager विकल्प की विशेषताgit grep का यह विकल्प खोज परिणामों को प्रदर्शित करने के लिए बाहरी पेजर प्रोग्राम निर्दिष्ट करने का कार्य करता है, और इसमें पास किए गए मान को सीधे सिस्टम कमांड के रूप में निष्पादित करने की विशेषता है।
[repo_name]/tree/[keyword]/search) में दो तर्क [repo_name] और [keyword] होते हैं।[repo_name] GitList में मौजूद एक रिपॉजिटरी होना चाहिए, और [keyword] एक खोज कीवर्ड होना चाहिए जो कम से कम एक खोज परिणाम उत्पन्न करता है।
(इस पुनरुत्पादन में, रिपॉजिटरी के रूप में example और कीवर्ड के रूप में a का उपयोग किया गया।)निम्न कमांड के माध्यम से poc.py चलाएँ।
इस स्क्रिप्ट के माध्यम से touch /tmp/success_dddo0 निष्पादित होता है और सर्वर की /tmp निर्देशिका में success_dddo0 नामक एक खाली फ़ाइल बनाई जाती है।
python3 poc.py http://127.0.0.1:8080
अनुरोध भेजने के बाद, निम्न कमांड से जाँचें कि success_dddo0 सफलतापूर्वक बनाया गया है।
docker compose exec web ls -l /tmp/success_dddo0
PoC चलाने के बाद, सर्वर के अंदर एक मनमाना सिस्टम कमांड (touch /tmp/success_dddo0) सफलतापूर्वक निष्पादित हुआ और फ़ाइल बनाई गई, इसकी पुष्टि की जा सकती है।

docker compose down
GitList संस्करण को नवीनतम संस्करण में अपडेट किया जाना चाहिए।
कोड संशोधन:
public function searchTree($query, $branch)
{
if (empty($query)) {
return null;
}
$query = preg_replace('/(--?[A-Za-z0-9\-]+)/', '', $query);
$query = escapeshellarg($query);
try {
$results = $this->getClient()->run($this, "grep -i --line-number -- {$query} $branch");
} catch (\RuntimeException $e) {
return false;
}
GitList में, रेगुलर एक्सप्रेशन का उपयोग करके खोज क्वेरी ($query) से अवैध - उपसर्ग हटा दिए गए, और git grep कमांड में -- (विकल्पों के अंत का संकेत) जोड़ा गया ताकि उसके बाद आने वाले सभी इनपुट मानों को कमांड विकल्प के रूप में नहीं, बल्कि केवल सामान्य स्ट्रिंग (खोज शब्द) के रूप में माना जाए, जिससे इस भेद्यता को ठीक किया गया।