Модули обработки XML
Исходный код: Lib/xml/
Интерфейсы Python для обработки XML сгруппированы в пакете xml.
Предупреждение
Модули XML не защищены от ошибочных или злонамеренно сконструированных данных. Если вам нужно проанализировать недоверенные или незащищенные данные, обратитесь к разделам Уязвимости XML и Пакеты defusedxml и defusedexpat.
Важно отметить, что модули в пакете xml требуют наличия как минимум одного SAX-совместимого анализатора XML. Анализатор Expat включён в Python, поэтому модуль xml.parsers.expat всегда доступен.
Документация для пакетов xml.dom и xml.sax является определением Python-связей для интерфейсов DOM и SAX.
Подмодули обработки XML:
-
xml.etree.ElementTree: интерфейс ElementTree, простой и лёгкий процессор XML
-
xml.dom: определение интерфейса DOM -
xml.dom.minidom: минимальная реализация DOM -
xml.dom.pulldom: поддержка создания частичных деревьев DOM
-
xml.sax: базовые классы SAX2 и удобные функции -
xml.parsers.expat: привязка анализатора Expat
1. Уязвимости XML
Модули обработки XML не защищены от злонамеренно сконструированных данных. Злоумышленник может использовать особенности XML для организации атак типа отказа в обслуживании, доступа к локальным файлам, установления сетевых соединений с другими машинами или обхода брандмауэров.
В следующей таблице представлен обзор известных атак и уязвимость различных модулей к ним.
| Тип | sax | etree | minidom | pulldom | xmlrpc |
|---|---|---|---|---|---|
| «миллиард смеющихся» | Уязвим | Уязвим | Уязвим | Уязвим | Уязвим |
| Квадратичный взрыв | Уязвим | Уязвим | Уязвим | Уязвим | Уязвим |
| Расширение внешних сущностей | Уязвим | Безопасно (1) | Безопасно (2) | Уязвим | Безопасно (3) |
| Получение DTD | Уязвим | Безопасно | Безопасно | Уязвим | Безопасно |
| Бомба декомпрессии | Безопасно | Безопасно | Безопасно | Безопасно | Уязвим |
-
xml.etree.ElementTreeне расширяет внешние сущности и генерируетParserError, когда встречается сущность. -
xml.dom.minidomне расширяет внешние сущности и просто возвращает нерасширенную сущность дословно. -
xmlrpclibне расширяет внешние сущности и опускает их.
- «Миллиард смеющихся» / экспоненциальное расширение сущностей
- Атака «миллиард смеющихся» — также известная как экспоненциальное расширение сущностей — использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а окончательное определение сущности содержит небольшой строковый фрагмент. Экспоненциальное расширение приводит к появлению нескольких гигабайт текста и потребляет много памяти и времени ЦП.
- Квадратичный взрыв сущности
- Атака с квадратичным взрывом похожа на атаку «миллиард смеющихся»; она также использует расширение сущностей. Вместо вложенных сущностей она повторяет одну большую сущность с несколькими тысячами символов многократно. Атака менее эффективна, чем экспоненциальная, но она избегает срабатывания мер противодействия анализатора, которые запрещают глубоко вложенные сущности.
- Расширение внешних сущностей
- Объявления сущностей могут содержать больше, чем просто текст для замены. Они также могут указывать на внешние ресурсы или локальные файлы. Анализатор XML обращается к ресурсу и встраивает его содержимое в документ XML.
- Получение DTD
- Некоторые библиотеки XML, такие как Python
xml.dom.pulldom, получают определения типов документов из удалённых или локальных мест. Эта функция имеет схожие последствия с проблемой расширения внешних сущностей. - Бомба декомпрессии
- Бомбы декомпрессии (также известные как ZIP-бомба) относятся ко всем библиотекам XML, которые могут анализировать сжатые потоки XML, такие как сжатые HTTP-потоки или LZMA-сжатые файлы. Для злоумышленника это может уменьшить количество передаваемых данных на три порядка или более.
Документация по defusedxml на PyPI содержит дополнительную информацию обо всех известных векторах атаки с примерами и ссылками.
2. Пакеты defusedxml и defusedexpat
defusedxml — это чистый Python-пакет с изменёнными подклассами всех стандартных анализаторов XML, которые предотвращают любые потенциально вредоносные операции. Рекомендуется использовать этот пакет для любого серверного кода, анализирующего недоверенные XML-данные. В пакете также есть примеры эксплоитов и расширенная документация по другим эксплоитам XML, таким как XPath-инъекция.
defusedexpat предоставляет изменённый libexpat и исправленный модуль pyexpat, которые содержат меры противодействия атакам типа отказа в обслуживании с расширением сущностей. Модуль defusedexpat всё ещё позволяет разумное и настраиваемое количество расширений сущностей. Эти изменения могут быть включены в будущем выпуске Python, но не будут включены в исправления Python, так как это нарушает обратную совместимость.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/xml.html