Содержание страницы
20.4. Модули обработки XML¶XML 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.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. Уязвимости XML¶XML vulnerabilities
Модули обработки XML не защищены от злонамеренно сконструированных данных. Злоумышленник может использовать возможности XML для проведения атак типа «отказ в обслуживании», доступа к локальным файлам, установления сетевых соединений с другими машинами или обхода межсетевых экранов.
В следующей таблице представлен обзор известных атак и уязвимости различных модулей к ним.
| Тип | sax | etree | minidom | pulldom | xmlrpc |
|---|---|---|---|---|---|
| Миллиард смешков | Да | Да | Да | Да | Да |
| Квадратичное разрастание | Да | Да | Да | Да | Да |
| раскрытие внешних сущностей | Да | Нет (1) | Нет (2) | Да | Нет (3) |
| Получение DTD | Да | Нет | Нет | Да | Нет |
| бомба декомпрессии | Нет | Нет | Нет | Нет | Да |
- xml.etree.ElementTree не разворачивает внешние сущности и вызывает ParserError при появлении сущности.
- xml.dom.minidom не разворачивает внешние сущности и просто возвращает неразвёрнутую сущность дословно.
- xmlrpclib не разворачивает внешние сущности и опускает их.
- миллиард смешков / экспоненциальное расширение сущностей
- Атака Billion Laughs (миллиард смешков) – также известная как экспоненциальное расширение сущностей – использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а определение конечной сущности содержит небольшую строку. Экспоненциальное расширение приводит к получению нескольких гигабайт текста и потребляет много памяти и процессорного времени.
- квадратичное расширение сущностей
- Атака квадратичного раздувания похожа на атаку Миллиард смешков; она тоже злоупотребляет расширением сущностей. Вместо вложенных сущностей она повторяет одну большую сущность длиной в пару тысяч символов снова и снова. Атака не так эффективна, как экспоненциальный случай, но она избегает срабатывания защитных механизмов парсера, которые запрещают глубоко вложенные сущности.
- раскрытие внешних сущностей
- Объявления сущностей могут содержать не только текст для замены. Они могут также указывать на внешние ресурсы или локальные файлы. XML-парсер обращается к ресурсу и встраивает содержимое в XML-документ.
- Получение DTD
- Некоторые библиотеки XML, такие как xml.dom.pulldom в Python, извлекают определения типа документа из удалённых или локальных источников. Эта возможность имеет схожие последствия с проблемой разворачивания внешних сущностей.
- бомба декомпрессии
- Бомбы декомпрессии (также известные как ZIP bomb) применимы ко всем библиотекам XML, которые могут анализировать сжатые потоки XML, такие как gzipped HTTP-потоки или файлы, сжатые LZMA. Для злоумышленника это может уменьшить объем передаваемых данных на три порядка и более.
Документация defusedxml на PyPI содержит дополнительную информацию о всех известных векторах атак с примерами и ссылками.
20.4.2. Пакеты defusedxml и defusedexpat¶The defusedxml and defusedexpat Packages
defusedxml – это чистый пакет Python с модифицированными подклассами всех XML-парсеров стандартной библиотеки, которые предотвращают любые потенциально вредоносные операции. Использование этого пакета рекомендуется для любого серверного кода, который разбирает непроверенные XML-данные. Пакет также поставляется с примерами эксплойтов и расширенной документацией по дополнительным XML-эксплойтам, таким как XPath-инъекция.
defusedexpat предоставляет модифицированный libexpat и пропатченный модуль pyexpat, которые содержат контрмеры против DoS-атак с разворачиванием сущностей. Модуль defusedexpat по-прежнему допускает разумное и настраиваемое количество разворачиваний сущностей. Изменения могут быть включены в один из будущих релизов Python, но не будут включены ни в один из исправляющих ошибки релизов Python, поскольку они нарушают обратную совместимость.