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

Источник: Lib/xml/


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

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

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

Важно отметить, что модули пакета xml требуют наличия хотя бы одного XML-парсера, совместимого с SAX. Парсер Expat входит в состав Python, поэтому модуль xml.parsers.expat всегда будет доступен.

Документация к пакетам xml.dom и xml.sax представляет собой определение привязок Python для интерфейсов DOM и SAX.

Подмодули обработки XML включают в себя:

  • xml.dom: определение DOM API

  • xml.dom.minidom: минимальная реализация DOM

  • xml.dom.pulldom: поддержка построения частичных деревьев DOM

  • xml.sax: Базовые классы и удобные функции SAX2

  • xml.parsers.expat: привязка парсера Expat

Уязвимости XML

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

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

добрый

саксофон

etree

минидом

Пульдом

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 bomb) применяются ко всем XML-библиотекам, которые могут анализировать сжатые XML-потоки, такие как gzipped item nr. Для злоумышленника это может уменьшить объем передаваемых данных на три и более величины.

крупные жетоны

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

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

The defusedxml Пакет

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