Модули обработки 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.etree.ElementTree
: ElementTree API, простой и легкий XML-процессор
xml.dom
: определение DOM APIxml.dom.minidom
: минимальная реализация DOMxml.dom.pulldom
: поддержка построения частичных деревьев DOM
xml.sax
: Базовые классы и удобные функции SAX2xml.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) |
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
.
- Миллиард смеха / экспоненциальное расширение организации
Атака 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.