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 DOM

* "xml.dom.minidom": una implementación mínima de DOM

* "xml.dom.pulldom": soporte para la construcción de árboles DOM
  parciales

* "xml.sax": clases base SAX2 y funciones de conveniencia

* "xml.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      | Safe (5)           | Safe (2)           | Safe (3)           | Safe (5)           | Seguro (4)         |
| externa                   |                    |                    |                    |                    |                    |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| Recuperación de DTD       | Safe (5)           | Seguro             | Seguro             | Safe (5)           | Seguro             |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| bomba de descompresión    | Seguro             | Seguro             | Seguro             | Seguro             | **Vulnerable**     |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+

1. 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".

2. "xml.etree.ElementTree" no expande entidades externas y lanza un
   "ParserError" cuando se produce una entidad.

3. "xml.dom.minidom" no expande entidades externas y simplemente
   retorna la entidad no expandida literalmente.

4. "xmlrpclib" no expande entidades externas y las omite.

5. Desde Python 3.7.1, las entidades generales externas ya no se
   procesan de forma predeterminada.

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.

La documentación de defusedxml en PyPI tiene más información sobre
todos los vectores de ataque conocidos con ejemplos y referencias.


El paquete "defusedxml"
=======================

defusedxml es un paquete Python puro con subclases modificadas de
todos los analizadores XML stdlib que impiden cualquier operación
potencialmente malintencionada. Se recomienda el uso de este paquete
para cualquier código de servidor que analice datos XML que no sean de
confianza. El paquete también incluye ataques de ejemplo y
documentación ampliada sobre más vulnerabilidades XML, como la
inyección de XPath.
