Spec-Zone.ru › Python 2.7

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

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

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

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

Важно отметить, что модули в пакете 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 используют малоизвестные особенности, такие как встроенные DTD (определение типа документа) с сущностями.

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

вид

sax

etree

minidom

pulldom

xmlrpc

миллион смехов

Уязвим

Уязвим

Уязвим

Уязвим

Уязвим

квадратичный взрыв

Уязвим

Уязвим

Уязвим

Уязвим

Уязвим

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

Уязвим

Безопасно (1)

Безопасно (2)

Уязвим

Безопасно (3)

получение DTD

Уязвим

Безопасно

Безопасно

Уязвим

Безопасно

бомба декомпрессии

Безопасно

Безопасно

Безопасно

Безопасно

Уязвим

  1. xml.etree.ElementTree не расширяет внешние сущности и генерирует ParserError при возникновении сущности.
  2. xml.dom.minidom не расширяет внешние сущности и просто возвращает нерасширенную сущность дословно.
  3. xmlrpclib не расширяет внешние сущности и опускает их.
миллион смехов/экспоненциальное расширение сущностей

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

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

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

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

Объявления сущностей могут содержать больше, чем просто текст для замены. Они также могут указывать на внешние ресурсы с помощью общедоступных идентификаторов или системных идентификаторов. Системные идентификаторы — это стандартные URI или могут ссылаться на локальные файлы. Парсер XML извлекает ресурс с помощью, например, запросов HTTP или FTP и встраивает содержимое в документ XML.

получение DTD

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

бомба декомпрессии

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

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

1. Пакеты defused

Эти внешние пакеты рекомендуются для любого кода, который анализирует недоверенные XML-данные.

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

defusedexpat предоставляет изменённый libexpat и исправленный модуль расширения pyexpat, заменяющий его с контрмерами против атак типа DoS с расширением сущностей. Defusedexpat всё ещё позволяет разумное и настраиваемое количество расширений сущностей. Изменения будут включены в будущие версии Python.

Обходные пути и модификации не включены в исправления, так как они нарушают обратную совместимость. В конце концов, встроенные DTD и расширение сущностей являются хорошо определёнными функциями XML.

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

Spec-Zone.ru

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