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

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

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

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

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

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

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

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

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

Тип

sax

etree

minidom

pulldom

xmlrpc

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

Уязвимо

Уязвимо

Уязвимо

Уязвимо

Уязвимо

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

Уязвимо

Уязвимо

Уязвимо

Уязвимо

Уязвимо

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

Уязвимо

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

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

Уязвимо

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

получение DTD

Уязвимо

Безопасно

Безопасно

Уязвимо

Безопасно

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

Безопасно

Безопасно

Безопасно

Безопасно

Уязвимо

  1. xml.etree.ElementTree не раскрывает внешние сущности и вызывает ParserError при появлении сущности.

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

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

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

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

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

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

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

Объявления сущностей могут содержать не только текст для замены. Они могут также указывать на внешние ресурсы через публичные или системные идентификаторы. Системные идентификаторы – это стандартные URI или ссылки на локальные файлы. XML-парсер получает ресурс, например, с помощью HTTP- или FTP-запросов, и встраивает содержимое в XML-документ.

получение DTD

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

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

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

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

19.6.1. пакеты defuseddefused packages

Эти внешние пакеты рекомендуются для любого кода, который разбирает непроверенные XML-данные.

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

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

Обходные пути и модификации не включены в патч-релизы, так как они нарушают обратную совместимость. В конце концов, встроенные DTD и разворачивание сущностей – это стандартные возможности XML.