Модули обработки XML
Исходный код: Lib/xml/
Интерфейсы Python для обработки XML сгруппированы в пакете xml.
Предупреждение
Модули XML не защищены от некорректно сформированных или вредоносных данных. Если вам необходимо анализировать недоверенные или неаутентифицированные данные, см. разделы Уязвимости XML и Пакет defusedxml.
Важно отметить, что модулям пакета xml требуется наличие как минимум одного XML-анализатора, совместимого с SAX. Анализатор 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 для проведения атак типа «отказ в обслуживании», получения доступа к локальным файлам, создания сетевых подключений к другим компьютерам или обхода межсетевых экранов.
В следующей таблице приведён обзор известных атак и указано, уязвимы ли к ним различные модули.
тип | 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.
- «миллиард смеха» / экспоненциальное расширение сущностей
-
Атака Billion Laughs — также известная как экспоненциальное расширение сущностей — использует несколько уровней вложенных сущностей. Каждая сущность несколько раз ссылается на другую, а определение последней сущности содержит короткую строку. В результате экспоненциального расширения образуются гигабайты текста, что требует большого объёма памяти и процессорного времени.
- квадратичное разрастание при расширении сущностей
-
Атака квадратичного разрастания похожа на атаку Billion Laughs; она также использует расширение сущностей. Вместо вложенных сущностей одна большая сущность размером в несколько тысяч символов многократно повторяется. Эта атака не так эффективна, как экспоненциальный вариант, но позволяет избежать срабатывания защитных механизмов анализатора, запрещающих глубоко вложенные сущности.
- подстановка внешних сущностей
-
Объявления сущностей могут содержать не только текст для подстановки. Они также могут указывать на внешние ресурсы или локальные файлы. XML-анализатор обращается к ресурсу и встраивает его содержимое в XML-документ.
- получение DTD
-
Некоторые XML-библиотеки, например
xml.dom.pulldomв Python, получают определения типа документа из удалённых или локальных источников. Эта возможность имеет последствия, аналогичные проблеме подстановки внешних сущностей. - бомба распаковки
-
Бомбы распаковки (также известные как ZIP-бомбы) представляют угрозу для всех XML-библиотек, способных анализировать сжатые XML-потоки, например HTTP-потоки в формате gzip или файлы, сжатые с помощью 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.12/library/xml.html