FlawOpen

flawopen.com/XXE/Безопасность XML-парсера Java

XXE в Java: безопасна ли DocumentBuilderFactory по умолчанию?

CWE-611: Improper Restriction of XML External Entity ReferenceСправочник Java XML
Короткий ответ: внешний доступ по умолчанию не запрещён

JDK включает некоторые ограничения обработки по умолчанию, но стандартная конфигурация DOM и SAX не блокирует доступ к внешним ресурсам. Поэтому XML может инициировать обращения к файлам или сети, если приложение явно их не ограничит. Поведение также зависит от стороннего JAXP-провайдера. Настройте фактически используемый парсер; не считайте одну лишь версию Java гарантией безопасности.

НЕБЕЗОПАСНО
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newInstance();
DocumentBuilder builder =
    factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

// Java 9+: явно включите ограничения JAXP.
// Если обязательная настройка не поддерживается — остановитесь.
// Парсер может разрешать внешний доступ по умолчанию.
ЗАЩИЩЕНО
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newDefaultInstance();

// Не проверяйте на реальных файлах и сервисах.
factory.setFeature(
    XMLConstants.FEATURE_SECURE_PROCESSING, true);
factory.setFeature(
    "http://apache.org/xml/features/"
    + "disallow-doctype-decl", true);
factory.setAttribute(
    XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setXIncludeAware(false);

// Лимиты размера задаются отдельно.
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

Почему для DOM лучше запрещать DOCTYPE

Если парсер поддерживает запрет DOCTYPE, он предотвращает обработку внешних сущностей и объявлений DTD. Явно включите FEATURE_SECURE_PROCESSING и дополнительно ограничьте доступ к внешним DTD; включённый по умолчанию FSP не означает запрет внешних соединений. Отключите XInclude, если он не нужен. Если провайдер не поддерживает обязательную настройку, прервите инициализацию парсера, а не продолжайте с частичной защитой.

Если приложению нужны DTD, не разрешайте внешний доступ. Отключите внешние общие и параметрические сущности, загрузку внешних DTD и XInclude; установите пустое значение для ACCESS_EXTERNAL_DTD и сохраните лимиты обработки. setExpandEntityReferences(false) меняет представление дерева, но не блокирует внешние ресурсы.

Настраивайте каждый процессор JAXP отдельно

Политика распространяется на обработку XML, но настройки различаются по API. Проверьте SAXParserFactory/XMLReader, StAX XMLInputFactory, TransformerFactory, SchemaFactory, Validator и JAXB. StAX не поддерживает FEATURE_SECURE_PROCESSING; отключите DTD и внешние сущности собственными свойствами. Ограничьте также внешние схемы и таблицы стилей. Используйте примеры OWASP для конкретных API и проверьте активного провайдера.

Не считайте настройки одного парсера общей защитой JVM. Провайдер JAXP может выбрать реализацию вместо встроенной JDK; составные процессоры создают внутренние парсеры. Тестируйте именно runtime, провайдера и путь кода из production.

Частые вопросы

FEATURE_SECURE_PROCESSING по умолчанию блокирует внешние сущности?

Нет, если функция лишь включена по умолчанию. Oracle указывает, что стандартный FSP задаёт лимиты обработки, но внешние соединения остаются разрешены, пока FSP явно не включён через API или не настроены свойства внешнего доступа. Задайте политику явно и проверьте провайдера.

Изменили ли новые версии JDK значения по умолчанию?

Новые JDK добавляли ограничения и лимиты, но руководство Oracle JAXP по-прежнему отделяет FSP по умолчанию от явного запрета внешнего доступа. Сторонние провайдеры также отличаются. Задавайте нужные настройки явно.

Что делать, если корректным документам нужен DTD?

По возможности используйте доверенный локальный каталог или resolver. Если DTD необходим, блокируйте внешние протоколы и загрузку сущностей, сохраните лимиты JAXP и отключите XInclude, если он не нужен. Проверьте сложную политику на конкретном провайдере и допустимых документах.

Источники и ссылки

См. также Внедрение внешних сущностей XML (XXE, CWE-611): как работает и как предотвратить — flawopen.com Безопасность Python XML и XXE: ElementTree, Expat, lxml Защищён ли .NET XmlReader от XXE?