
Apache Tomcat 11.0.27 - उच्च - रिमोट - DoS - RewriteValve [NS] worker pin
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · tomcat-rewrite-ns-loop
वर्ग: DoS पहुँच: Remote
Apache Tomcat 11.0.27 (52f3b364) - tomcat.apache.org
RewriteValve.parseRuleFlag prefix-matching करता है। NC/NE के बाद, कोई भी शेष फ्लैग जो startsWith("N") से शुरू होता है, अगला चरण सक्षम बनाता है। httpd से कॉपी किए गए [NS] (nosubreq) और [NV] (novary) को [N] में बदल दिया जाता है। Substitution - substitution को null छोड़ देता है; इसके बाद RewriteRule.evaluate मूल URL लौटाता है। isNext() और एक गैर-null newtest के साथ i = -1 सेट हो जाता है, जिसमें round cap नहीं है, इसलिए एक अन-authenticated GET जो नियम से मेल खाता है, HTTP connector thread को तब तक पिन कर लेता है जब तक कि क्लाइंट डिस्कनेक्ट न कर दे या प्रोसेस रीस्टार्ट न हो। स्पष्ट [N] और [S=-1] वही पिन हैं। [L,NS] सुरक्षित है क्योंकि isLast() पहले ब्रेक करता है।
CVE-2026-65927 (Important, 11.0.25) ने दूसरे नियम पर [N] रीस्टार्ट को ठीक किया। यह पिन अभी भी round cap से मुक्त है। 11.0.27 के बाद Same-day main में MAX_REWRITE_ROUNDS=1000 और exact flag matching (2da9fddb, 8992dbdd) जोड़ी गई, बिना किसी security advisory के।
| ID | अभी तक कोई CVE नहीं |
| Class | DoS |
| Reach | Remote (unauthenticated 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 |
| Product | Apache Tomcat |
| Affected | 11.0.27 (52f3b364e5882a5dbcfc42cb8313a7c2ae532c64) RewriteValve |
| Auth | unauthenticated HTTP |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
मैंने टैग 11.0.27 को pin किया और RewriteValve.invoke पढ़ा। Valve स्टॉक conf/server.xml में नहीं है। Default Host path conf/Catalina/localhost/rewrite.config है। Lab 127.0.0.1:18910 पर loopback HTTP है। आधिकारिक 11.0.27 tarball। यह RCE नहीं है।
| Method | Sink | Privilege |
|---|---|---|
Unauth GET /loop जो Host rewrite.config RewriteRule ^/loop$ - [NS] से मेल खाता है | RewriteValve.invoke i = -1 क्योंकि टोकन NS पर startsWith("N") है | Availability (lab-proven): एक HTTP connector thread को pin करें जब तक कि क्लाइंट डिस्कनेक्ट न कर दे या प्रोसेस रीस्टार्ट न हो जाए। Lab: /loop का टाइमआउट 4.002s पर हुआ। |
Unauth GET /next स्पष्ट [N] के साथ | समान isNext() रीस्टार्ट | Availability (lab-proven): वही पिन। Lab: /next का टाइमआउट 4.003s पर हुआ। |
Unauth GET /skip [S=-1] के साथ | i += -1 फिर for इन्क्रिमेंट | Availability (lab-proven): वही पिन। Lab: /skip का टाइमआउट 4.002s पर हुआ। |
| प्रति वर्कर एक मेल खाने वाला अनुरोध | समान sink, maxThreads concurrent matching URLs | Availability (inferred): connector pool को भरें (lab ने 32 का उपयोग किया; स्टॉक डिफ़ॉल्ट 200 है)। नए अनुरोध अब कतार में लगते हैं या अस्वीकार होते हैं। एक /loop चल रहे होने के दौरान भाई /ok अभी भी उत्तर दे रहा था। |
/ok पर 13ms 404 के विरुद्ध हंग | next/skip बनाम [L] का टाइमिंग | Recon (lab-proven): बताएं कि एक next/skip नियम मेल खाया। Lab: 4.002s हंग बनाम 0.013s 404। |
Lab-proven vs inferred: /loop [NS] हंग, /next [N] हंग, /skip [S=-1] हंग, /ok [L] 13ms में 404, /safe [L,NS] 5ms में 404, और /loop चल रहे होने के दौरान भाई /ok 404 lab-proven हैं। Pool exhaustion को एक-thread pin plus maxThreads से inferred किया गया है।
Requires: Host या Context पर RewriteValve और एक matching rewrite.config नियम। Valve opt-in है, commented-out AJP के समान वर्ग का। Copied httpd [NS] एक matching rule है, जानबूझकर बनाया गया infinite [N] लूप नहीं।
| Surface | Lab |
|---|---|
[L,NS] (httpd last+nosubreq) | /safe 5ms में 404 (L-ns-safe=yes) |
| एक thread pin होने के दौरान अन्य in-flight requests | /loop के दौरान /ok 13ms में 404 (sibling-alive=yes) |
RewriteValve के बिना स्टॉक server.xml | valve अनुपस्थित; leftover trigger नहीं होता |
| CVE-2026-65927 की RCE / WEB-INF read / constraint bypass | [N] अब rule 0 पर रीस्टार्ट करता है; यह leftover केवल availability के लिए है |
| Manager / JMX / AJP / DefaultServlet PUT | अपरिवर्तित; PUT अभी भी readonly है |
Tomcat user के रूप में कोई code execution नहीं। conf/ या WEB-INF की कोई read नहीं। कोई session steal नहीं। कोई Manager deploy नहीं। JVM ऊपर रहता है; pool भर जाने तक अन्य workers अभी भी उत्तर देते हैं।
cd lab
./run.sh
Loopback 127.0.0.1:18910 container 8080 को map करता है। Compose project tomcat-rewrite-ns-loop। Image tag tomcat-rewrite-ns-loop:11.0.27। आधिकारिक apache-tomcat-11.0.27.tar.gz SHA512 a617896307cada4884b24f80c4e977ddad8b3e0f88ce0e2a6eea29d5f332498e276ae5976c227a9c8daecf05c7c90def684a3766dd5a81f47a56d8b1adf43dc3। Witness 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]
rewrite rounds को सीमित करें (main पर इस टैग के बाद MAX_REWRITE_ROUNDS=1000, commit 2da9fddb)। Exact-match flags ताकि [NS] parse में fail हो जाए (commit 8992dbdd)। skip < 0 को अस्वीकार करें। जब तक वे release में नहीं आते: matching rules पर [NS]/[NV]/[N]/[S=-1] से बचें, या RewriteValve हटा दें।
52f3b364e5882a5dbcfc42cb8313a7c2ae532c64)RewriteValve.java में isNext() restart और startsWith("N")RewriteRule.java substitution - मूल URL लौटाता है