XML処理モジュール
ソースコード: :source: `Lib / xml /`
XMLを処理するためのPythonのインターフェースは、xml
パッケージにグループ化されています。
警告
XMLモジュールは、誤ったデータや悪意を持って作成されたデータに対して安全ではありません。 信頼できないデータまたは認証されていないデータを解析する必要がある場合は、 XMLの脆弱性および defusedxmlパッケージのセクションを参照してください。
xml パッケージのモジュールでは、少なくとも1つのSAX準拠のXMLパーサーが使用可能である必要があることに注意してください。 ExpatパーサーはPythonに含まれているため、 xml.parsers.expat モジュールは常に使用可能です。
xml.dom および xml.sax パッケージのドキュメントは、DOMおよびSAXインターフェイスのPythonバインディングの定義です。
XML処理サブモジュールは次のとおりです。
- xml.etree.ElementTree :ElementTree API、シンプルで軽量なXMLプロセッサー
- xml.dom :DOMAPI定義
- xml.dom.minidom :最小限のDOM実装
- xml.dom.pulldom :部分的なDOMツリーの構築のサポート
- xml.sax :SAX2基本クラスと便利な関数
- xml.parsers.expat :Expatパーサーバインディング
XMLの脆弱性
XML処理モジュールは、悪意を持って作成されたデータに対して安全ではありません。 攻撃者は、XML機能を悪用して、サービス拒否攻撃を実行したり、ローカルファイルにアクセスしたり、他のマシンへのネットワーク接続を生成したり、ファイアウォールを回避したりする可能性があります。
次の表は、既知の攻撃の概要と、さまざまなモジュールがそれらに対して脆弱であるかどうかを示しています。
親切 | サックス | etree | ミニダム | プルダム | xmlrpc |
---|---|---|---|---|---|
十億の笑い | 脆弱性(1) | 脆弱性(1) | 脆弱性(1) | 脆弱性(1) | 脆弱性(1) |
二次爆発 | 脆弱性(1) | 脆弱性(1) | 脆弱性(1) | 脆弱性(1) | 脆弱性(1) |
外部エンティティの拡張 | 安全(5) | 安全(2) | 安全(3) | 安全(5) | 安全(4) |
DTD 検索 | 安全(5) | 安全 | 安全 | 安全(5) | 安全 |
減圧爆弾 | 安全 | 安全 | 安全 | 安全 | 脆弱 |
- Expat 2.4.1以降は、「10億の笑い」や「二次爆発」の脆弱性に対して脆弱ではありません。 システムが提供するライブラリに依存する可能性があるため、アイテムは依然として脆弱であるとリストされています。
pyexpat.EXPAT_VERSION
を確認してください。 - xml.etree.ElementTree は外部エンティティを展開せず、エンティティが発生すると
ParserError
を発生させます。 - xml.dom.minidom は外部エンティティを展開せず、展開されていないエンティティをそのまま返します。
xmlrpclib
は外部エンティティを展開せず、それらを省略します。- Python 3.7.1以降、外部の一般エンティティはデフォルトで処理されなくなりました。
- 10億の笑い/指数関数的なエンティティの拡大
- Billion Laughs 攻撃(指数エンティティ拡張とも呼ばれます)は、複数レベルのネストされたエンティティを使用します。 各エンティティは別のエンティティを数回参照し、最終的なエンティティ定義には小さな文字列が含まれています。 指数関数的な拡張により、数ギガバイトのテキストが生成され、大量のメモリとCPU時間が消費されます。
- 二次爆発エンティティの拡張
- 二次爆発攻撃は、 Billion Laughs 攻撃に似ています。 エンティティの拡張も悪用します。 ネストされたエンティティの代わりに、数千文字の1つの大きなエンティティを何度も繰り返します。 攻撃は指数関数的な場合ほど効率的ではありませんが、深くネストされたエンティティを禁止するパーサー対策のトリガーを回避します。
- 外部エンティティの拡張
- エンティティ宣言には、置換用のテキスト以上のものを含めることができます。 また、外部リソースまたはローカルファイルを指すこともできます。 XMLパーサーはリソースにアクセスし、コンテンツをXMLドキュメントに埋め込みます。
- DTD 検索
- Pythonの xml.dom.pulldom などの一部のXMLライブラリは、リモートまたはローカルの場所からドキュメントタイプ定義を取得します。 この機能には、外部エンティティの拡張の問題と同様の影響があります。
- 減圧爆弾
- 解凍爆弾(別名 ZIP爆弾)は、gzip圧縮されたHTTPストリームやLZMA圧縮ファイルなどの圧縮XMLストリームを解析できるすべてのXMLライブラリに適用されます。 攻撃者にとっては、送信されるデータの量を3桁以上減らすことができます。
PyPIの defusedxml のドキュメントには、例と参照を含むすべての既知の攻撃ベクトルに関する詳細情報があります。
defusedxmlパッケージ
defusedxml は、潜在的に悪意のある操作を防ぐすべてのstdlibXMLパーサーのサブクラスが変更された純粋なPythonパッケージです。 このパッケージの使用は、信頼できないXMLデータを解析するサーバーコードに推奨されます。 このパッケージには、エクスプロイトの例と、XPathインジェクションなどのより多くのXMLエクスプロイトに関する拡張ドキュメントも付属しています。