flawopen.com/XXE/Безопасность XML-парсера Java
XXE в Java: безопасна ли DocumentBuilderFactory по умолчанию?
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.
Частые вопросы
Нет, если функция лишь включена по умолчанию. Oracle указывает, что стандартный FSP задаёт лимиты обработки, но внешние соединения остаются разрешены, пока FSP явно не включён через API или не настроены свойства внешнего доступа. Задайте политику явно и проверьте провайдера.
Новые JDK добавляли ограничения и лимиты, но руководство Oracle JAXP по-прежнему отделяет FSP по умолчанию от явного запрета внешнего доступа. Сторонние провайдеры также отличаются. Задавайте нужные настройки явно.
По возможности используйте доверенный локальный каталог или resolver. Если DTD необходим, блокируйте внешние протоколы и загрузку сущностей, сохраните лимиты JAXP и отключите XInclude, если он не нужен. Проверьте сложную политику на конкретном провайдере и допустимых документах.