FlawOpen

flawopen.com/XXE/XML-парсеры .NET

Защищён ли XmlReader от XXE в .NET?

CWE-611: XML External Entity ReferenceКороткий ответ
Короткий ответ

Представьте DTD как разрешение парсеру загружать документы, указанные в XML. XmlReader.Create по умолчанию отклоняет DTD, поэтому недоверенный документ не может использовать этот путь, пока приложение его не включит. Важны и старые API, и целевая версия платформы: явно запрещайте DTD и отключайте внешнее разрешение на границе разбора.

НЕБЕЗОПАСНО — старые или ослабленные настройки
// Прямой старый reader может включить разбор DTD
// внешний resolver может загружать указанные ресурсы.
var legacy = new XmlTextReader(stream) {
    DtdProcessing = DtdProcessing.Parse,
    XmlResolver = new XmlUrlResolver()
};
while (legacy.Read()) { }

// Явно включать DTD для недоверенного XML опасно:
var unsafeSettings = new XmlReaderSettings {
    DtdProcessing = DtdProcessing.Parse,
    XmlResolver = new XmlUrlResolver()
};
using var reader = XmlReader.Create(stream, unsafeSettings);
ЗАЩИЩЕНО — запретить DTD и внешние ресурсы
var settings = new XmlReaderSettings {
    // Отклонять любой документ, содержащий DTD.
    DtdProcessing = DtdProcessing.Prohibit,
    // Дополнительная защита: не загружать внешние ресурсы.
    XmlResolver = null,
    // Подберите пределы под допустимые входные данные.
    MaxCharactersInDocument = 1_000_000,
    MaxCharactersFromEntities = 1_024,
};

using var reader = XmlReader.Create(stream, settings);
var doc = new XmlDocument { XmlResolver = null };
doc.Load(reader);

Какой XML API и версию .NET вы используете?

.NET has several XML APIs whose defaults have differed, and whose defaults have also changed across framework versions. The practical summary:

В .NET Framework 4.5.2 значение XmlReaderSettings.XmlResolver по умолчанию стало null, а MaxCharactersFromEntities при инициализации получил предел 10 миллионов; это не сделало все XML API и конфигурации одинаковыми. Переключатель совместимости может вернуть прежние параметры. Явно задавайте политику парсера, ограничивайте размер документа и проверяйте фактические целевую платформу и конфигурацию среды выполнения.

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

Запрещает ли XmlReader.Create DTD по умолчанию?

Да. XmlReaderSettings.DtdProcessing по умолчанию равен Prohibit и вызывает исключение при обнаружении DTD. Всё равно задайте его явно и используйте XmlResolver = null как дополнительную защиту.

Что изменилось в .NET Framework 4.5.2?

В целях безопасности XmlReaderSettings.XmlResolver по умолчанию стал null, а MaxCharactersFromEntities инициализируется значением 10 миллионов. Параметр EnableLegacyXmlSettings может вернуть прежнее поведение; проверяйте конфигурацию развертывания, а не только целевую версию.

Затрагивает ли это SOAP, SAML и документы Office?

Может затрагивать. Эти форматы содержат XML, но последствия зависят от парсера и его настроек. Каждый входящий недоверенный XML направляйте в защищённый reader, ограничивайте размер входа и учитывайте рекомендации безопасности конкретной библиотеки формата.

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

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