Модули обработки 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 | Уязвим | Безопасно | Безопасно | Уязвим | Безопасно |
бомба декомпрессии | Безопасно | Безопасно | Безопасно | Безопасно | Уязвим |
-
xml.etree.ElementTreeне расширяет внешние сущности и генерирует ParserError при возникновении сущности. -
xml.dom.minidomне расширяет внешние сущности и просто возвращает нерасширенную сущность дословно. -
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