Spec-Zone.ru › Python 3.5

Модули обработки XML

Исходный код: Lib/xml/

Интерфейсы 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: интерфейс ElementTree, простой и лёгкий процессор XML
  • xml.dom: определение интерфейса DOM
  • xml.dom.minidom: минимальная реализация DOM
  • xml.dom.pulldom: поддержка создания частичных деревьев DOM
  • xml.sax: базовые классы SAX2 и удобные функции
  • xml.parsers.expat: привязка анализатора Expat

1. Уязвимости XML

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

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

Тип sax etree minidom pulldom xmlrpc
«миллиард смеющихся» Уязвим Уязвим Уязвим Уязвим Уязвим
Квадратичный взрыв Уязвим Уязвим Уязвим Уязвим Уязвим
Расширение внешних сущностей Уязвим Безопасно (1) Безопасно (2) Уязвим Безопасно (3)
Получение DTD Уязвим Безопасно Безопасно Уязвим Безопасно
Бомба декомпрессии Безопасно Безопасно Безопасно Безопасно Уязвим
  1. xml.etree.ElementTree не расширяет внешние сущности и генерирует ParserError, когда встречается сущность.
  2. xml.dom.minidom не расширяет внешние сущности и просто возвращает нерасширенную сущность дословно.
  3. xmlrpclib не расширяет внешние сущности и опускает их.
«Миллиард смеющихся» / экспоненциальное расширение сущностей
Атака «миллиард смеющихся» — также известная как экспоненциальное расширение сущностей — использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а окончательное определение сущности содержит небольшой строковый фрагмент. Экспоненциальное расширение приводит к появлению нескольких гигабайт текста и потребляет много памяти и времени ЦП.
Квадратичный взрыв сущности
Атака с квадратичным взрывом похожа на атаку «миллиард смеющихся»; она также использует расширение сущностей. Вместо вложенных сущностей она повторяет одну большую сущность с несколькими тысячами символов многократно. Атака менее эффективна, чем экспоненциальная, но она избегает срабатывания мер противодействия анализатора, которые запрещают глубоко вложенные сущности.
Расширение внешних сущностей
Объявления сущностей могут содержать больше, чем просто текст для замены. Они также могут указывать на внешние ресурсы или локальные файлы. Анализатор XML обращается к ресурсу и встраивает его содержимое в документ XML.
Получение DTD
Некоторые библиотеки XML, такие как Python xml.dom.pulldom, получают определения типов документов из удалённых или локальных мест. Эта функция имеет схожие последствия с проблемой расширения внешних сущностей.
Бомба декомпрессии
Бомбы декомпрессии (также известные как ZIP-бомба) относятся ко всем библиотекам XML, которые могут анализировать сжатые потоки XML, такие как сжатые HTTP-потоки или LZMA-сжатые файлы. Для злоумышленника это может уменьшить количество передаваемых данных на три порядка или более.

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

2. Пакеты defusedxml и defusedexpat

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

defusedexpat предоставляет изменённый libexpat и исправленный модуль pyexpat, которые содержат меры противодействия атакам типа отказа в обслуживании с расширением сущностей. Модуль defusedexpat всё ещё позволяет разумное и настраиваемое количество расширений сущностей. Эти изменения могут быть включены в будущем выпуске Python, но не будут включены в исправления Python, так как это нарушает обратную совместимость.

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/xml.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API