Spec-Zone.ru › Python 3.12

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

Исходный код: 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 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, такие как Python xml.dom.pulldom, извлекают определения типов документов из удалённых или локальных источников. Эта функция имеет схожие последствия, как и проблема расширения внешних сущностей.

бомба сжатия

Бомбы сжатия (также известные как бомбы ZIP) относятся ко всем библиотекам XML, которые могут анализировать сжатые потоки XML, такие как сжатые gzip HTTP потоки или файлы, сжатые 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.12/library/xml.html

Spec-Zone.ru

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