Небольшое исправление для CVE-2016-3720 в более старых версиях jackson-all-1.9.11 и в jackson 2.x, которое не исправлено.

Объяснение CVE-2016-3720 https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-3720 расплывчато, но, прочитав код, я обнаружил следующие проблемы. Даже после устранения проблем средство проверки зависимостей OWasp по-прежнему сообщает, что файл jar уязвим для атаки. Я думаю, что это имеет ложное срабатывание после того, как исправление было применено.

CVE-2016-3720 раскрывает атаку внедрения 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.


person Peter Lenahan    schedule 24.06.2016    source источник
comment
Исходный код Jackson 1.x (на уровне 1.9.13 или около того и некоторых других ветвях) находится по адресу: github .com/FasterXML/jackson-1   -  person StaxMan    schedule 02.12.2019


Ответы (4)


Вот что вам нужно сделать:

Используя веб-декомпилятор ( www.javadecompilers.com ), вы можете получить весь исходный код для jar-файл jackson-all-1.9.11.jar. (Это будет работать на любой версии Джексона)

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 состоит в том, чтобы добавить следующую строку в два файла.

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

Я надеюсь, что вы нашли это полезным.

person Peter Lenahan    schedule 24.06.2016

Даже после устранения проблем средство проверки зависимостей OWasp по-прежнему сообщает, что файл jar уязвим для атаки. Я думаю, что это имеет ложное срабатывание после того, как исправление было применено.

Обратите внимание, что OWASP DC не сканирует код. Он использует свидетельство, такое как имя JAR, чтобы связать его с данными в NVD, поэтому, если имя 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>

Обратите внимание: если вы уже используете файл подавления, вы просто добавляете новую запись <suppress> в существующий файл.

person Michael Johnson    schedule 30.06.2016

Одно примечание ко второй части: вместо изменения исходного кода можно передать явно созданный экземпляр XmlFactory (через XmlMapper). Конструктор доступен с версии 2.4. Это позволяет избежать необходимости управлять модифицированными банками.

person StaxMan    schedule 24.06.2016

Исходный код jackson 1 доступен по адресу https://github.com/FasterXML/jackson-1. . Я создал запрос на вытягивание: https://github.com/FasterXML/jackson-1/pull/1

person PJ Fanning    schedule 01.07.2016