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

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

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

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

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

Важно отметить, что модули из пакета xml требуют наличия как минимум одного SAX-совместимого парсера XML. Парсер 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.

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

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

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

Тип sax etree minidom pulldom xmlrpc
Миллиард смешков Да Да Да Да Да
Квадратичное разрастание Да Да Да Да Да
раскрытие внешних сущностей Да Нет (1) Нет (2) Да Нет (3)
Получение DTD Да Нет Нет Да Нет
бомба декомпрессии Нет Нет Нет Нет Да
  1. xml.etree.ElementTree не разворачивает внешние сущности и вызывает ParserError при появлении сущности.
  2. xml.dom.minidom не разворачивает внешние сущности и просто возвращает неразвёрнутую сущность дословно.
  3. xmlrpclib не разворачивает внешние сущности и опускает их.
миллиард смешков / экспоненциальное расширение сущностей
Атака 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, поскольку они нарушают обратную совместимость.