前言
首發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這樣的構建工具來講,只要簡單的改下版本號就可以升級了。
個人感覺是這麼個過程:
開發做了個新的安全功能,感覺很牛逼,於是舊有的就給下了。
但是新的安全功能不默認開,導致老洞又出來了。。。
分析完了感覺: