XStream CVE-2019-10173漏洞分析
作者:fnmsd
前言
该漏洞为CVE-2013-7285的补丁“绕过”。
这是一个很迷的洞,POC与CVE-2013-7285一毛一样,该Poc在XStream <=1.4.6和1.4.10上可用,也就是说开始修复的漏洞后来又出现了。
吐句槽:漏洞修复的版本在为1.4.11为2018年10月份发布,然后CVE编号是2019年的?
官方关于漏洞这么写的(感谢Badcode师傅给的提醒,要不还在找绕过呢):
This maintenance release addresses again the security vulnerability CVE-2013-7285, an arbitrary execution of commands when unmarshalling for XStream instances with uninitialized security fr amework. Only 1.4.10 uninitialized security fr amework was affected.
emm,1.4.10未初始化安全框架时漏洞会生效。
从XStream的ChangeLog可以看出:
1.4.7加入了基于黑白名单的安全框架,但是未提供默认安全配置。
1.4.10加入了setupDefaultSecurity这个用于设置默认安全配置的方法,但是想生效,你得调用它┓( ´∀` )┏。
调试的代码
Java代码:
import com.thoughtworks.xstream.XStream;
import java.io.File;
public class main {
public static void main(String args[]){
XStream xStream = new XStream();
//XStream.setupDefaultSecurity(xStream);//1.4.10后可用,启用默认安全配置,此处先不使用
xStream.fromxml(new File("1.xml"));
}
}
1.xml文件(CVE-2013-7285的POC):
<sorted-set>
<dynamic-proxy>
<interface>java.lang.Comparable</interface>
<handler class="java.beans.EventHandler">
<target class="java.lang.ProcessBuilder">
<command>
<string>calc</string>
</command>
</target>
<action>start</action>
</handler>
</dynamic-proxy>
</sorted-set>
分析
在XStream的解析过程中,每个能被解析的Class都需要找到一个对应的Converter,这些Converter在XStream对象的构造时进行定义(下图为1.4.6版本的截图):
所有的Converter都实现了Converter接口:
在反序列化过程中,XStream会依次调用canConvert来寻找对应的Converter。
1.4.6中处理java.beans.EventHandler的是,ReflectionConverter:
1.4.7的Changelog中有这么一句:
java.bean.EventHandler no longer handled automatically because of severe security vulnerability.
java.bean.EventHandler由于安全问题,不会再被自动处理。
于是当版本切换到1.4.7时,Poc失效,会有如下提示:
java.beans.EventHandler没有指定的Converter,看下1.4.7版本的ReflectionConverter:
可以看出当处理的Class为java.beans.EventHandler时,ReflectionConverter不再进行认为可以处理。
1.4.10,我们可以发现,在不使用setupDefaultSecurity时,Poc又可以弹计算器了,ReflectionConverter中关于EventHandler的判断不见了:
此处看下setupDefaultSecurity的内容:
加了一堆白名单,当调用setupDefaultSecurity时,可以拦截本POC:
可惜默认不调用,┓( ´∀` )┏。
1.4.11之后,加入了一个新的Converter类InternalBlackList,与XStream类在同一文件中,不论是进行marshal还是unmarshal都会直接报错(序列化时调用marshal,反序列化时调用unmarshal):
在注册Converters时,InternalBlackList的优先级LOW高于ReflectionConverter的VERY_LOW,会优先判断。
所以可以看出,当时类名为java.beans.EventHandler时,会被分配给该Converter处理:
最终直接报了个异常(安全警报,拒绝反序列化):
结语
XStream这个洞很迷,估计大部分人升级库的时候都不会注意到要调用setupDefaultSecurity,毕竟对Maven这样的构建工具来讲,只要简单的改下版本号就可以升级了。
个人感觉是这么个过程:
开发做了个新的安全功能,感觉很牛逼,于是旧有的就给下了。
但是新的安全功能不默认开,导致老洞又出来了。。。
分析完了感觉:
本文由白帽汇投稿原创,转载请注明来源:https://nosec.org/home/detail/2813.html
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务
最新评论