Модули обработки XML¶
Исходный код: Lib/xml/.
Интерфейсы Python для обработки XML сгруппированы в пакете xml
.
Предупреждение
Модули XML не защищены от ошибочных или злонамеренно созданных данных. Если вам нужно разобрать недоверенные или неаутентифицированные данные, смотрите разделы Уязвимости XML и Пакет defusedxml.
Важно отметить, что модули в пакете xml
требуют, чтобы был доступен хотя бы один XML-парсер, совместимый с SAX. Парсер Expat входит в состав Python, поэтому модуль xml.parsers.expat
всегда будет доступен.
Документация к пакетам xml.dom
и xml.sax
представляет собой определение привязок Python для интерфейсов DOM и SAX.
Подмодулями для работы с XML являются:
xml.etree.ElementTree
: ElementTree API, простой и легкий процессор XML
xml.dom
: определение API DOMxml.dom.minidom
: минимальная реализация DOMxml.dom.pulldom
: поддержка построения частичных деревьев DOM
xml.sax
: Базовые классы и удобные функции SAX2xml.parsers.expat
: привязка синтаксического анализатора Expat
Уязвимости XML¶
Модули обработки XML не защищены от злонамеренно созданных данных. Злоумышленник может использовать возможности XML для проведения атак типа «отказ в обслуживании», доступа к локальным файлам, создания сетевых соединений с другими машинами или обхода брандмауэров.
В следующей таблице приведен обзор известных атак и того, уязвимы ли к ним различные модули.
добрый |
саксофон |
etree |
минидом |
пулдом |
xmlrpc |
---|---|---|---|---|---|
миллиард смеха |
Уязвимый (1) |
Уязвимый (1) |
Уязвимый (1) |
Уязвимый (1) |
Уязвимый (1) |
квадратичное раздувание |
Уязвимый (1) |
Уязвимый (1) |
Уязвимый (1) |
Уязвимый (1) |
Уязвимый (1) |
расширение внешней структуры |
Безопасность (5) |
Безопасность (2) |
Безопасность (3) |
Безопасность (5) |
Безопасный (4) |
DTD извлечение |
Безопасность (5) |
Безопасный |
Безопасный |
Безопасность (5) |
Безопасный |
декомпрессионная бомба |
Безопасный |
Безопасный |
Безопасный |
Безопасный |
Уязвимый |
Expat 2.4.1 и более новые версии не подвержены уязвимостям «миллиард смеха» и «квадратичный взрыв». Элементы все еще числятся в списке уязвимых из-за потенциальной зависимости от библиотек, предоставляемых системой. Проверьте
pyexpat.EXPAT_VERSION
.xml.etree.ElementTree
не расширяет внешние сущности и поднимаетParserError
при появлении сущности.xml.dom.minidom
не расширяет внешние сущности и просто возвращает нерасширенную сущность дословно.xmlrpclib
не расширяет внешние сущности и опускает их.Начиная с Python 3.7.1, внешние общие сущности больше не обрабатываются по умолчанию.
- миллиард смеха / экспоненциальное расширение сущности
Атака Billion Laughs - также известная как экспоненциальное расширение сущностей - использует несколько уровней вложенных сущностей. Каждая сущность несколько раз ссылается на другую сущность, а конечное определение сущности содержит небольшую строку. В результате экспоненциального расширения получается несколько гигабайт текста и расходуется много памяти и процессорного времени.
- квадратичное расширение сущности
Атака quadratic blowup похожа на атаку Billion Laughs; она также злоупотребляет расширением сущностей. Вместо вложенных сущностей она повторяет одну большую сущность с парой тысяч символов снова и снова. Атака не так эффективна, как экспоненциальная, но позволяет избежать срабатывания контрмер синтаксического анализатора, запрещающих глубоко вложенные сущности.
- расширение внешней структуры
Декларации сущностей могут содержать не только текст для замены. Они также могут указывать на внешние ресурсы или локальные файлы. Парсер XML получает доступ к ресурсу и встраивает его содержимое в XML-документ.
- DTD извлечение
Некоторые библиотеки XML, такие как Python’s
xml.dom.pulldom
, получают определения типов документов из удаленных или локальных мест. Эта возможность имеет те же последствия, что и проблема расширения внешних сущностей.- декомпрессионная бомба
Бомбы декомпрессии (они же ZIP bomb) применяются ко всем XML-библиотекам, которые могут разбирать сжатые XML-потоки, такие как gzipped HTTP-потоки или LZMA-сжатые файлы. Для злоумышленника это может уменьшить объем передаваемых данных на три и более величины.
В документации к defusedxml на PyPI есть дополнительная информация обо всех известных векторах атак с примерами и ссылками.
Пакет defusedxml
¶
defusedxml - это чистый пакет Python с модифицированными подклассами всех stdlib XML парсеров, которые предотвращают любые потенциально вредоносные операции. Этот пакет рекомендуется использовать для любого серверного кода, который анализирует недоверенные XML-данные. Пакет также поставляется с примерами эксплойтов и расширенной документацией по более XML эксплойтам, таким как XPath injection.