flawopen.com/XXE/XML-парсеры .NET
Защищён ли XmlReader от XXE в .NET?
Представьте 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);
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:
- ✓XmlReader.Create с настройками по умолчанию — по умолчанию действует DtdProcessing.Prohibit. Устанавливайте его явно на границах недоверенного ввода, чтобы последующее изменение настроек случайно не включило DTD.
- ✓XmlReaderSettings.XmlResolver — в .NET Framework 4.5.2 значение по умолчанию изменили на null; более ранние версии могли использовать XmlUrlResolver. Явно задайте null и проверьте переключатель совместимости EnableLegacyXmlSettings.
- ✓XmlTextReader — прямое использование этого старого API имеет другие значения по умолчанию и может разбирать DTD. Предпочитайте XmlReader.Create с явными настройками; не подключайте сетевой или файловый resolver к недоверенному XML.
- ✓XmlDocument и LINQ to XML — поведение зависит от способа загрузки и целевой платформы. Передавайте им защищённый XmlReader, а доступные resolver задавайте как null.
В .NET Framework 4.5.2 значение XmlReaderSettings.XmlResolver по умолчанию стало null, а MaxCharactersFromEntities при инициализации получил предел 10 миллионов; это не сделало все XML API и конфигурации одинаковыми. Переключатель совместимости может вернуть прежние параметры. Явно задавайте политику парсера, ограничивайте размер документа и проверяйте фактические целевую платформу и конфигурацию среды выполнения.
Частые вопросы
Да. XmlReaderSettings.DtdProcessing по умолчанию равен Prohibit и вызывает исключение при обнаружении DTD. Всё равно задайте его явно и используйте XmlResolver = null как дополнительную защиту.
В целях безопасности XmlReaderSettings.XmlResolver по умолчанию стал null, а MaxCharactersFromEntities инициализируется значением 10 миллионов. Параметр EnableLegacyXmlSettings может вернуть прежнее поведение; проверяйте конфигурацию развертывания, а не только целевую версию.
Может затрагивать. Эти форматы содержат XML, но последствия зависят от парсера и его настроек. Каждый входящий недоверенный XML направляйте в защищённый reader, ограничивайте размер входа и учитывайте рекомендации безопасности конкретной библиотеки формата.
Источники и ссылки
- Microsoft Learn — XmlReaderSettings и безопасность
- Microsoft Learn — изменения разбора XML в .NET Framework 4.5.2
- Microsoft Learn — XmlReader.Create и resolver
- Microsoft Learn — XmlTextReader.XmlResolver
- OWASP — защита от XXE
- CWE-611 — XML External Entity Reference
- XXE по умолчанию в Java DocumentBuilderFactory