Модули обработки XML

Исходный код: Lib/xml/


Python интерфейсы для обработки XML сгруппированы в пакете xml.

Предупреждение

Модули XML не защищены от ошибочных или злонамеренных данных. Если требуется проанализировать ненадежные или неаутентифицированные данные, см. разделы Уязвимости XML и Пакеты defusedxml и defusedexpat.

Важно отметить, что модули в пакете xml требуют наличия хотя бы одного совместимого с SAX XML парсера. Expat парсер входит в комплект поставки Python, поэтому модуль xml.parsers.expat всегда будет доступен.

Документация по пакетам xml.dom и xml.sax представляет собой определение Python привязок для интерфейсов DOM и SAX.

Подмодули обработки XML:

  • xml.dom: определение DOM API
  • xml.dom.minidom: минимальная реализация DOM
  • xml.dom.pulldom: поддержка построения частичных деревьев DOMы
  • xml.sax: SAX2 базовые классы и удобные функции
  • xml.parsers.expat: биндинг к Expat парсеру

Уязвимости XML

Модули обработки XML не защищены от вредоносно созданных данных. Злоумышленник может злоупотреблять функциями XML для выполнения атак типа «отказ в обслуживании», доступа к файлам локальная, создания сетевых подключений к другим машинам или обхода брандмауэров.

В следующей таблице представлен обзор известных атак и того, уязвимы ли для них различные модули.

вид sax etree minidom pulldom xmlrpc
миллиард смеха Уязвимый Уязвимый Уязвимый Уязвимый Уязвимый
квадратичное раздутие Уязвимый Уязвимый Уязвимый Уязвимый Уязвимый
расширение внешнего объекта Безопасный (4) Безопасный (1) Безопасный (2) Безопасный (4) Безопасный (3)
DTD поиск Безопасный (4) Безопасный Безопасный Безопасный (4) Безопасный
декомпрессионная бомба Безопасный Безопасный Безопасный Уязвимый  
  1. xml.etree.ElementTree не расширяет внешние объекты и вызывает ParserError при возникновении объекта.
  2. xml.dom.minidom не расширяет внешние сущности и просто возвращает нерасчетную сущность дословно.
  3. xmlrpclib не расширяет внешние объекты и пропускает их.
  4. Начиная с Python 3.7.1 внешние общие объекты больше не обрабатываются по умолчанию.
миллиард смеха / экспоненциальное расширение сущности
Атака Миллиард смеха, также известная как экспоненциальное расширение объектов, использует несколько уровней вложенных объектов. Каждый объект ссылается на другой объект несколько раз, и окончательное определение объекта содержит небольшой строка. Экспоненциальное расширение приводит к появлению нескольких гигабайт текста и потребляет много памяти и времени ЦП.
квадратичное расширение раздуваемого объекта
Квадратичная взрывная атака похожа на Миллиард смеха атаку; он также злоупотребляет расширением образований. Вместо вложенных объектов он повторяет один большой объект с парой тысяч символов снова и снова. Атака не так эффективна, как экспоненциальный случай, но она позволяет избежать запуска парсер контрмер, которые запрещают глубоко вложенные сущности.
расширение внешнего объекта
Объявления сущностей могут содержать не только текст для замены. Они также могут указывать на внешние ресурсы или локальная файлы. XML- парсер обращается к ресурсу и встраивает содержимое в XML-документ.
DTD поиск
Некоторые библиотеки XML, такие как Python’s xml.dom.pulldom, извлекают определения типов документов из удаленных или локальная расположений. Эта функция имеет те же последствия, что и проблема расширения внешнего объекта.
декомпрессионная бомба
Бомбы декомпрессии (иначе ZIP бомба) применяются ко всем библиотекам XML, которые могут анализировать сжатые XML-потоки, такие как gzipped HTTP-потоки или LZMA-compressed файлы. Для злоумышленника это может уменьшить объем передаваемых данных на три величины и более.

Документация для defusedxml по PyPI содержит дополнительную информацию обо всех известных векторах атак с примерами и ссылками.

Пакеты defusedxml и defusedexpat

defusedxml - это чистый пакет Python с измененными подклассы всех XML- парсерами stdlib, которые предотвращают любую потенциально вредоносную операцию. Этот пакет рекомендуется использовать для любого код сервера, который анализирует ненадежные XML-данные. Пакет также содержит примеры эксплойтов и расширенную документацию по большему количеству эксплойтов XML, таких как инжекция XPath.

defusedexpat предоставляет модифицированный libexpat и исправленный модуль pyexpat, которые имеют меры противодействия DoS-атакам расширения сущностей. Модуль defusedexpat по-прежнему допускает разумное и настраиваемое расширение объекта. Модификации могут быть включены в некоторые будущие выпуски Python, но не будут включены в какие-либо bugfix выпуски Python, поскольку они нарушают обратную совместимость.