Содержание страницы
Модули обработки XML¶XML Processing Modules
Исходный код: Lib/xml/
Интерфейсы Python для обработки XML объединены в пакете xml.
Предупреждение
Модули XML не защищены от ошибочных или злонамеренно сконструированных данных. Если требуется обрабатывать непроверенные или неаутентифицированные данные, обратитесь к разделам Уязвимости XML и Пакет defusedxml.
Важно отметить, что модули в пакете 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
Уязвимости XML¶XML vulnerabilities
Модули обработки XML не защищены от злонамеренно сконструированных данных. Злоумышленник может использовать возможности XML для проведения атак типа «отказ в обслуживании», доступа к локальным файлам, установления сетевых соединений с другими машинами или обхода межсетевых экранов.
В следующей таблице представлен обзор известных атак и уязвимости различных модулей к ним.
Тип |
sax |
etree |
minidom |
pulldom |
xmlrpc |
|---|---|---|---|---|---|
Миллиард смешков |
Уязвим (1) |
Уязвим (1) |
Уязвим (1) |
Уязвим (1) |
Уязвим (1) |
Квадратичное разрастание |
Уязвим (1) |
Уязвим (1) |
Уязвим (1) |
Уязвим (1) |
Уязвим (1) |
раскрытие внешних сущностей |
Безопасно (5) |
Безопасен (2) |
Безопасен (3) |
Безопасно (5) |
Безопасен (4) |
получение DTD |
Безопасно (5) |
Безопасно |
Безопасно |
Безопасно (5) |
Безопасно |
бомба декомпрессии |
Безопасно |
Безопасно |
Безопасно |
Безопасно |
Уязвимо |
большие токены |
Уязвимо (6) |
Уязвимо (6) |
Уязвимо (6) |
Уязвимо (6) |
Уязвимо (6) |
Expat 2.4.1 и новее не уязвимы для атак «billion laughs» и «quadratic blowup». Элементы всё ещё отмечены как уязвимые из-за возможной зависимости от системных библиотек. Проверьте
pyexpat.EXPAT_VERSION.xml.etree.ElementTreeне раскрывает внешние сущности и возбуждаетParserErrorпри обнаружении сущности.xml.dom.minidomне раскрывает внешние сущности и просто возвращает неразвёрнутую сущность как есть.xmlrpclibне раскрывает внешние сущности и пропускает их.Начиная с Python 3.7.1, внешние общие сущности больше не обрабатываются по умолчанию.
Expat 2.6.0 и новее не уязвимы для отказа в обслуживании из-за квадратичного времени выполнения при разборе больших токенов. Элементы всё ещё отмечены как уязвимые из-за возможной зависимости от системных библиотек. Проверьте
pyexpat.EXPAT_VERSION.
- миллиард смешков / экспоненциальное расширение сущностей
Атака Billion Laughs (миллиард смешков) – также известная как экспоненциальное расширение сущностей – использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а определение конечной сущности содержит небольшую строку. Экспоненциальное расширение приводит к получению нескольких гигабайт текста и потребляет много памяти и процессорного времени.
- квадратичное расширение сущностей
Атака квадратичного взрыва аналогична атаке Billion Laughs; она также злоупотребляет расширением сущностей. Вместо вложенных сущностей она многократно повторяет одну большую сущность длиной в несколько тысяч символов. Такая атака не так эффективна, как экспоненциальная, но она позволяет обходить меры противодействия анализатора, запрещающие глубоко вложенные сущности.
- раскрытие внешних сущностей
Объявления сущностей могут содержать не только текст для замены. Они могут также указывать на внешние ресурсы или локальные файлы. XML-парсер обращается к ресурсу и встраивает содержимое в XML-документ.
- получение DTD
Некоторые XML-библиотеки, такие как
xml.dom.pulldomв Python, извлекают определения типа документа из удалённых или локальных источников. Эта функция имеет схожие последствия с проблемой раскрытия внешних сущностей.- бомба декомпрессии
Бомбы декомпрессии (также известные как ZIP bomb) применимы ко всем библиотекам XML, которые могут анализировать сжатые потоки XML, такие как gzipped HTTP-потоки или файлы, сжатые LZMA. Для злоумышленника это может уменьшить объем передаваемых данных на три порядка и более.
- большие токены
Expat требуется повторно разбирать незавершённые токены; без защиты, введённой в Expat 2.6.0, это может привести к квадратичному времени выполнения, которое может быть использовано для отказа в обслуживании приложения, разбирающего XML. Эта проблема известна как CVE-2023-52425.
Документация defusedxml на PyPI содержит дополнительную информацию о всех известных векторах атак с примерами и ссылками.
defusedxml Пакет¶The defusedxml Package
defusedxml – это чистый пакет Python с модифицированными подклассами всех XML-парсеров стандартной библиотеки, которые предотвращают любые потенциально вредоносные операции. Использование этого пакета рекомендуется для любого серверного кода, который разбирает непроверенные XML-данные. Пакет также поставляется с примерами эксплойтов и расширенной документацией по дополнительным XML-эксплойтам, таким как XPath-инъекция.