19.5. Модули обработки XML¶XML 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 DOMxml.dom.minidom: минимальная реализация DOMxml.dom.pulldom: поддержка построения частичных DOM-деревьев
xml.sax: базовые классы SAX2 и вспомогательные функцииxml.parsers.expat: привязка анализатора Expat
19.6. Уязвимости XML¶XML vulnerabilities
Модули обработки XML не защищены от вредоносных данных. Злоумышленник может использовать уязвимости, например, для атак типа «отказ в обслуживании», доступа к локальным файлам, создания сетевых соединений с другими машинами или обхода межсетевых экранов. Атаки на XML используют малоизвестные возможности, такие как встроенная DTD (определение типа документа) с сущностями.
В следующей таблице представлен обзор известных атак и указано, какие модули уязвимы для них.
Тип |
sax |
etree |
minidom |
pulldom |
xmlrpc |
|---|---|---|---|---|---|
Миллиард смешков |
Уязвимо |
Уязвимо |
Уязвимо |
Уязвимо |
Уязвимо |
Квадратичное разрастание |
Уязвимо |
Уязвимо |
Уязвимо |
Уязвимо |
Уязвимо |
раскрытие внешних сущностей |
Уязвимо |
Безопасно (1) |
Безопасно (2) |
Уязвимо |
Безопасно (3) |
получение DTD |
Уязвимо |
Безопасно |
Безопасно |
Уязвимо |
Безопасно |
бомба декомпрессии |
Безопасно |
Безопасно |
Безопасно |
Безопасно |
Уязвимо |
xml.etree.ElementTreeне раскрывает внешние сущности и вызывает ParserError при появлении сущности.xml.dom.minidomне раскрывает внешние сущности и просто возвращает неразвёрнутую сущность как есть.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. пакеты defused¶defused packages
Эти внешние пакеты рекомендуются для любого кода, который разбирает непроверенные XML-данные.
defusedxml – это пакет на чистом Python с модифицированными подклассами всех парсеров XML из стандартной библиотеки, предотвращающими любые потенциально вредоносные операции. Пакет также содержит примеры эксплойтов и расширенную документацию по другим XML-эксплойтам, таким как XPath-инъекция.
defusedexpat предоставляет модифицированную библиотеку libexpat и исправленную замену pyexpat модуля расширения с контрмерами против DoS-атак, основанных на разворачивании сущностей. Defusedexpat по-прежнему допускает разумное и настраиваемое количество разворачиваний сущностей. Эти изменения будут включены в будущие выпуски Python.
Обходные пути и модификации не включены в патч-релизы, так как они нарушают обратную совместимость. В конце концов, встроенные DTD и разворачивание сущностей – это стандартные возможности XML.