
Apache Traffic Server 10.2.0 - عالية - عن بُعد - بقايا صلاحيات - حالة طريقة ip_allow
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-ipallow-method-case
الفئة: صلاحية متبقية الوصول: عن بُعد
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
تتجاوز طرق HTTP/1 ذات الأحرف المختلطة رفض PURGE/PUSH/DELETE/TRACE الافتراضي في ip_allow.yaml، وتُنفّذ TUNNEL إلى الأصل المعاد تعيينه بصلاحية uid الخاص بـ ATS. تحليل YAML و@method في remap غير حساس لحالة الأحرف. أما H1 فيُجزّئ الرمز ثم يستخدم strncmp على بايتات الطلب ويُعيد -1 عند عدم تطابق الحالة. ويعامل عكس الرفض ذلك الرمز غير المعروف على أنه مسموح. أما :method في HTTP/2 فهو غير حساس لحالة الأحرف ويبقى مرفوضًا. لا تزال عمليات PURGE/PUSH في الذاكرة المؤقتة تحتاج إلى wksidx معروف، لذا لا تؤدي الأحرف المختلطة إلى تفريغ أو دفع الذاكرة المؤقتة.
هذا خلل متبقٍّ من قائمة التحكم الافتراضية لطرق الوارد، وليس CVE-2026-33267 (hop-by-hop) وليس قائمة التحكم المعكوسة لـ remap الفارغ غير القياسي (المغلقة في هذا الإصدار المثبّت).
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية |
| الوصول | عن بُعد (HTTP/1 غير مصادَق من عميل غير loopback) |
| CWE | CWE-178، CWE-863 |
| CVSS | عالٍ: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| المنتج | Apache Traffic Server |
| المتأثر | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) الوكيل العكسي الافتراضي |
| المصادقة | لا شيء. ip_allow.yaml الافتراضي. remap_required: 1 مع map واحد. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18710 فقط. الصورة ats-10.2.0-lab:local. |
ثبّتُّ الوسم 10.2.0، والالتزام b1df7334b39a878971c376da849e8da4984918b6. أحدث إصدار مستقر 17 أغسطس 2026. صورة مبنية من المصدر، وليست أداة استغلال.
الوصول إلى وكيل عكسي نموذجي (remap_required: 1 مع map واحد) عبر HTTP/1 من عنوان غير loopback. العنوان 127.0.0.1 مسموح بالكامل. plugin.config فارغ. ip_allow.yaml الافتراضي.
| الطريقة | المسار | الصلاحية |
|---|---|---|
HTTP/1 delete / DeLeTe بعد remap من sidecar بعنوان 172.x | hdrtoken_method_tokenize ثم process_quick_http_filter ثم TUNNEL مع METHOD_NOT_SUPPORTED (HdrToken.cc:512-528، HttpTransact.cc:6855-6858) | السلامة (مُثبتة مختبريًا): الأصل يُعيد 200 DELETED ATS-IPALLOW-METHOD-CASE-WITNESS. أما DELETE بالأحرف الكبيرة فتُعيد 403. طريقة الأصل بصلاحية uid الخاص بـ ATS. |
HTTP/1 trace | نفس TUNNEL | الاستطلاع (مُثبت مختبريًا): الأصل يُعيد 200 TRACE-OK. لا يبني ATS صدى TRACE (لأن wksidx ليس TRACE). أما TRACE بالأحرف الكبيرة فتُعيد 403. |
HTTP/1 purge / push | TUNNEL لطريقة غير معروفة، وليس عملية ذاكرة مؤقتة | السلامة (ذاكرة ATS المؤقتة): مغلقة (مُثبتة مختبريًا). رأى الأصل PURGE-ORIGIN / PUSH-ORIGIN. تحتاج عمليات الذاكرة المؤقتة إلى wksidx معروف. push_method_enabled افتراضيًا 0. |
| نفس الطلب بالأحرف المختلطة | قفزة إضافية واحدة إلى الأصل | التوافر (مُثبت مختبريًا): ليس موتًا للعملية. |
مُثبت مختبريًا مقابل مُستنتج: رفض الأحرف الكبيرة، وTUNNEL لـ DELETE/TRACE بالأحرف المختلطة، وإغلاق PURGE/PUSH في الذاكرة المؤقتة: مختبري. أما DELETE/TRACE على الأصل فلا يحدثان إلا إذا كان ذلك الأصل يوحّد حالة أحرف الطريقة (IIS / بعض إصدارات Java). أصول RFC 9110 الحساسة لحالة الأحرف (nginx، httpd، Go) تُجيب بـ 501. أصل المختبر يوحّد حالة الأحرف.
يتطلب: HTTP/1 من عميل غير loopback. remap_required: 1 بالإضافة إلى map واحد. الرفض الافتراضي الوارد لـ PURGE/PUSH/DELETE/TRACE. HTTP/2 :method nocase لا يزال مرفوضًا.
| السطح | المختبر |
|---|---|
DELETE / TRACE بحالة أحرف مطابقة من 172.x | 403، لم يتم الوصول إلى الأصل |
HTTP/2 :method بحالة أحرف مختلطة | nocase tokenize، لا يزال مرفوضًا |
purge / push بحالة أحرف مختلطة كعمليات ذاكرة مؤقتة في ATS | رأى الأصل الفعل؛ بقي مسار الذاكرة المؤقتة مغلقًا |
رفض وجهة CONNECT (0.0.0.0/8، RFC1918، link-local، ::ffff:0:0/96) | ip_allow.yaml الافتراضي الصادر |
إخفاق remap_required: 1 | 404، وليس مرحّلًا مفتوحًا |
| ACL remap معكوس فارغ غير قياسي | إصلاح CHANGELOG صمد |
CVE-2026-33267 hop-by-hop / إزالة @ | مغلق على هذا التثبيت |
ip_allow.yaml الافتراضي هو ACL الطرق البعيدة القياسي. يستخدم تحميل YAML الدالة hdrtoken_tokenize (nocase). ثم يقوم عكس DENY بتعيين _method_mask = ALL & ~listed و _deny_nonstandard_methods = true مع قائمة غير قياسية فارغة (IPAllow.cc:545-548).
يقوم محلل HTTP/1 بعمل tokenize باستخدام hdrtoken_method_tokenize. الـ DFA غير حساس لحالة الأحرف؛ ثم تقوم الدالة المساعدة بـ strncmp لبايتات الطلب مقابل السلسلة المعروفة وتعيد -1 عند عدم تطابق حالة الأحرف:
retval = hdrtoken_tokenize(string, string_len, &string_out);
if (retval >= 0) {
if (strncmp(string, string_out, string_len) != 0) {
// Not a case match
retval = -1;
}
}
EndRemapRequest يسأل isNonstandardMethodAllowed عن method == -1 (IPAllow.h:365-376). مجموعة غير قياسية فارغة مع رفض غير القياسي تعني !method_in_set، لذا الأحرف المختلطة مسموح بها. is_this_http_method_supported(-1) خاطئة. METHOD_NOT_SUPPORTED يضبط ProxyMode_t::TUNNELLING ويعيد true. تقول الوثائق إن ATS يمرر الطرق غير المعروفة إلى الأصل. يتم تخطي البحث في الذاكرة المؤقتة في وضع TUNNELLING.
:method في HTTP/2 يمر عبر HTTPHdr::method_set -> hdrtoken_tokenize دون فحص لحالة الأحرف. delete في H2 يصبح DELETE ويُرفض. هذه البقايا هي HTTP/1.
المنعطفات الخاطئة: اعتبار أن الأصول الحساسة لحالة الأحرف في RFC 9110 تجعل قائمة الرفض بلا أثر (تبقى PURGE/PUSH في ذاكرة ATS المؤقتة مغلقة؛ DELETE/TRACE على الأصل هو البقايا)؛ استخدام curl من 127.0.0.1 (allow ALL)؛ الادعاء بتنظيف الذاكرة المؤقتة؛ إعادة تصنيف hop-by-hop.
المسرحية: صدفة عكسية. الأوراكل هو سلسلة شاهد على الأصل بعد 403 بأحرف كبيرة.
python3 ats-ipallow-method-case-Abraxas-Labs.py
أو
cd lab
./run.sh
Loopback 127.0.0.1:18710. مشروع Compose ats-ipallow-method-case. الصورة ats-10.2.0-lab:local (بناء المصدر من 10.2.0). الحاوية الجانبية للمهاجم على 172.x بحيث لا يُخفي localhost ALL حالة الرفض. يُطبّع Origin حالة الأحرف في method. الشاهد ATS-IPALLOW-METHOD-CASE-WITNESS. السطر الأخير:
SUCCESS ats-ipallow-method-case how=live control=DELETE/TRACE-403 poc=delete/DeLeTe/trace-tunneled cache-purge-push=closed ATS-IPALLOW-METHOD-CASE-WITNESS