Модули обработки 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.dom: определение API DOM

  • xml.dom.minidom: минимальная реализация DOM

  • xml.dom.pulldom: поддержка построения частичных деревьев DOM

  • xml.sax: Базовые классы и удобные функции SAX2

  • xml.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)

Безопасный

декомпрессионная бомба

Безопасный

Безопасный

Безопасный

Безопасный

Уязвимый

  1. Expat 2.4.1 и более новые версии не подвержены уязвимостям «миллиард смеха» и «квадратичный взрыв». Элементы все еще числятся в списке уязвимых из-за потенциальной зависимости от библиотек, предоставляемых системой. Проверьте pyexpat.EXPAT_VERSION.

  2. xml.etree.ElementTree не расширяет внешние сущности и поднимает ParserError при появлении сущности.

  3. xml.dom.minidom не расширяет внешние сущности и просто возвращает нерасширенную сущность дословно.

  4. xmlrpclib не расширяет внешние сущности и опускает их.

  5. Начиная с 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.

Вернуться на верх