19.4. Модули обработки 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.dom: определение API DOM.
- xml.dom.minidom: лёгкая реализация DOM
- xml.dom.pulldom: поддержка построения частичных деревьев DOM.
- xml.sax: базовые классы и вспомогательные функции SAX2.
- xml.parsers.expat: привязка парсера Expat.
19.5. Уязвимости XML¶XML vulnerabilities
Модули обработки XML не защищены от вредоносных данных. Злоумышленник может использовать уязвимости, например, для атак типа «отказ в обслуживании», доступа к локальным файлам, создания сетевых соединений с другими машинами или обхода межсетевых экранов. Атаки на XML используют малоизвестные возможности, такие как встроенная DTD (определение типа документа) с сущностями.
| Тип | sax | etree | minidom | pulldom | xmlrpc |
|---|---|---|---|---|---|
| Миллиард смешков | True | True | True | True | True |
| Квадратичное разрастание | True | True | True | True | True |
| раскрытие внешних сущностей | True | False (1) | False (2) | True | False (3) |
| Получение DTD | True | False | False | True | False |
| бомба декомпрессии | False | False | False | False | True |
- xml.etree.ElementTree не раскрывает внешние сущности и вызывает ParserError при появлении сущности.
- xml.dom.minidom не разворачивает внешние сущности и просто возвращает неразвёрнутую сущность дословно.
- xmlrpclib не разворачивает внешние сущности и опускает их.
- миллиард смешков / экспоненциальное расширение сущностей
- Атака Billion Laughs – также известная как экспоненциальное расширение сущностей – использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, конечное определение сущности содержит небольшую строку. В итоге эта небольшая строка разворачивается до нескольких гигабайт. Экспоненциальное расширение также потребляет много процессорного времени.
- квадратичное расширение сущностей
- Квадратичная атака похожа на атаку Billion Laughs; она тоже злоупотребляет расширением сущностей. Вместо вложенных сущностей она многократно повторяет одну большую сущность размером в несколько тысяч символов. Атака не так эффективна, как экспоненциальный случай, но она избегает срабатывания контрмер парсеров против сильно вложенных сущностей.
- раскрытие внешних сущностей
- Объявления сущностей могут содержать не только текст для замены. Они могут также указывать на внешние ресурсы через публичные или системные идентификаторы. Системные идентификаторы – это стандартные URI или ссылки на локальные файлы. XML-парсер получает ресурс, например, с помощью HTTP- или FTP-запросов, и встраивает содержимое в XML-документ.
- Получение DTD
- Некоторые XML-библиотеки, такие как mod:'xml.dom.pulldom' из Python, извлекают определения типа документа из удалённых или локальных источников. Эта возможность имеет схожие последствия с проблемой расширения внешних сущностей.
- бомба декомпрессии
- Проблема бомб декомпрессии (также известных как ZIP bomb) применима ко всем XML-библиотекам, которые могут обрабатывать сжатые XML-потоки, такие как потоки HTTP, сжатые gzip, или файлы, сжатые LZMA. Для атакующего это может уменьшить объём передаваемых данных на три порядка и более.
Документация пакета defusedxml на PyPI содержит дополнительную информацию о всех известных векторах атак с примерами и ссылками.
19.5.1. defused packages¶
defusedxml – это чистый Python-пакет с модифицированными подклассами всех XML-парсеров из стандартной библиотеки, которые предотвращают любые потенциально опасные операции. Эти меры рекомендуются для любого серверного кода, который обрабатывает ненадёжные XML-данные. Пакет также содержит примеры эксплойтов и расширенную документацию по другим XML-эксплойтам, таким как XPath-инъекция.
defusedexpat предоставляет модифицированную libexpat и исправленную замену модуля расширения pyexpat с контрмерами против DoS-атак путём расширения сущностей. Defusedexpat по-прежнему допускает разумное и настраиваемое количество расширений сущностей. Эти модификации будут включены в будущие выпуски Python.
Обходные пути и модификации не включены в патч-релизы, так как они нарушают обратную совместимость. В конечном счёте, встроенные DTD и расширение сущностей – это чётко определённые возможности XML.