﻿# V5336\. OWASP\. Potential XEE vulnerability\. Insecure XML parser is used to process potentially tainted data\.

Анализатор обнаружил использование небезопасно сконфигурированного XML\-парсера, который обрабатывает данные без ограничения на использование XML\-сущностей\. Это может сделать приложение уязвимым к XEE\-атаке \(альтернативные названия: billion laughs\-атака или атака с помощью XML\-бомб\)\. Подробнее суть данной атаки описана здесь\.

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

* [A4:2017 — XML External Entities \(XXE\)](https://owasp.org/www-project-top-ten/2017/A4_2017-XML_External_Entities_(XXE).html)
* [A05:2021 — Security Misconfiguration](https://owasp.org/Top10/A05_2021-Security_Misconfiguration/)

В некоторых случаях отсутствие контроля над количеством рекурсивных определений сущностей может приводить к возможности эксплуатации атаки XEE\. Если злоумышленник получит возможность отправить XML\-файл приложению, то запустится сложная обработка, которая может привести к перегрузке парсера\. Эта сложная обработка отключена по умолчанию в современных парсерах, но для гарантированной безопасности рекомендуется явно отключать вложенные и внешние сущности\.

Рассмотрим простой пример с небезопасной настройкой в [`DocumentBuilderFactory`](https://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html#setFeature-java.lang.String-boolean-):

```cpp
Document readXML(String xml) throws .... {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, false);
    return factory.newDocumentBuilder().parse(xml);
}
```

В данном примере разработчик, явно выставив `false`, отключил безопасный режим обработки XML\. Исходя из этого, будут отключены следующие ограничения:

* на глубину рекурсии при обработке DTD;
* на количество сущностей\.

Для того чтобы обезопасить приложение от XEE\-атаки, можно запретить обработку внешних сущностей и явно включить безопасный режим парсинга XML:

```cpp
Document readXML(String xml) throws .... {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
    String feature = "http://xml.org/sax/features/external-general-entities"; 
    factory.setFeature(feature, false);
    return factory.newDocumentBuilder().parse(xml);
}
```

Обратите внимание, что существуют самые разнообразные парсеры, предназначенные для обработки XML\-документов, которые могут быть уязвимы для XEE или нет, в зависимости от их настроек и версий\. Для некоторых базовых типов способы защиты от XEE описаны [здесь](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java)\.