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:

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.