Apache Commons JXPath 任意代码执行漏洞(CVE-2022-41852)

Apache Commons JXPath 是一个 XPath 表达式语言的简单解释器。近期有安全研究者通过 oss-fuzz 发现 JXPath 存在任意代码执行漏洞(CVE-2022-41852),建议开发人员留意自己是否在使用该组件。

墨菲安全实验室
墨菲安全实验室   Follow

Apache Commons JXPath 是一个 XPath 表达式语言的简单解释器。JXPath 将 XPath 表达式应用于各种类型的对象如: JavaBeans、 Maps、 Servlet contexts 和 DOM 等,对于喜欢 XML 风格 API 的开发者来说 JXPath 是一个高效的工具。

近期有安全研究者通过 oss-fuzz 发现 JXPath 存在任意代码执行漏洞(CVE-2022-41852),建议开发人员留意自己是否在使用该组件。

# 漏洞简述

commons-jxpath:commons-jxpath 在1.3 (2008 年发布,官方暂未发布新版本)及之前版本中存在任意代码执行漏洞,使用 JXPath 来解释不受信任的 XPath 表达式时容易受到远程代码执行漏洞影响,除了 compile() 和 compilePath() 函数以外所有处理 XPath 字符串的 JXPathContext 类中的函数都容易受到攻击。攻击者可以使用 XPath 表达式从类路径加载任意 Java 类,从而导致任意代码执行。

# 漏洞分析

# 背景

2022年9月30日,安全研究人员通过oss-fuzz在 org.apache.commons.jxpath 中捕获到java.lang.Class.forName 异常所形成的 Crash。

# 原因

newContext(Object contextBean)方法为例,该方法使用指定的对象作为根节点创建一个新的 JXPathContext。调用 JXPathContext.getValue方法通过XPath获取JXPathContext对象的属性时,如果传入的contextBean不存在于 CLASSPATH 中会引发异常。

下图为没开8090端口的服务(异常):

下图为获取本地 CLASSPATH 中的属性(没有异常):

# 漏洞复现

  1. 加载本地任意恶意代码

    通过newContext(Object contextBean)方法生成一个JXPathContext对象,传入的contextBean可以是同一个 CLASSPATH 中包含恶意代码的Java类。

  2. 加载远程恶意代码

    • 在本地8099端口开启一个web服务,并自定义bean.xml

      <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 class="java.lang.ProcessBuilder" init-method="start">
              <constructor-arg>
                  <value>calc.exe</value>
              </constructor-arg>
          </bean>
      </beans>
      
    • 通过 spring 的 ClassPathXmlApplicationContext 类读取远程 xml 加载到攻击者本地CLASSPATH 中。通过 JXPath 不安全的反射机制造成远程代码执行

# 不安全的反射所带来的影响

  • 攻击者能够执行攻击者无法直接访问的代码;

  • 攻击者可以在错误的位置或时间调用其它代码会更改关键的系统状态。

  • 攻击者能够使用反射来调用错误的代码,通过使用错误的 API 参数,导致应用程序退出或挂起,也会触发运行时错误,从而泄露错误消息中的敏感信息。

# 给开发者的建议

# 漏洞修复建议

  • org.apache.commons.jxpath 暂未发布补丁,请关注官方公告:https://commons.apache.org/proper/commons-jxpath/

  • 避免使用 jxpath 直接处理用户输入,需要对用户传入的数据进行过滤校验;

# 开发建议

  • 尽量通过重构代码来避免使用反射功能代码。

# 参考链接

  • https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=47133
  • https://nvd.nist.gov/vuln/detail/CVE-2022-41852