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

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

Исходный код: Lib/xml/


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

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

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

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

20.4.1. Уязвимости 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)

Безопасно

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

Безопасно

Безопасно

Безопасно

Безопасно

Уязвимо

  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.6.7, внешние общие сущности по умолчанию больше не обрабатываются.

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

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

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

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

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

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

получение DTD

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

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

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

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

20.4.2. Пакеты defusedxml и defusedexpatThe defusedxml and defusedexpat Packages

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

defusedexpat предоставляет модифицированный libexpat и исправленный pyexpat модуль, содержащие меры противодействия атакам DoS за счет расширения сущностей. Модуль defusedexpat по-прежнему допускает разумное и настраиваемое количество расширений сущностей. Эти изменения могут быть включены в один из будущих выпусков Python, но не будут включены в выпуски с исправлениями ошибок Python, поскольку нарушают обратную совместимость.