# V5335. OWASP. Potential XXE vulnerability. Insecure XML parser is used to process potentially tainted data.

Анализатор обнаружил использование небезопасно сконфигурированного XML-парсера, который обрабатывает данные, полученные из внешнего источника. Это может сделать приложение уязвимым к XXE-атаке. Подробнее суть данной атаки описана здесь.

Уязвимости такого типа относятся к следующим категориям рисков OWASP Top 10:

- A4:2017 — XML External Entities (XXE)
- A05:2021 — Security Misconfiguration

Рассмотрим простой пример. Есть приложение, которое принимает запросы в виде XML-файлов и обрабатывает товары с соответствующим идентификатором. Если идентификатор задан неверно, приложение сообщает об этом.

Формат XML-файла, с которым работает приложение:

    <?xml version="1.0" encoding="utf-8" ?>
    <shop>
      <itemID>62</itemID>
    </shop>

Допустим, обработкой занимается следующий код:

    public static void processItemWithID(String pathToXmlFile) {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      var document = builder.parse(pathToXmlFile);    // <=
      var nodeList = document.getElementsByTagName("itemID");
      String itemiD = nodeList.item(0).getTextContent();
      try {
        long itemIDvalue = Long.parseLong(itemiD);
        // process the item with 'itemIDvalue' value
        System.out.printf("An item with the %d ID was processed.%n", itemIDvalue);
      } catch (NumberFormatException e) {
        System.out.printf("%s is not valid 'itemID' value.%n", itemiD);
      }
    }

Для приведённого выше XML-файла приложение распечатает следующую строку:

    An item with the '62' ID was processed.

Если вместо номера в ID будет записано что-то другое (например, строка "Hello world"), приложение сообщит об ошибке:

    "Hello world" is not valid 'itemID' value.

Несмотря на то, что код решает поставленную задачу, он уязвим к XXE-атакам за счёт соблюдения всех перечисленных ранее факторов:

- содержимое XML поступает от пользователя;
- XML-парсер сконфигурирован таким образом, чтобы обрабатывать внешние сущности;
- вывод может передаваться обратно пользователю.

Ниже представлен XML-файл, через который можно скомпрометировать данный код:

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE foo [
      <!ENTITY xxe SYSTEM "file://D:/MySecrets.txt">
    ]>
    <shop>
      <itemID>&xxe;</itemID>
    </shop>

В этом файле объявляется внешняя сущность `xxe`, которая будет обработана парсером. Вследствие этого содержимое файла `D:/MySecrets.txt` (например, такое: `This is an XXE attack target.`), находящегося на машине, где запущено приложение, будет выдано пользователю:

    This is an XXE attack target. is not valid 'itemID' value.

Для того, чтобы обезопаситься от подобной атаки, можно запретить обработку внешних сущностей, а также запретить или игнорировать обработку DTD. В примере, описанном выше, можно запретить обработку внешних сущностей, указав следующие строки перед созданием экземпляра `DocumentBuilder`:

    String feature = "http://xml.org/sax/features/external-general-entities";
    factory.setFeature(feature, false);

Полностью запретить обработку DTD можно следующим образом:

    String feature = "http://apache.org/xml/features/disallow-doctype-decl";
    factory.setFeature(feature, true);

Обратите внимание, что существуют самые разнообразные парсеры, предназначенные для обработки XML-документов, которые могут быть уязвимы для XXE или нет, в зависимости от их настроек и версий. Для некоторых базовых типов способы защиты от XXE описаны здесь.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).

Данная диагностика классифицируется как:

CWE-611 OWASP-5.5.2