Spec-Zone.ru › Python 3.12

Модули обработки 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.
«миллиард смеха» / экспоненциальное расширение сущностей

Атака Billion Laughs — также известная как экспоненциальное расширение сущностей — использует несколько уровней вложенных сущностей. Каждая сущность несколько раз ссылается на другую, а определение последней сущности содержит короткую строку. В результате экспоненциального расширения образуются гигабайты текста, что требует большого объёма памяти и процессорного времени.

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

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

подстановка внешних сущностей

Объявления сущностей могут содержать не только текст для подстановки. Они также могут указывать на внешние ресурсы или локальные файлы. 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.12/library/xml.html

Spec-Zone.ru

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