Modules de traitement XML¶
Code source: Lib/xml/
Les interfaces de Python de traitement de XML sont regroupées dans le paquet xml
.
Avertissement
les modules XML ne sont pas protégés contre les données mal construites ou malveillantes. Si vous devez parcourir des données douteuses non authentifiées, lisez les sections Vulnérabilités XML et The defusedxml Package.
Il est important de noter que les modules dans le paquet xml
nécessitent qu'au moins un analyseur compatible SAX soit disponible. L'analyseur Expat est inclus dans Python, ainsi le module xml.parsers.expat
est toujours disponible.
La documentation des interfaces vers DOM et SAX se trouve dans xml.dom
et xml.sax
.
Les sous-modules de traitement XML sont :
xml.etree.ElementTree
: l'API ElementTree, un processeur simple et léger
xml.dom
: la définition de l'API DOMxml.dom.minidom
: une implémentation minimale de DOMxml.dom.pulldom
: gestion de la construction partielle des arbres DOM
xml.sax
: classes mères SAX2 et fonctions utilitairesxml.parsers.expat
: l'interface de l'analyseur Expat
Vulnérabilités XML¶
Les modules de traitement XML ne sont pas sécurisés contre les données construites malicieusement. Un attaquant peut abuser des fonctionnalités XML pour exécuter des attaques par déni de service, accéder à des fichiers locaux, générer des connexions réseaux à d'autres machines ou contourner des pare-feux.
Le tableau suivant donne une vue d'ensemble des attaques connues et indique si les différents modules y sont vulnérables.
type |
sax |
etree |
minidom |
pulldom |
xmlrpc |
---|---|---|---|---|---|
billion laughs |
Vulnérable (1) |
Vulnérable (1) |
Vulnérable (1) |
Vulnérable (1) |
Vulnérable (1) |
quadratic blowup |
Vulnérable (1) |
Vulnérable (1) |
Vulnérable (1) |
Vulnérable (1) |
Vulnérable (1) |
external entity expansion |
Sûr (5) |
Sûr (2) |
Sûr (3) |
Sûr (5) |
Sûr (4) |
Récupération de DTD |
Sûr (5) |
Sûr |
Sûr |
Sûr (5) |
Sûr |
decompression bomb |
Sûr |
Sûr |
Sûr |
Sûr |
Vulnérable |
large tokens |
Vulnerable (6) |
Vulnerable (6) |
Vulnerable (6) |
Vulnerable (6) |
Vulnerable (6) |
Expat 2.4.1 and newer is not vulnerable to the "billion laughs" and "quadratic blowup" vulnerabilities. Items still listed as vulnerable due to potential reliance on system-provided libraries. Check
pyexpat.EXPAT_VERSION
.xml.etree.ElementTree
doesn't expand external entities and raises aParseError
when an entity occurs.xml.dom.minidom
n'étend pas les entités externes et renvoie simplement l'entité mot pour mot (non étendue).xmlrpc.client
doesn't expand external entities and omits them.Depuis Python 3.7.1, par défaut les entités générales externes ne sont plus traitées.
Expat 2.6.0 and newer is not vulnerable to denial of service through quadratic runtime caused by parsing large tokens. Items still listed as vulnerable due to potential reliance on system-provided libraries. Check
pyexpat.EXPAT_VERSION
.
- billion laughs / exponential entity expansion
L'attaque Billion Laughs – aussi connue comme exponential entity expansion – utilise de multiples niveaux d'entités imbriquées. Chaque entité se réfère à une autre entité de multiple fois. L'entité finale contient une chaîne courte. Le résultat de l'expansion exponentielle génère plusieurs gigaoctets de texte et consomme beaucoup de mémoire et de temps processeur.
- quadratic blowup entity expansion
Une attaque quadratic blowup est similaire à l'attaque Billion Laughs ; il s'agit également d'un abus d'extension d'entités. Au lieu d'utiliser des entités imbriquées, cette attaque répète encore et encore une seule entité de plusieurs milliers de caractères. Cette attaque n'est pas aussi efficace que la version exponentielle mais contourne les contre-mesures de l'analyseur qui interdit les entités imbriquées de multiples fois.
- external entity expansion
Les déclarations d'entités peuvent contenir plus que du texte de substitution. Elles peuvent également référencer des ressources externes ou des fichiers locaux. L'analyseur XML accède à ces fichiers et inclut les contenus dans le document XML.
- Récupération de DTD
Certaines bibliothèques XML comme
xml.dom.pulldom
de Python récupère les documents de définitions de types (DTD) depuis des emplacements distants ou locaux. La fonctionnalité a des implications similaires au problème d'extension d'entités externes.- decompression bomb
Des bombes de décompression (ou ZIP bomb) sont valables pour toutes les bibliothèques XML qui peuvent analyser des flux XML compressés comme des flux HTTP gzip ou des fichiers compressés LZMA. Pour L'attaquant, cela permet de réduire d'une magnitude d'ordre 3 ou plus la quantité de données transmises.
- large tokens
Expat needs to re-parse unfinished tokens; without the protection introduced in Expat 2.6.0, this can lead to quadratic runtime that can be used to cause denial of service in the application parsing XML. The issue is known as CVE-2023-52425.
La documentation de defusedxml sur PyPI contient plus d'informations sur tous les vecteurs d'attaques connus ainsi que des exemples et des références.
The defusedxml
Package¶
defusedxml est un paquet écrit exclusivement en Python avec des sous-classes modifiées de tous les analyseurs de la bibliothèque standard XML qui empêchent toutes les opérations potentiellement malicieuses. L'utilisation de ce paquet est recommandée pour tout serveur qui analyse des données XML non fiables. Le paquet inclut également des exemples d'attaques et une documentation plus fournie sur davantage d'attaques XML comme XPath injection.