XStream CVE-2019-10173漏洞分析

本文详细分析了XStream库中的CVE-2013-7285漏洞修复及绕过的全过程,通过对比不同版本的XStream,展示了如何利用未初始化的安全框架重现此漏洞。

前言

首发NOSEC

该漏洞为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 framework. Only 1.4.10 uninitialized security framework 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这样的构建工具来讲,只要简单的改下版本号就可以升级了。

个人感觉是这么个过程:

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

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

在这里插入图片描述

分析完了感觉:

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值