XML处�模�¶
æº�ç �: Lib/xml/
用于处ç�†XMLçš„Python接å�£åˆ†ç»„在 xml 包ä¸ã€‚
è¦å‘Š
XML 模å�—对于错误或æ�¶æ„�æž„é€ çš„æ•°æ�®æ˜¯ä¸�安全的。 å¦‚æžœä½ éœ€è¦�è§£æž�ä¸�å�—信任或未ç»�身份验è¯�的数æ�®ï¼Œè¯·å�‚阅 XML æ¼�æ´ž å’Œ defusedxml 包 部分。
值得注æ„�的是 xml 包ä¸çš„æ¨¡å�—è¦�求至少有一个 SAX 兼容的 XML è§£æž�器å�¯ç”¨ã€‚在 Python ä¸åŒ…å�« Expat è§£æž�å™¨ï¼Œå› æ¤ xml.parsers.expat 模å�—将始终å�¯ç”¨ã€‚
xml.dom 和 xml.sax 包的文档是 DOM 和 SAX 接�的 Python 绑定的定义。
XML 处ç�†å�模å�—包括:
xml.etree.ElementTree: ElementTree API,一个简�而轻�级的XML处�器
xml.dom:DOM API 定义xml.dom.minidom:最å°�çš„ DOM 实现xml.dom.pulldom:支æŒ�构建部分 DOM æ ‘
xml.sax:SAX2 基类和便利函数xml.parsers.expat:Expat解�器绑定
XML �洞¶
XML 处ç�†æ¨¡å�—对于æ�¶æ„�æž„é€ çš„æ•°æ�®æ˜¯ä¸�安全的。 攻击者å�¯èƒ½æ»¥ç”¨ XML 功能æ�¥æ‰§è¡Œæ‹’ç»�æœ�务攻击ã€�访问本地文件ã€�生æˆ�与其它计算机的网络连接或绕过防ç�«å¢™ã€‚
下表概述了已知的攻击以���模�是�容易�到攻击。
�类 |
sax |
etree |
minidom |
pulldom |
xmlrpc |
|---|---|---|---|---|---|
billion laughs |
易�攻击 (1) |
易�攻击 (1) |
易�攻击 (1) |
易�攻击 (1) |
易�攻击 (1) |
quadratic blowup |
易�攻击 (1) |
易�攻击 (1) |
易�攻击 (1) |
易�攻击 (1) |
易�攻击 (1) |
external entity expansion |
安全 (5) |
安全 (2) |
安全 (3) |
安全 (5) |
安全 (4) |
DTD retrieval |
安全 (5) |
安全 |
安全 |
安全 (5) |
安全 |
decompression bomb |
安全 |
安全 |
安全 |
安全 |
易�攻击 |
解�大��元 |
易�攻击 (6) |
易�攻击 (6) |
易�攻击 (6) |
易�攻击 (6) |
易�攻击 (6) |
Expat 2.4.1 å�Šæ›´æ–°çš„版本ä¸�易å�— "billion laughs" å’Œ "quadratic blowup" æ¼�洞的影å“�。 å› ä¸ºå�¯èƒ½è¦�ä¾�赖系统æ��供的库而ä»�被列为易å�—攻击的项。 请检查
pyexpat.EXPAT_VERSION。xml.etree.ElementTree�会扩展外部实体并将在�到实体时引�ParseError。xml.dom.minidom�会扩展外部实体,�是简�地返回未扩展的实体。xmlrpc.client�会扩展外部实体并将忽略它们。从 Python 3.7.1 开始,默认情况下��处�外部通用实体。
Expat 2.6.0 å�Šæ›´æ–°çš„版本ä¸�易å�—åˆ°å› è§£æž�大é‡�è¯�元而导致利用指数级è¿�行时间的拒ç»�æœ�务攻击。 由于对系统所æ��供的库的潜在ä¾�èµ–ä»�会有一些项目被列为易å�—攻击。 请检查
pyexpat.EXPAT_VERSION。
- billion laughs / exponential entity expansion (狂笑/递归实体扩展)
Billion Laughs 攻击 -- 也称为递归实体扩展 -- 使用多级嵌套实体。 æ¯�个实体多次引用å�¦ä¸€ä¸ªå®žä½“,最终实体定义包å�«ä¸€ä¸ªå°�å—符串。 æŒ‡æ•°çº§æ‰©å±•å¯¼è‡´å‡ å�ƒ GB 的文本,并消耗大é‡�内å˜å’Œ CPU 时间。
- quadratic blowup entity expansion(二次爆炸实体扩展)
二次爆炸攻击类似于 Billion Laughs 攻击;它也滥用了实体扩展。 它ä¸�是嵌套实体,而是一é��å�ˆä¸€é��地é‡�å¤�ä¸€ä¸ªå…·æœ‰å‡ å�ƒä¸ªå—符的大型实体。 è¿™ç§�攻击ä¸�如递归情况有效,但它å�¯é�¿å…�触å�‘ç¦�æ¢æ·±åº¦åµŒå¥—实体的解æž�器对ç–。
- external entity expansion
实体声明å�¯ä»¥åŒ…å�«çš„ä¸�仅仅是替æ�¢æ–‡æœ¬ã€‚ 它们还å�¯ä»¥æŒ‡å�‘外部资æº�或本地文件。 XML è§£æž�器访问资æº�并将内容嵌入到 XML 文档ä¸ã€‚
- DTD retrieval
Python 的一些 XML 库
xml.dom.pulldom从远程或本地�置检索文档类型定义。 该功能与外部实体扩展问题具有相似的�义。- decompression bomb
Decompression bombs(解压炸弹,å�ˆå�� ZIP bomb)适用于所有å�¯ä»¥è§£æž�压缩 XML æµ�(例如 gzip 压缩的 HTTP æµ�或 LZMA 压缩的文件)的 XML 库。 对于攻击者æ�¥è¯´ï¼Œå®ƒå�¯ä»¥å°†ä¼ 输的数æ�®é‡�å‡�少三个é‡�级或更多。
- 解�大��元
Expat 需è¦�é‡�æ–°è§£æž�未完æˆ�çš„è¯�元;在没有 Expat 2.6.0 所引入的防护措施的情况下,这会导致å�¯è¢«ç”¨æ�¥åœ¨è§£æž� XML 的应用程åº�ä¸åˆ¶é€ æ‹’ç»�æœ�务攻击的指数级è¿�行时间。 æ¤é—®é¢˜è¢«ç§°ä¸º CVE-2023-52425。
PyPI上 defusedxml 的文档包�有关所有已知攻击��的更多信�以�示例和�考。
defusedxml 包¶
defusedxml 是一个纯 Python è½¯ä»¶åŒ…ï¼Œå®ƒä¿®æ”¹äº†æ‰€æœ‰æ ‡å‡†åº“ XML è§£æž�器的å�类,å�¯ä»¥é˜²æ¢ä»»ä½•潜在的æ�¶æ„�æ“�作。 对于解æž�ä¸�å�—信任的XMLæ•°æ�®çš„任何æœ�务器代ç �,建议使用æ¤ç¨‹åº�包。 该软件包还æ��供了有关更多 XML æ¼�洞(如 XPath 注入)的示例æ¼�洞和扩展文档。