Spec-Zone.ru › Python 3.11

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

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

Интерфейсы Python для обработки XML сгруппированы в пакете xml.

Предупреждение

Модули XML не защищены от ошибочно сформированных или злонамеренно созданных данных. Если вам необходимо анализировать недоверенные данные или данные, подлинность которых не подтверждена, см. разделы Уязвимости XML и Пакет defusedxml.

Важно отметить, что модули пакета xml требуют наличия как минимум одного XML-анализатора, совместимого с SAX. Анализатор 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

Уязвимости XML

Модули обработки 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)

  1. Expat 2.4.1 и более поздние версии не подвержены уязвимостям «миллиард смехов» и «квадратичное разрастание». Некоторые компоненты по-прежнему указаны как уязвимые из-за возможного использования библиотек, предоставляемых системой. См. pyexpat.EXPAT_VERSION.
  2. xml.etree.ElementTree не раскрывает внешние сущности и вызывает исключение ParseError, если встречается сущность.
  3. xml.dom.minidom не раскрывает внешние сущности и просто возвращает их без раскрытия.
  4. xmlrpc.client не раскрывает внешние сущности и пропускает их.
  5. Начиная с Python 3.7.1 внешние общие сущности по умолчанию больше не обрабатываются.
  6. Expat 2.6.0 и более поздние версии не подвержены атакам типа «отказ в обслуживании» из-за квадратичного времени выполнения при разборе больших токенов. Некоторые компоненты по-прежнему указаны как уязвимые из-за возможного использования библиотек, предоставляемых системой. См. pyexpat.EXPAT_VERSION.
«миллиард смехов» / экспоненциальное раскрытие сущностей

Атака «миллиард смехов», также известная как экспоненциальное раскрытие сущностей, использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а определение последней сущности содержит короткую строку. Экспоненциальное раскрытие приводит к появлению нескольких гигабайт текста и расходует много памяти и процессорного времени.

квадратичное разрастание при раскрытии сущностей

Атака с квадратичным разрастанием похожа на атаку «миллиард смехов»; она также использует раскрытие сущностей. Вместо вложенных сущностей она многократно повторяет одну большую сущность, содержащую пару тысяч символов. Эта атака не так эффективна, как экспоненциальный вариант, но позволяет обойти защитные меры анализатора, запрещающие глубокую вложенность сущностей.

раскрытие внешних сущностей

Объявления сущностей могут содержать не только текст для подстановки. Они также могут указывать на внешние ресурсы или локальные файлы. XML-анализатор обращается к ресурсу и встраивает его содержимое в XML-документ.

загрузка DTD

Некоторые библиотеки XML, например xml.dom.pulldom из Python, загружают определения типа документа из удаленных или локальных источников. Эта возможность имеет последствия, аналогичные проблеме раскрытия внешних сущностей.

бомба распаковки

Бомбы распаковки (также называемые ZIP-бомбами) представляют угрозу для всех библиотек XML, которые могут анализировать сжатые XML-потоки, например HTTP-потоки gzip или файлы, сжатые с помощью LZMA. Это позволяет злоумышленнику сократить объем передаваемых данных на три порядка и более.

большие токены

Expat должен повторно анализировать незавершенные токены; без защиты, появившейся в Expat 2.6.0, это может привести к квадратичному времени выполнения, которое можно использовать для организации атаки типа «отказ в обслуживании» на приложение, анализирующее XML. Эта проблема известна как CVE-2023-52425.

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

Пакет defusedxml

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

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

Spec-Zone.ru

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