Módulos de Processamento de XML
*******************************

**Código-fonte:** Lib/xml/

======================================================================

As interfaces do Python para processar XML estão agrupadas no pacote
"xml".

Aviso:

  Os módulos XML não são seguros contra dados errôneos ou
  maliciosamente construídos. Se você precisa analisar dados não
  confiáveis ou não autenticados, consulte as seções Vulnerabilidades
  em XML e O Pacote defusedxml.

É importante observar que os módulos no pacote "xml" exigem que está
disponível pelo menos um analisador sintático XML compatível com SAX.
O analisador sintático Expat está incluído no Python, então o módulo
"xml.parsers.expat" estará sempre disponível.

A documentação para os pacotes "xml.dom" e "xml.sax" são a definição
das ligações Python para as interfaces DOM e SAX.

Os submódulos de manipulação XML são:

* "xml.etree.ElementTree": a API de ElementTree, um processador XML
  simples e leve

* "xml.dom": a definição da API de DOM

* "xml.dom.minidom": uma implementação mínima do DOM

* suporte para construir árvores parciais de DOM no "xml.dom.pulldom"

* "xml.sax": Classe base SAX2 e funções de conveniência

* "xml.parsers.expat": a ligação do analisador sintático Expat


Vulnerabilidades em XML
=======================

Os módulos de processamento XML não são seguros contra dados
maliciosamente construídos. Um atacante pode abusar dos recursos XML
para realizar ataques de negação de serviço, acessar arquivos locais,
gerar conexões de rede com outras máquinas ou contornar firewalls.

A tabela a seguir fornece uma visão geral dos ataques conhecidos e se
os vários módulos são vulneráveis a eles.

+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| tipo                      | sax                | etree              | minidom            | pulldom            | xmlrpc             |
|===========================|====================|====================|====================|====================|====================|
| billion laughs            | **Vulnerável** (1) | **Vulnerável** (1) | **Vulnerável** (1) | **Vulnerável** (1) | **Vulnerável** (1) |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| quadratic blowup          | **Vulnerável** (1) | **Vulnerável** (1) | **Vulnerável** (1) | **Vulnerável** (1) | **Vulnerável** (1) |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| external entity expansion | Seguro (5)         | Seguro (2)         | Seguro (3)         | Seguro (5)         | Seguro (4)         |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| DTD retrieval             | Seguro (5)         | Seguro             | Seguro             | Seguro (5)         | Seguro             |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| decompression bomb        | Seguro             | Seguro             | Seguro             | Seguro             | **Vulnerável**     |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| large tokens              | **Vulnerável** (6) | **Vulnerável** (6) | **Vulnerável** (6) | **Vulnerável** (6) | **Vulnerável** (6) |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+

1. Expat 2.4.1 e versões mais recentes não são vulneráveis às
   vulnerabilidades "billion laughs" e "quadratic blowup". Itens ainda
   listados como vulneráveis devido à possível dependência de
   bibliotecas fornecidas pelo sistema. Verifique
   "pyexpat.EXPAT_VERSION".

2. "xml.etree.ElementTree" não expande entidades externas e levanta um
   "ParseError" quando ocorre uma entidade.

3. "xml.dom.minidom" não expande entidades externas e simplesmente
   retorna a entidade não expandida literalmente.

4. "xmlrpc.client" não expande entidades externas e as omite.

5. Desde o Python 3.7.1, entidades gerais externas não são mais
   processadas por padrão.

6. Expat 2.6.0 e mais recente não é vulnerável a negação de serviço
   através de tempo de execução quadrático causado pela análise de
   tokens grandes. Itens ainda listados como vulneráveis devido à
   possível dependência de bibliotecas fornecidas pelo sistema.
   Verifique "pyexpat.EXPAT_VERSION".

billion laughs / exponential entity expansion
   O ataque Billion Laughs (bilhões de risadas, em uma tradução livre)
   - também conhecido como "exponential entity expansion" (expansão
   exponencial de entidades, em uma tradução livre) - usa vários
   níveis de entidades aninhadas. Cada entidade se refere a outra
   entidade várias vezes, e a definição final da entidade contém uma
   pequena string. A expansão exponencial resulta em vários gigabytes
   de texto e consome muita memória e tempo de CPU.

quadratic blowup entity expansion
   Um ataque "quadratic blowup" (explosão quadrática, em uma tradução
   livre) português) é semelhante a um ataque Billion Laughs; ele
   abusa da expansão de entidades também. Em vez de entidades
   aninhadas, ele repete uma grande entidade com alguns milhares de
   caracteres repetidamente. O ataque não é tão eficiente quanto o
   caso exponencial, mas evita acionar contramedidas do analisador
   sintático que proíbem entidades profundamente aninhadas.

external entity expansion
   Declarações de entidade podem conter mais do que apenas texto para
   substituição. Elas também podem apontar para recursos externos ou
   arquivos locais. O analisador sintático XML acessa o recurso e
   incorpora o conteúdo no documento XML.

DTD retrieval
   Algumas bibliotecas XML, como a "xml.dom.pulldom" do Python,
   recuperam definições de tipo de documento de locais remotos ou
   locais. O recurso tem implicações semelhantes ao problema de
   expansão de entidade externa.

decompression bomb
   "Bombas de descompressão" em uma tradução livre. Também conhecidas
   como ZIP bomb, se aplicam a todas as bibliotecas XML que podem
   analisar fluxos XML comprimidos, como fluxos de HTTP compactados
   com gzip ou arquivos comprimidos com LZMA. Para um atacante, isso
   pode reduzir a quantidade de dados transmitidos em três magnitudes
   ou mais.

large tokens
   Expat precisa analisar novamente os símbolos não finalizados; sem a
   proteção introduzida no Expat 2.6.0, isso pode levar a um tempo de
   execução quadrático que pode ser usado para causar negação de
   serviço na aplicação ao analisar XML. O problema é conhecido como
   CVE-2023-52425.

A documentação para defusedxml no PyPI tem mais informações sobre
todos os vetores de ataque conhecidos, com exemplos e referências.


O Pacote "defusedxml"
=====================

defusedxml é um pacote Python puro com subcláusulas modificadas de
todos os analisadores sintáticos XML da biblioteca padrão que impedem
qualquer operação potencialmente maliciosa. O uso deste pacote é
recomendado para qualquer código de servidor que analise dados XML não
confiáveis. O pacote também inclui exemplos de explorações e
documentação estendida sobre mais explorações XML, como injeção de
XPath.
