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


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

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

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

Важно отметить, что модули в пакете 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

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