Модули обработки XML¶
Исходный код: Lib/xml/
Python интерфейсы для обработки XML сгруппированы в пакете xml
.
Предупреждение
Модули XML не защищены от ошибочных или злонамеренных данных. Если требуется проанализировать ненадежные или неаутентифицированные данные, см. разделы Уязвимости XML и Пакет defusedxml.
Важно отметить, что модули в пакете xml
требуют наличия хотя бы одного
совместимого с SAX XML парсера. Expat парсер входит в комплект
поставки Python, поэтому модуль xml.parsers.expat
всегда будет доступен.
Документация по пакетам xml.dom
и xml.sax
представляет собой определение
Python привязок для интерфейсов DOM и SAX.
Подмодули обработки XML:
xml.etree.ElementTree
: API ElityTree, простой и легкий XML-процессор
xml.dom
: определение DOM APIxml.dom.minidom
: минимальная реализация DOMxml.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) | Безопасный |
декомпрессионная бомба | Безопасный | Безопасный | Безопасный | Уязвимый |
xml.etree.ElementTree
не расширяет внешние объекты и вызываетParserError
при возникновении объекта.xml.dom.minidom
не расширяет внешние сущности и просто возвращает нерасчетную сущность дословно.xmlrpclib
не расширяет внешние объекты и пропускает их.- Начиная с 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.