Módulos de procesamiento XML¶
Código fuente: Lib/xml/
Las interfaces de Python para procesar XML están agrupadas en el paquete xml
.
Advertencia
Los módulos XML no son seguros contra datos construidos errónea o maliciosamente. Si necesita analizar datos que no son de confianza o no autenticados, consulte las secciones Vulnerabilidades XML y El paquete defusedxml.
Es importante tener en cuenta que los módulos del paquete xml
requieren que haya al menos un analizador XML compatible con SAX disponible. El analizador Expat se incluye con Python, por lo que el módulo xml.parsers.expat
siempre estará disponible.
La documentación de los paquetes xml.dom
y xml.sax
es la definición de los enlaces de Python para las interfaces DOM y SAX.
Los submódulos de manejo de XML son:
xml.etree.ElementTree
: la API ElementTree, un procesador de XML simple y ligero
xml.dom
: la definición de la API DOMxml.dom.minidom
: una implementación mínima de DOMxml.dom.pulldom
: soporte para la construcción de árboles DOM parciales
xml.sax
: clases base SAX2 y funciones de convenienciaxml.parsers.expat
: el enlace del analizador Expat
Vulnerabilidades XML¶
Los módulos de procesamiento XML no son seguros contra datos construidos malintencionadamente. Un atacante puede abusar de las características XML para llevar a cabo ataques de denegación de servicio, acceder a archivos locales, generar conexiones de red a otras máquinas o eludir firewalls.
En la tabla siguiente se ofrece una visión general de los ataques conocidos y si los distintos módulos son vulnerables a ellos.
tipo |
sax |
etree |
minidom |
pulldom |
xmlrpc |
---|---|---|---|---|---|
mil millones de risas |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
explosión cuadrática |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
expansión de entidad externa |
Seguro (5) |
Seguro (2) |
Seguro (3) |
Seguro (5) |
Seguro (4) |
Recuperación de DTD |
Seguro (5) |
Seguro |
Seguro |
Seguro (5) |
Seguro |
bomba de descompresión |
Seguro |
Seguro |
Seguro |
Seguro |
Vulnerable |
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
no expande entidades externas y lanza unParserError
cuando se produce una entidad.xml.dom.minidom
no expande entidades externas y simplemente retorna la entidad no expandida literalmente.xmlrpc.client
no expande entidades externas y las omite.Desde Python 3.7.1, las entidades generales externas ya no se procesan de forma predeterminada.
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
.
- mil millones de risas / expansión exponencial de entidad
El ataque Billion Laughs, también conocido como expansión exponencial de entidades, utiliza varios niveles de entidades anidadas. Cada entidad hace referencia a otra entidad varias veces y la definición de entidad final contiene una cadena pequeña. La expansión exponencial da como resultado varios gigabytes de texto y consume mucha memoria y tiempo de CPU.
- expansión de entidad de explosión cuadrática
Un ataque de explosión cuadrática es similar a un ataque de Billion Laughs; también abusa de la expansión de entidad. En lugar de entidades anidadas, repite una entidad grande con un par de miles de caracteres una y otra vez. El ataque no es tan eficaz como el caso exponencial, pero evita desencadenar contramedidas del analizador que prohíben entidades profundamente anidadas.
- expansión de entidad externa
Las declaraciones de entidad pueden contener algo más que texto para su reemplazo. También pueden apuntar a recursos externos o archivos locales. El analizador XML tiene acceso al recurso e incrusta el contenido en el documento XML.
- Recuperación de DTD
Algunas bibliotecas XML como
xml.dom.pulldom
de Python recuperan definiciones de tipo de documento de ubicaciones remotas o locales. La característica tiene implicaciones similares a las del problema de expansión de entidades externas.- bomba de descompresión
Las bombas de descompresión (también conocidas como ZIP bomb) se aplican a todas las bibliotecas XML que pueden analizar secuencias XML comprimidas, como secuencias HTTP comprimidas con gzip o archivos comprimidos por LZMA. Para un atacante puede reducir la cantidad de datos transmitidos en magnitudes de tres o más.
- 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.
The documentation for defusedxml on PyPI has further information about all known attack vectors with examples and references.
El paquete defusedxml
¶
defusedxml is a pure Python package with modified subclasses of all stdlib XML parsers that prevent any potentially malicious operation. Use of this package is recommended for any server code that parses untrusted XML data. The package also ships with example exploits and extended documentation on more XML exploits such as XPath injection.