XStream CVE-2019-10173漏洞分析

前言

首發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這樣的構建工具來講,只要簡單的改下版本號就可以升級了。

個人感覺是這麼個過程:

開發做了個新的安全功能,感覺很牛逼,於是舊有的就給下了。

但是新的安全功能不默認開,導致老洞又出來了。。。

在這裏插入圖片描述

分析完了感覺:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章