Модули обработки 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: интерфейс 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) |
- Expat 2.4.1 и более поздние версии не уязвимы для уязвимостей «миллиард смеха» и «квадратичный взрыв». Элементы по-прежнему указаны как уязвимые из-за потенциальной зависимости от системных библиотек. Проверьте
pyexpat.EXPAT_VERSION. -
xml.etree.ElementTreeне расширяет внешние сущности и генерируетParseErrorпри возникновении сущности. -
xml.dom.minidomне расширяет внешние сущности и просто возвращает нерасширенную сущность в точности. -
xmlrpc.clientне расширяет внешние сущности и опускает их. - С Python 3.7.1 внешние общие сущности по умолчанию больше не обрабатываются.
- Expat 2.6.0 и более поздние версии не уязвимы для атак на отказ в обслуживании с помощью квадратичного времени выполнения, вызванного обработкой больших токенов. Элементы по-прежнему указаны как уязвимые из-за потенциальной зависимости от системных библиотек. Проверьте
pyexpat.EXPAT_VERSION.
- миллиард смеха / экспоненциальное расширение сущности
-
Атака «миллиард смеха» (также известная как экспоненциальное расширение сущности) использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а конечное определение сущности содержит небольшую строку. Экспоненциальное расширение приводит к нескольким гигабайтам текста и потребляет много памяти и времени процессора.
- квадратичный взрыв расширения сущности
-
Атака с квадратичным взрывом аналогична атаке «миллиард смеха»; она также злоупотребляет расширением сущностей. Вместо вложенных сущностей она повторяет одну большую сущность с несколькими тысячами символов снова и снова. Атака не так эффективна, как экспоненциальный случай, но она избегает активации мер защиты парсера, которые запрещают глубоко вложенные сущности.
- расширение внешней сущности
-
Определения сущностей могут содержать больше, чем просто текст для замены. Они также могут указывать на внешние ресурсы или локальные файлы. Парсер XML обращается к ресурсу и встраивает содержимое в документ XML.
- получение DTD
-
Некоторые XML-библиотеки, такие как Python
xml.dom.pulldom, получают определения типов документов из удаленных или локальных расположений. Эта функция имеет последствия, аналогичные проблеме расширения внешней сущности. - бомба сжатия
-
Бомбы сжатия (также известные как ZIP-бомба) применяются ко всем XML-библиотекам, которые могут анализировать сжатые потоки XML, такие как сжатые 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.13/library/xml.html