Apache Commons JXPath 任意代码执行漏洞(CVE-2022-41852) 原创
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 中的属性(没有异常):
由于处理 XPath 字符串的 JXPathContext 类中的函数是通过Class.forName
反射加载的传入的 XPath 字符串 , 而且可以通过外部控制输入来选择类或代码,攻击者可利用此机制加载任意恶意Java类。
漏洞复现
- 加载本地任意恶意代码
通过**newContext
(
Object
** contextBean)
方法生成一个JXPathContext对象,传入的contextBean
可以是同一个 CLASSPATH 中包含恶意代码的Java类。
- 加载远程恶意代码
- 在本地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 直接处理用户输入,需要对用户传入的数据进行过滤校验;
开发建议
- 尽量通过重构代码来避免使用反射功能代码。