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这样的构建工具来讲,只要简单的改下版本号就可以升级了。

个人感觉是这么个过程:

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

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

在这里插入图片描述

分析完了感觉:

在这里插入图片描述

### CVE-2019-11477 漏洞详情及修复方法 CVE-2019-11477 是一个存在于 Apache Struts2 框架中的远程代码执行漏洞,通常被称为 "Struts2 REST 插件 XStream 反序列化漏洞"。该漏洞允许攻击者通过构造恶意的 XML 数据包来触发反序列化操作,从而实现远程代码执行。以下是关于该漏洞的详细描述、影响范围和修复方案。 #### 1. 漏洞描述 Apache Struts2 是一个流行的 Java Web 开发框架,广泛用于构建企业级应用程序。CVE-2019-11477 漏洞源于 Struts2 的 REST 插件中使用了 XStream 库进行 XML 数据的反序列化操作。XStream 是一个用于将 Java 对象与 XML 之间相互转换的库,但由于其默认配置缺乏严格的白名单机制,可能导致攻击者通过精心构造的 XML 数据包执行任意代码[^5]。 #### 2. 影响范围 该漏洞主要影响以下版本的 Apache Struts2 框架: - Apache Struts2 版本 2.3.x 至 2.3.34 - Apache Struts2 版本 2.5.x 至 2.5.16 如果应用程序启用了 Struts2 的 REST 插件,并且使用了 XStream 进行 XML 数据处理,则可能受到此漏洞的影响。此外,任何依赖于受影响版本的应用程序或系统都可能存在安全风险。 #### 3. 修复方案 为了解决 CVE-2019-11477 漏洞,建议采取以下措施: - **升级框架版本**:将 Apache Struts2 升级到官方发布的最新安全版本。对于 Struts2,推荐升级到 2.3.35 或更高版本(适用于 2.3 系列),或者 2.5.17 或更高版本(适用于 2.5 系列)[^5]。 - **禁用 REST 插件**:如果应用程序未使用 Struts2 的 REST 插件功能,可以考虑直接禁用该插件以减少攻击面。 - **限制 XStream 功能**:如果必须使用 XStream 库,建议启用其白名单机制,仅允许特定类型的对象进行反序列化操作。可以通过自定义 `XStream` 配置来实现更严格的安全控制。 - **应用防火墙规则**:部署 Web 应用防火墙(WAF),过滤掉可能包含恶意 XML 数据的请求,从而降低被攻击的风险。 以下是一个示例代码片段,展示如何在 XStream 中启用白名单机制以提高安全性: ```java import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.security.ExplicitTypePermission; public class SecureXStreamExample { public static void main(String[] args) { XStream xstream = new XStream(); // 设置白名单,仅允许指定类型的对象进行反序列化 xstream.addPermission(ExplicitTypePermission.ALLOWED_TYPES); xstream.allowTypes(new Class[]{SafeClass.class}); } } ``` #### 4. 总结 CVE-2019-11477 是一个严重的远程代码执行漏洞,可能对使用 Apache Struts2 框架的应用程序造成重大威胁。及时升级框架版本、禁用不必要的插件以及加强 XStream 的安全配置是有效的防护措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值