XXE: Неправильное ограничение ссылки на внешнюю сущность XML с помощью XDocument

Поэтому я сталкиваюсь с проблемой, когда запускаю проверку безопасности своего приложения. Оказывается, я не в состоянии защитить от XXE. Вот небольшой фрагмент кода, показывающий код ошибки:

static void Main()
        {
            string inp = Console.ReadLine();
            string xmlStr = ""; //This has a value that is much too long to put into a single post

            if (!string.IsNullOrEmpty(inp))
            {
                xmlStr = inp;
            }
            XmlDocument xmlDocObj = new XmlDocument {XmlResolver = null};
            xmlDocObj.LoadXml(xmlStr);
            XmlNodeList measureXmlNodeListObj = xmlDocObj.SelectNodes("REQ/MS/M");

            foreach (XmlNode measureXmlNodeObj in measureXmlNodeListObj)
            {
                XmlNode detailXmlNodeListObj = xmlDocObj.SelectSingleNode("REQ/DTD");
                string measureKey = measureXmlNodeObj.Attributes["KY"].Value;
                if (detailXmlNodeListObj.Attributes["MKY"].Value ==
                    measureKey) //Checking if selected MeasureKey is same 
                {
                    XmlNode filerNode = measureXmlNodeObj.SelectSingleNode("FS");

                    if (filerNode != null)
                    {

                        XDocument fixedFilterXmlObj = XDocument.Load(new StringReader(filerNode.OuterXml));

                        var measureFixedFilters = (from m in fixedFilterXmlObj.Element("FS").Elements("F")
                            select m).ToList();
                        foreach (var fixedFilter in measureFixedFilters)
                        {
                            var fixedFilterValues = (from m in fixedFilter.Elements("VS").Elements("V")
                                select m.Attribute("DESC").Value).ToList();

                            foreach (var value in fixedFilterValues)
                            {
                                Console.WriteLine(value.Trim());
                            }
                        }
                    }
                }
            }
            Console.ReadLine();
        }

Согласно Veracode, небезопасная линия XDocument fixedFilterXmlObj = XDocument.Load(new StringReader(filerNode.OuterXml));

Но, похоже, согласно Owsap, это должно быть безопасно:

Оба объекта XElement и XDocument в библиотеке System.Xml.Linq по умолчанию защищены от внедрения XXE. XElement анализирует только элементы в файле XML, поэтому DTD полностью игнорируются. В XDocument по умолчанию отключены DTD, и они небезопасны, только если они созданы с использованием другого небезопасного синтаксического анализатора XML.

Похоже, я ошибаюсь, используя удобный XML-парсер, открывая XDocument до XXE.

Я нашел модульный тест, который повторяет проблему, а также безопасное использование XDocument но я не могу найти, что именно мой код небезопасен, потому что я не использую:

XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;   // unsafe!

Вы можете запустить мой код, чтобы повторить проблему, но вы должны заменить строку пустым xmlStr следующим значением: здесь (слишком большое для одного сообщения)

1 ответ

Решение

Я не уверен, как или почему это работает, но это делает:

XDocument fixedFilterXmlObj;
using (XmlNodeReader nodeReader = new XmlNodeReader(filerNode))
{
    nodeReader.MoveToContent();
    fixedFilterXmlObj = XDocument.Load(nodeReader);
}
Другие вопросы по тегам