Документация Python неофициальный перевод
Содержание страницы

Модули обработки XMLXML Processing Modules

Исходный код: 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 ElementTree, простой и легковесный процессор XML

  • xml.dom: определение API DOM

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

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

  • xml.sax: базовые классы SAX2 и вспомогательные функции

  • xml.parsers.expat: привязка анализатора Expat

Уязвимости XMLXML vulnerabilities

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

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

Тип

sax

etree

minidom

pulldom

xmlrpc

Миллиард смешков

Уязвим (1)

Уязвим (1)

Уязвим (1)

Уязвим (1)

Уязвим (1)

Квадратичное разрастание

Уязвим (1)

Уязвим (1)

Уязвим (1)

Уязвим (1)

Уязвим (1)

раскрытие внешних сущностей

Безопасно (5)

Безопасен (2)

Безопасен (3)

Безопасно (5)

Безопасен (4)

получение DTD

Безопасно (5)

Безопасно

Безопасно

Безопасно (5)

Безопасно

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

Безопасно

Безопасно

Безопасно

Безопасно

Уязвимо

большие токены

Уязвимо (6)

Уязвимо (6)

Уязвимо (6)

Уязвимо (6)

Уязвимо (6)

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

  2. xml.etree.ElementTree не раскрывает внешние сущности и возбуждает ParserError при обнаружении сущности.

  3. xml.dom.minidom не раскрывает внешние сущности и просто возвращает неразвёрнутую сущность как есть.

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

  5. Начиная с Python 3.7.1, внешние общие сущности больше не обрабатываются по умолчанию.

  6. Expat 2.6.0 и новее не уязвимы для отказа в обслуживании из-за квадратичного времени выполнения при разборе больших токенов. Элементы всё ещё отмечены как уязвимые из-за возможной зависимости от системных библиотек. Проверьте pyexpat.EXPAT_VERSION.

миллиард смешков / экспоненциальное расширение сущностей

Атака Billion Laughs (миллиард смешков) – также известная как экспоненциальное расширение сущностей – использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а определение конечной сущности содержит небольшую строку. Экспоненциальное расширение приводит к получению нескольких гигабайт текста и потребляет много памяти и процессорного времени.

квадратичное расширение сущностей

Атака квадратичного взрыва аналогична атаке Billion Laughs; она также злоупотребляет расширением сущностей. Вместо вложенных сущностей она многократно повторяет одну большую сущность длиной в несколько тысяч символов. Такая атака не так эффективна, как экспоненциальная, но она позволяет обходить меры противодействия анализатора, запрещающие глубоко вложенные сущности.

раскрытие внешних сущностей

Объявления сущностей могут содержать не только текст для замены. Они могут также указывать на внешние ресурсы или локальные файлы. XML-парсер обращается к ресурсу и встраивает содержимое в XML-документ.

получение DTD

Некоторые XML-библиотеки, такие как xml.dom.pulldom в Python, извлекают определения типа документа из удалённых или локальных источников. Эта функция имеет схожие последствия с проблемой раскрытия внешних сущностей.

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

Бомбы декомпрессии (также известные как ZIP bomb) применимы ко всем библиотекам XML, которые могут анализировать сжатые потоки XML, такие как gzipped HTTP-потоки или файлы, сжатые LZMA. Для злоумышленника это может уменьшить объем передаваемых данных на три порядка и более.

большие токены

Expat требуется повторно разбирать незавершённые токены; без защиты, введённой в Expat 2.6.0, это может привести к квадратичному времени выполнения, которое может быть использовано для отказа в обслуживании приложения, разбирающего XML. Эта проблема известна как CVE-2023-52425.

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

defusedxml ПакетThe defusedxml Package

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