当前位置: 首页 > 知识库问答 >
问题:

CVE-2016-3720和旧版本的jackson-all-1.9.11以及jackson 2中的小补丁。未修补的x

姬英武
2023-03-14

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)\u处理XML实体注入攻击可以在XML文件的解析中创建无限循环
这将最终耗尽应用程序服务器中的所有内存,或者它可以向外部站点注入引用(这就是报告的问题)。

遗憾的是,Github上没有旧版本Jackson的源代码,项目源代码版本只能返回到Jackson-databind-2.0.0-RC1级别。

如果您使用的是较旧版本的Spring,那么您可能无法升级到最新版本的Jackson 2. x,因此现在您面临安全困境。如何修复漏洞,无需升级Spring。

共有3个答案

秦昊穹
2023-03-14

杰克逊1的源代码可在https://github.com/FasterXML/jackson-1.我已经创建了一个拉请求:https://github.com/FasterXML/jackson-1/pull/1

卜鹏
2023-03-14

即使解决了这些问题,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>

请注意,如果您已经在使用抑制文件,只需添加新的

金晨
2023-03-14

这是您需要做的:

使用基于web的de编译器(www.javadecompilers.com),您可以获得jar文件jackson-all-1.9.11的所有源代码。罐子(这将适用于任何版本的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版本中,停止实体注入的解决方案是在这两个文件中添加以下行。

.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);
    }

我希望你觉得这很有帮助。

 类似资料:
  • 我们有一个属性为的文章资源: 标题 图像 描述: __________ 状态:已发布|草稿 如果我们只想删除图像,我们提出请求 如果我们只想更新状态,我们会提出请求 但在这种情况下,图像也将被删除。 如何在REST中只更新一个属性?

  • Git 中的一些命令是以引入的变更即提交这样的概念为中心的,这样一系列的提交,就是一系列的补丁。 这些命令以这样的方式来管理你的分支。 git cherry-pick git cherry-pick 命令用来获得在单个提交中引入的变更,然后尝试将作为一个新的提交引入到你当前分支上。 从一个分支单独一个或者两个提交而不是合并整个分支的所有变更是非常有用的。 在 变基与拣选工作流 一节中描述和演示了

  • 问题内容: com.android.volley.NoConnectionError:java.net.ProtocolException:未知方法“ PATCH”;必须是[OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE]中的一种 问题答案: 您确定使用的Volley Library版本正确吗?我刚刚在Lollipop中尝试了您的代码,它工作正常。如果您将Volley

  • 首先要说的,这个仅属把补丁打包而安装补丁的过程是通过运行XPLODE.EXE而实现的! 本脚本主要实现可以在安装过程调用Xplode实现马上安装的,另外可以选择重启后安装,就是写入注册实现重启后运行一次的命令!我将补丁放在SEV里面 ,SE2为另外的一些软件也可以。CLEAN.EXE为垃圾清理工具。 目录参考 ├─SEV │ └─SE2 └─TEMP └─ XPLODEREGISTRY.X4E └

  • 除了下载软件包之外,还有一些补丁需要下载。这些补丁修正了本该由软件包开发者修正的错误;另外也做了一些小的修改,使得软件包之间可以更好的协同工作。构建 LFS 系统需要下列补丁: Bash Upstream Fixes Patch - 23 KB: 下载:http://www.linuxfromscratch.org/patches/lfs/6.2/bash-3.1-fixes-8.patch MD

  • 向app store发布新的app版本可能需要一些时间。Tabris.js允许直接向你的用户发布热更新,而无需等待app store更新。 为了符合Apple App Store的规则,修补程序必须“[…] not change the primary purpose of the app by providing features or functionality that are incons