1Thek2
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

漏洞描述
2022年10月13号发布了Apache Commons Text的漏洞告警,漏洞编号:CVE-2022-42889。
Apache Commons Text 执行变量插值,允许动态评估和扩展属性。插值的标准格式是“${prefix:name}”,其中“prefix”用于定位执行插值的org.apache.commons.text.lookup.StringLookup
的实例。从 1.5 版到 1.9 版,默认 Lookup 实例集包括可能导致任意代码执行或与远程服务器联系的插值器。这些查找是: - “script” - 使用 JVM 脚本执行引擎 (javax.script) 执行表达式 - “dns” - 解析 dns 记录 - “url” - 从 url 加载值,包括来自远程服务器 如果使用了不受信任的配置值,则在受影响的版本中使用插值默认值的应用程序可能容易受到远程代码执行或与远程服务器的无意接触的影响。
影响范围
commons-text 1.5-1.9
自检方法
查看引用的组件版本是否在1.5-1.9之间
查看是否使用了
StringSubstitutor.createInterpolator()
方法或者实力化时用了如下写法new StringSubstitutor(StringLookupFactory.INSTANCE.interpolatorStringLookup())
修复方案
- 升级版本至1.10.0
- 禁止使用
StringSubstitutor.createInterpolator()
或者new StringSubstitutor(StringLookupFactory.INSTANCE.interpolatorStringLookup())
的写法
漏洞分析
commoms.text包的常用方法用于替换文本中的内容
漏洞的问题在于createInterpolator
函数 可以看到这里实例了StringSubstitutor
,并传入了StringLookupFactory.INSTANCE.interpolatorStringLookup()
方法
跟进去看下这个构造方法
这里的传入参数是个接口,各个类实现了lookup的方法
看下interpolatorStringLookup
的方法
public StringLookup interpolatorStringLookup() {
return InterpolatorStringLookup.INSTANCE;
}
InterpolatorStringLookup() {
this((Map<String, String>) null);
}
InterpolatorStringLookup(final Map<String, StringLookup> stringLookupMap, final StringLookup defaultStringLookup,
final boolean addDefaultLookups) {
super();
this.defaultStringLookup = defaultStringLookup;
this.stringLookupMap = new HashMap<>(stringLookupMap.size());
for (final Entry<String, StringLookup> entry : stringLookupMap.entrySet()) {
this.stringLookupMap.put(toKey(entry.getKey()), entry.getValue());
}
if (addDefaultLookups) {
StringLookupFactory.INSTANCE.addDefaultStringLookups(this.stringLookupMap);
}
}
这里会通过传入的key关键词找到对应的lookup实现类
而对传入的参数处理就是根据${a:b}的格式生成map,key就是a的值
比如参入${url:"http://xxx.com"},就会到urlStringLookup类中调用lookup方法
以上就是漏洞出现过程,作者本身也给出了语法使用
在StringLookupFactory发现存在ScriptStringLookup类,lookup方法中使用javax.Script引擎进行动态解析
构造传入参数,这样我们就能进行命令执行
总结
在作者的代码中可以发现其本身就构造了这个方法,应用于一些需求,漏洞条件使用苛刻,正常使用不会触发漏洞,且在1.5,1.6中没有createInterpolator()
方法,得使用new StringSubstitutor(StringLookupFactory.INSTANCE.interpolatorStringLookup())
方法才能执行命令,非特殊场景不容易形成漏洞,影响面较小。
---------------------------------------------------------------------------------------------------------------
**漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。
招聘内推计划:涵盖安全开发、安全测试、代码审计、安全合规等所有方面的岗位,简历投递sec#tuya.com,请注明来源。**
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)