法律声明
中华人民共和国刑法: 第285、286、287条
第二百八十五条 违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。
第二百八十六条 违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的,处五年以上有期徒刑。违反国家规定,对计算机信息系统中存储、处理或者传输的数据和应用程序进行删除、修改、增加的操作,后果严重的,依照前款的规定处罚。故意制作、传播计算机病毒等破坏性程序,影响计算机系统正常运行,后果严重的,依照第一款的规定处罚。
第二百八十七条 利用计算机实施金融诈骗、盗窃、贪污、挪用公款、窃取国家秘密或者其他犯罪的,依照本法有关规定定罪处罚。
用知识的土壤来填埋这些坑洞
Apache Commons Configuration:
Apache Commons Configuration 软件库提供了一个通用配置接口,使 Java 应用程序能够从各种来源读取配置数据。
RCE(remote command/code execute):远程命令/代码执行
命令执行漏洞: 直接调用操作系统命令。
代码执行漏洞: 靠执行脚本代码调用操作系统命令。
原因:在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
Apache Commons Configuration缺陷:
可以使用默认变量插值功能在 Apache Commons Configuration缺陷文件(存在于版本 2.4 到 2.7)中执行任意代码执行,具体源于ConfigurationInterpolator类中的插值函数。
在正常情况下, interpolate 函数接收一个包含变量的对象值,如果可以解析,则替换它们,这会产生一个替换变量的传入值.
本次我下载commons-configuration-2.7版本的来进行分析,打开interpol包中的ConfigurationInterpolator类,定位到函数fetchLookupForPrefix。
1
2
3
4
protected Lookup fetchLookupForPrefix(final String prefix)
{
return nullSafeLookup(prefixLookups.get(prefix));
}
interpol:带有用于插值(变量替换)的辅助类的包。
ConfigurationInterpolator:为配置处理插值(变量替换)的类。
fetchLookupForPrefix:获取指定前缀的查找对象,该方法由lookup() 方法调用, 此实现将检查是否为给定前缀注册了查找对象, 如果没有,将返回一个空查找对象(永不为空)。
lookup:定义用于在插值期间查找变量的接口。 可以为实现此接口的对象分配变量前缀并添加到 ConfigurationInterpolator 对象。 每当 ConfigurationInterpolator 遇到引用变量的属性值时,例如 ``${prefix:variableName}},它提取前缀并找到匹配的查找对象。 然后要求这个对象解析变量名并提供相应的值。 该接口定义了一个用于执行变量查找的方法, 它被传递一个变量的名称,并且必须返回相应的值。 当然,这取决于具体的实现方式, 如果无法解析变量名,则实现必须返回 null。
漏洞编号:CVE-2022-33980
漏洞描述:
Apache Commons Configuration 执行变量插值,允许动态评估和扩展属性。插值的标准格式是“${prefix:name}”,其中“prefix”用于定位执行插值的 org.apache.commons.configuration2.interpol.Lookup 的实例。从 2.4 版到 2.7 版,默认的 Lookup 实例集包括可能导致任意代码执行或与远程服务器联系的插值器。 这些查找是:
- “script” - 使用 JVM 脚本执行引擎 (javax.script) 执行表达式
- “dns” - 解析 dns 记录
- “url” - 从 url 加载值,包括从远程服务器 如果使用了不受信任的配置值,则在受影响版本中使用插值默认值的应用程序可能容易受到远程代码执行或与远程服务器的无意接触的影响。 建议用户升级到 Apache Commons Configuration 2.8.0,默认情况下禁用有问题的插值器。 减轻: 升级到 Apache Commons Configuration 2.8.0 版本
变量插值:
通常我们用apach的configuration2库来管理配置文件(org.apache.commons:commons-configuration2),在commons-configuration2管理的配置文件中,配置变量的值可以引用变量。
举个例子:${env:xxxx}就指代环境变量xxxx,在commons-configuration2中这种引用动态变量的方式就叫变量插值。
变量插值解析:在commons-configuration2中,负责对字符串中的变量进行解析的是org.apache.commons.configuration2.interpol.ConfigurationInterpolator类中的interpolate(Object)方法。
本次因为没有搭建环境做demo,所以只是对源码进行分析,学习下相关原理,如有意了解详细代码审计流程,可参考链接。