
Apache Tomcat 11.0.27 - عالي - عن بُعد - DoS - RewriteValve [NS] تثبيت العامل
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · tomcat-rewrite-ns-loop
المقال التقني: https://abraxaslabs.tech/research/tomcat-rewrite-ns-loop
التصنيف: DoS الوصول: عن بُعد
Apache Tomcat 11.0.27 (52f3b364) - tomcat.apache.org
تقوم RewriteValve.parseRuleFlag بمطابقة البادئة. بعد NC/NE، أي علم متبقٍّ يبدأ بـ startsWith("N") يُفعِّل next. تصبح [NS] (nosubreq) و[NV] (novary) المنسوختان من httpd هما [N]. الاستبدال - يترك substitution بقيمة null؛ عندها تُعيد RewriteRule.evaluate عنوان URL الأصلي. isNext() مع newtest غير فارغ يضبط i = -1 دون حد أقصى للدورات، لذا فإن طلب GET واحد غير مُصادَق يطابق القاعدة يُثبِّت خيط موصل HTTP حتى يقطع العميل الاتصال أو تُعاد تشغيل العملية. [N] و[S=-1] الصريحان هما نفس التثبيت. [L,NS] آمن لأن isLast() يقطع أولاً.
أصلحت CVE-2026-65927 (مهمة، 11.0.25) إعادة تشغيل [N] من القاعدة الثانية. لا يزال هذا التثبيت بلا حد أقصى للدورات. أضاف main في اليوم نفسه بعد 11.0.27 الثابت MAX_REWRITE_ROUNDS=1000 ومطابقة الأعلام الدقيقة (2da9fddb، 8992dbdd) دون استشارة أمنية.
| المعرّف | لا توجد CVE بعد |
| التصنيف | DoS |
| الوصول | عن بُعد (HTTP غير مُصادَق) |
| CWE | CWE-835 |
| CVSS | عالية: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| المنتج | Apache Tomcat |
| المتأثر | 11.0.27 (52f3b364e5882a5dbcfc42cb8313a7c2ae532c64) RewriteValve |
| المصادقة | HTTP غير مُصادَق |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
ثبَّتُّ الوسم 11.0.27 وقرأت RewriteValve.invoke. الصمام غير موجود في conf/server.xml الافتراضي. مسار Host الافتراضي هو conf/Catalina/localhost/rewrite.config. المختبر هو HTTP عبر loopback على 127.0.0.1:18910. حزمة tarball الرسمية 11.0.27. ليس RCE.
| الطريقة | الموقع | الصلاحية |
|---|---|---|
GET /loop غير مُصادَق يطابق RewriteRule ^/loop$ - [NS] في rewrite.config الخاص بـ Host | RewriteValve.invoke i = -1 لأن startsWith("N") على الرمز NS | التوافر (مُثبَت مختبرياً): تثبيت خيط موصل HTTP واحد حتى يقطع العميل الاتصال أو تُعاد تشغيل العملية. المختبر: انتهت مهلة /loop عند 4.002s. |
GET /next غير مُصادَق مع [N] صريح | نفس إعادة تشغيل isNext() | التوافر (مُثبَت مختبرياً): نفس التثبيت. المختبر: انتهت مهلة /next عند 4.003s. |
GET /skip غير مُصادَق مع [S=-1] | i += -1 ثم زيادة for | التوافر (مُثبَت مختبرياً): نفس التثبيت. المختبر: انتهت مهلة /skip عند 4.002s. |
| طلب مطابق واحد لكل عامل | نفس الموقع، maxThreads من عناوين URL مطابقة متزامنة | التوافر (مُستنتَج): ملء مجموعة الموصلات (استخدم المختبر 32؛ الافتراضي الأصلي هو 200). عندها تصطف الطلبات الجديدة أو تُرفض. استمر /ok الشقيق في الاستجابة أثناء وجود /loop واحد قيد التنفيذ. |
التعليق مقابل 404 في 13ms على /ok | توقيت next/skip مقابل [L] | الاستطلاع (مُثبَت مختبرياً): استنتاج أن قاعدة next/skip قد طابقت. المختبر: تعليق 4.002s مقابل 404 في 0.013s. |
مُثبَت مختبرياً مقابل مُستنتَج: تعليق /loop [NS]، وتعليق /next [N]، وتعليق /skip [S=-1]، و/ok [L] 404 في 13ms، و/safe [L,NS] 404 في 5ms، و/ok الشقيق 404 أثناء وجود /loop قيد التنفيذ كلها مُثبَتة مختبرياً. استنفاد المجموعة مُستنتَج من تثبيت خيط واحد مع maxThreads.
يتطلب: RewriteValve على Host أو Context وقاعدة rewrite.config مطابقة. الـ Valve اختياري (opt-in)، من نفس فئة AJP المعلّق. نسخ [NS] من httpd هو قاعدة مطابقة، وليس حلقة [N] لانهائية مقصودة.
| السطح | المختبر |
|---|---|
[L,NS] (httpd last+nosubreq) | /safe 404 في 5ms (L-ns-safe=yes) |
| طلبات أخرى قيد التنفيذ أثناء تثبيت خيط واحد | /ok 404 في 13ms أثناء /loop (sibling-alive=yes) |
server.xml الافتراضي بدون RewriteValve | الـ valve غائب؛ المتبقي لا يُفعَّل |
| RCE / قراءة WEB-INF / تجاوز قيد CVE-2026-65927 | [N] الآن يعيد البدء عند القاعدة 0؛ هذا المتبقي يتعلق بالتوافر فقط |
| Manager / JMX / AJP / DefaultServlet PUT | دون تغيير؛ PUT لا يزال readonly |
لا تنفيذ كود بصلاحيات مستخدم Tomcat. لا قراءة لـ conf/ أو WEB-INF. لا سرقة جلسة. لا نشر عبر Manager. تبقى الـ JVM قائمة؛ العمال الآخرون ما زالوا يستجيبون حتى تمتلئ البركة (pool).
cd lab
./run.sh
منفذ الاسترجاع 127.0.0.1:18910 يعيّن حاوية 8080. مشروع Compose tomcat-rewrite-ns-loop. وسم الصورة tomcat-rewrite-ns-loop:11.0.27. الملف الرسمي apache-tomcat-11.0.27.tar.gz ببصمة SHA512 a617896307cada4884b24f80c4e977ddad8b3e0f88ce0e2a6eea29d5f332498e276ae5976c227a9c8daecf05c7c90def684a3766dd5a81f47a56d8b1adf43dc3. الشاهد TOMCAT-REWRITE-NS-LOOP-WITNESS. السطر الأخير:
SUCCESS TOMCAT-REWRITE-NS-LOOP control-ok=yes ns-hang=yes L-ns-safe=yes n-hang=yes skip-hang=yes sibling-alive=yes TOMCAT-REWRITE-NS-LOOP-WITNESS
Lab rewrite.config:
RewriteRule ^/loop$ - [NS]
RewriteRule ^/next$ - [N]
RewriteRule ^/skip$ - [S=-1]
RewriteRule ^/ok$ - [L]
RewriteRule ^/safe$ - [L,NS]
تحديد عدد جولات إعادة الكتابة (MAX_REWRITE_ROUNDS=1000 على main بعد هذا الوسم، الالتزام 2da9fddb). أعلام المطابقة التامة بحيث يفشل [NS] في التحليل (الالتزام 8992dbdd). رفض skip < 0. حتى تصل هذه التغييرات إلى إصدار: تجنّب [NS]/[NV]/[N]/[S=-1] في قواعد المطابقة، أو أزل RewriteValve.
52f3b364e5882a5dbcfc42cb8313a7c2ae532c64)RewriteValve.java إعادة تشغيل isNext() و startsWith("N")RewriteRule.java استبدال - يُعيد عنوان URL الأصلي