XStream CVE-2019-10173漏洞分析

fnmsd  1707天前

作者:fnmsd

前言

该漏洞为CVE-2013-7285的补丁“绕过”。

这是一个很迷的洞,POC与CVE-2013-7285一毛一样,该Poc在XStream <=1.4.6和1.4.10上可用,也就是说开始修复的漏洞后来又出现了。

吐句槽:漏洞修复的版本在为1.4.11为2018年10月份发布,然后CVE编号是2019年的?

timg.jfif

官方关于漏洞这么写的(感谢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版本的截图):

1564130295787.png

所有的Converter都实现了Converter接口:

1564130606423.png

在反序列化过程中,XStream会依次调用canConvert来寻找对应的Converter。

1.4.6中处理java.beans.EventHandler的是,ReflectionConverter:

1564130840986.png


1.4.7的Changelog中有这么一句:

java.bean.EventHandler no longer handled automatically because of severe security vulnerability.

java.bean.EventHandler由于安全问题,不会再被自动处理。

于是当版本切换到1.4.7时,Poc失效,会有如下提示:

1564130989179.png

java.beans.EventHandler没有指定的Converter,看下1.4.7版本的ReflectionConverter:

1564131066189.png

可以看出当处理的Class为java.beans.EventHandler时,ReflectionConverter不再进行认为可以处理。


1.4.10,我们可以发现,在不使用setupDefaultSecurity时,Poc又可以弹计算器了,ReflectionConverter中关于EventHandler的判断不见了:

1564131291935.png

此处看下setupDefaultSecurity的内容:

carbon.png

加了一堆白名单,当调用setupDefaultSecurity时,可以拦截本POC:

1564131644741.png

可惜默认不调用,┓( ´∀` )┏。


1.4.11之后,加入了一个新的Converter类InternalBlackList,与XStream类在同一文件中,不论是进行marshal还是unmarshal都会直接报错(序列化时调用marshal,反序列化时调用unmarshal):

1564131738521.png

在注册Converters时,InternalBlackList的优先级LOW高于ReflectionConverter的VERY_LOW,会优先判断。

1564131835069.png

所以可以看出,当时类名为java.beans.EventHandler时,会被分配给该Converter处理:

1564132009589.png

最终直接报了个异常(安全警报,拒绝反序列化):

1564132043585.png

结语

XStream这个洞很迷,估计大部分人升级库的时候都不会注意到要调用setupDefaultSecurity,毕竟对Maven这样的构建工具来讲,只要简单的改下版本号就可以升级了。

个人感觉是这么个过程:

开发做了个新的安全功能,感觉很牛逼,于是旧有的就给下了。

但是新的安全功能不默认开,导致老洞又出来了。。。

2AB45DBA.gif

分析完了感觉:

2AB53C72.jpg

本文由白帽汇投稿原创,转载请注明来源:https://nosec.org/home/detail/2813.html
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务

最新评论

mei丫头啊  :  能否说一下CVE-2013-7285漏洞复现呢
1703天前 回复
昵称
邮箱
提交评论