【问题标题】:Small fix for CVE-2016-3720 with older versions of jackson-all-1.9.11, and in jackson 2.x which is not patched使用旧版本的 jackson-all-1.9.11 和未修补的 jackson 2.x 对 CVE-2016-3720 的小修复
【发布时间】:2016-10-27 07:49:15
【问题描述】:

CVE-2016-3720https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-3720的解释比较模糊,但是看了代码发现有以下问题。即使在修复了这些问题之后,OWasp 依赖检查工具仍然会报告 jar 文件容易受到攻击。我认为在应用修复后它会出现误报。

CVE-2016-3720 暴露了 Jackson 库中的 XML 实体注入攻击。 https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing XML 实体注入攻击会在解析 XML 文件时造成无限循环。
这最终会耗尽应用服务器中的所有内存, 或者它可以注入对外部站点的引用(这是报告的问题)。

不幸的是,Jackson 旧版本的源代码是 在 Github 上不可用,项目源版本只能回到 jackson-databind-2.0.0-RC1 级别。

如果您使用的是旧版本的 Spring,那么您可能不会 能够升级到最新版本的 Jackson 2.x, 所以现在你有一个安全困境。如何修复漏洞, 无需升级 Spring。

【问题讨论】:

标签: java jackson xxe


【解决方案1】:

这是你需要做的:

使用基于 Web 的反编译器 (www.javadecompilers.com), 您可以获得 jar 文件 jackson-all-1.9.11.jar 的所有源代码。 (这适用于任何版本的 Jackson )

The fixes are fairly simple!

In the 1.9.x version the following 2 files allow XML entity injection.
org/codehaus/jackson/xc/DomElementJsonDeserializer.java
org/codehaus/jackson/map/ext/DOMDeserializer.java

When you update the jar be sure to update the additional nested inner classes.


org/codehaus/jackson/map/ext/DOMDeserializer.class
org/codehaus/jackson/map/ext/DOMDeserializer$DocumentDeserializer.class
org/codehaus/jackson/map/ext/DOMDeserializer$NodeDeserializer.class
org/codehaus/jackson/xc/DomElementJsonDeserializer.class



In the  2.x.x version the package name has changed.
These files need to be modified


com/fasterxml/jackson/databind/ext/DOMDeserializer.java
com/fasterxml/jackson/dataformat/xml/XmlFactory.java

1.9版本中停止Entity injection的解决方法是在这两个文件中加入下面一行。

.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);

这里是添加到反编译代码的地方, 然后重新编译文件,并更新 jar 文件。

    public abstract class DOMDeserializer<T>
extends FromStringDeserializer<T> {
static final DocumentBuilderFactory _parserFactory;
static {
    _parserFactory = DocumentBuilderFactory.newInstance();

    /* CVE-2016-3720 */
    try {
        _parserFactory.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    }
    // Move this line from the static block lower in the file.
    _parserFactory.setNamespaceAware(true);

}

 public DomElementJsonDeserializer() {
    super(Element.class);
    try {
        DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
        bf.setNamespaceAware(true);
        /* CVE-2016-3720 */ 
        bf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);

        this.builder = bf.newDocumentBuilder();
    }
    catch (ParserConfigurationException e) {
        throw new RuntimeException();
    }
}

在 2.x 版本中,您需要稍微修改这个文件。 添加行:

xmlIn.setProperty("javax.xml.stream.isSupportingExternalEntities", Boolean.FALSE);


package com.fasterxml.jackson.dataformat.xml;

public class XmlFactory
extends JsonFactory {


   protected XmlFactory(ObjectCodec oc, int xpFeatures, int xgFeatures, XMLInputFactory xmlIn, XMLOutputFactory xmlOut, String nameForTextElem) {
    super(oc);
    this._xmlParserFeatures = xpFeatures;
    this._xmlGeneratorFeatures = xgFeatures;
    this._cfgNameForTextElement = nameForTextElem;
    if (xmlIn == null) {
        xmlIn = XMLInputFactory.newInstance();
        xmlIn.setProperty("javax.xml.stream.isSupportingExternalEntities", Boolean.FALSE);
    }

希望对您有所帮助。

【讨论】:

【解决方案2】:

jackson 1 源代码可在https://github.com/FasterXML/jackson-1 获得。我创建了一个拉取请求:https://github.com/FasterXML/jackson-1/pull/1

【讨论】:

    【解决方案3】:

    即使在修复了问题之后,OWasp 依赖检查工具仍然报告 jar 文件容易受到攻击。我认为在应用修复后它会出现误报。

    请注意,OWASP DC 不扫描代码。它使用 JAR 名称等证据将其与 NVD 中的数据相关联,因此如果 jar 的名称指示易受攻击的版本,它将识别为易受攻击。当您创建了一个您声称已解决漏洞的 jar 文件时,您可以使用包含以下内容的抑制文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <suppressions xmlns="https://www.owasp.org/index.php/OWASP_Dependency_Check_Suppression">
      <suppress>
        <notes>There I fixed that</notes>
        <sha1>YOUR-JAR-SHA1-HERE</sha1>
        <cve>CVE-2016-3720</cve>
      </suppress>
    </suppressions>
    

    请注意,如果您已经在使用抑制文件,只需将新的 &lt;suppress&gt; 记录添加到现有文件中即可。

    【讨论】:

      【解决方案4】:

      关于第二部分的一点说明:可以通过显式实例化的XmlFactory(通过XmlMapper)来代替修改源代码。构造函数从 2.4 开始可用。这避免了必须管理修改后的 jar。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-26
        • 2016-12-13
        • 1970-01-01
        • 2012-05-30
        • 2016-08-28
        • 2019-08-18
        • 2020-04-21
        • 1970-01-01
        相关资源
        最近更新 更多