
Apache Tomcat 11.0.27 - उच्च - रिमोट - DoS - RewriteValve [NS] worker pin
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 को सक्षम कर देता है। httpd से कॉपी किए गए [NS] (nosubreq) और [NV] (novary) [N] बन जाते हैं। प्रतिस्थापन - substitution को null छोड़ता है; तब RewriteRule.evaluate मूल URL लौटाता है। isNext() के साथ एक गैर-null newtest i = -1 सेट करता है, बिना किसी राउंड कैप के, इसलिए एक अनप्रमाणित GET जो नियम से मेल खाता है, HTTP कनेक्टर थ्रेड को तब तक पिन कर देता है जब तक क्लाइंट ड्रॉप न करे या प्रोसेस रीस्टार्ट न हो। स्पष्ट [N] और [S=-1] वही पिन हैं। [L,NS] सुरक्षित है क्योंकि isLast() पहले ब्रेक करता है।
CVE-2026-65927 (Important, 11.0.25) ने [N] के दूसरे नियम पर रीस्टार्ट होने को ठीक किया। इस पिन में अभी भी कोई राउंड कैप नहीं है। 11.0.27 के बाद उसी दिन के main ने MAX_REWRITE_ROUNDS=1000 और सटीक फ़्लैग मैचिंग (2da9fddb, 8992dbdd) जोड़े, बिना किसी सुरक्षा सलाह के।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | DoS |
| पहुँच | रिमोट (अनप्रमाणित HTTP) |
| CWE | CWE-835 |
| CVSS | High: 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 है। लैब 127.0.0.1:18910 पर लूपबैक HTTP है। आधिकारिक 11.0.27 टारबॉल। RCE नहीं।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
अनप्रमाणित GET /loop जो Host rewrite.config के RewriteRule ^/loop$ - [NS] से मेल खाता है | RewriteValve.invoke में i = -1 क्योंकि टोकन NS पर startsWith("N") | उपलब्धता (लैब-प्रमाणित): एक HTTP कनेक्टर थ्रेड को तब तक पिन करें जब तक क्लाइंट ड्रॉप न करे या प्रोसेस रीस्टार्ट न हो। लैब: /loop 4.002s पर टाइमआउट हुआ। |
स्पष्ट [N] के साथ अनप्रमाणित GET /next | वही isNext() रीस्टार्ट | उपलब्धता (लैब-प्रमाणित): वही पिन। लैब: /next 4.003s पर टाइमआउट हुआ। |
[S=-1] के साथ अनप्रमाणित GET /skip | i += -1 फिर for इंक्रीमेंट | उपलब्धता (लैब-प्रमाणित): वही पिन। लैब: /skip 4.002s पर टाइमआउट हुआ। |
| प्रति वर्कर एक मेल खाती रिक्वेस्ट | वही सिंक, maxThreads समवर्ती मेल खाते URL | उपलब्धता (अनुमानित): कनेक्टर पूल भरें (लैब ने 32 उपयोग किए; स्टॉक डिफ़ॉल्ट 200 है)। नई रिक्वेस्ट तब कतार में लगेंगी या अस्वीकार होंगी। एक /loop इन-फ़्लाइट रहते हुए सहोदर /ok ने अभी भी उत्तर दिया। |
/ok पर 13ms 404 बनाम हैंग | next/skip का टाइमिंग बनाम [L] | रीकॉन (लैब-प्रमाणित): पता लगाएँ कि next/skip नियम मेल खाया। लैब: 4.002s हैंग बनाम 0.013s 404। |
लैब-प्रमाणित बनाम अनुमानित: /loop [NS] हैंग, /next [N] हैंग, /skip [S=-1] हैंग, /ok [L] 13ms में 404, /safe [L,NS] 5ms में 404, और /loop इन-फ़्लाइट रहते हुए सहोदर /ok 404 लैब-प्रमाणित हैं। पूल एक्सहॉशन एक-थ्रेड पिन और maxThreads से अनुमानित है।
आवश्यक: Host या Context पर RewriteValve और एक मेल खाता rewrite.config नियम। Valve opt-in है, उसी श्रेणी का जैसे कमेंट किया गया AJP। कॉपी किया गया httpd [NS] एक मेल खाता नियम है, न कि जानबूझकर बनाया गया अनंत [N] लूप।
| सतह | लैब |
|---|---|
[L,NS] (httpd last+nosubreq) | /safe 5ms में 404 (L-ns-safe=yes) |
| एक थ्रेड पिन होने के दौरान अन्य इन-फ़्लाइट अनुरोध | /loop के दौरान /ok 13ms में 404 (sibling-alive=yes) |
RewriteValve के बिना स्टॉक server.xml | valve अनुपस्थित; leftover सक्रिय नहीं होता |
| CVE-2026-65927 का RCE / WEB-INF पठन / constraint bypass | [N] अब नियम 0 पर पुनः आरंभ होता है; यह leftover केवल availability से संबंधित है |
| Manager / JMX / AJP / DefaultServlet PUT | अपरिवर्तित; PUT अभी भी readonly |
Tomcat उपयोगकर्ता के रूप में कोई कोड निष्पादन नहीं। conf/ या WEB-INF का कोई पठन नहीं। कोई session चोरी नहीं। कोई Manager deploy नहीं। JVM चालू रहता है; पूल भरने तक अन्य workers उत्तर देते रहते हैं।
cd lab
./run.sh
Loopback 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]
रीराइट राउंड्स को सीमित करें (main पर इस टैग के बाद MAX_REWRITE_ROUNDS=1000, कमिट 2da9fddb)। सटीक-मिलान फ़्लैग ताकि [NS] पार्स विफल हो जाए (कमिट 8992dbdd)। skip < 0 को अस्वीकार करें। जब तक ये किसी रिलीज़ में न आ जाएं: मिलान नियमों पर [NS]/[NV]/[N]/[S=-1] का उपयोग न करें, या RewriteValve को हटा दें।
52f3b364e5882a5dbcfc42cb8313a7c2ae532c64)RewriteValve.java isNext() रीस्टार्ट और startsWith("N")RewriteRule.java प्रतिस्थापन - मूल URL लौटाता है