19.5。 XML処理モジュール
XMLを処理するためのPythonのインターフェースは、xml
パッケージにグループ化されています。
警告
XMLモジュールは、誤ったデータや悪意を持って作成されたデータに対して安全ではありません。 信頼できないデータまたは認証されていないデータを解析する必要がある場合は、 XMLの脆弱性を参照してください。
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パーサーバインディング
19.6。 XMLの脆弱性
XML処理モジュールは、悪意を持って作成されたデータに対して安全ではありません。 攻撃者は、たとえば、脆弱性を悪用する可能性があります サービス拒否攻撃、ローカルファイルへのアクセス、他のマシンへのネットワーク接続の生成、ファイアウォールへのアクセスまたはファイアウォールの回避。 XMLへの攻撃は、エンティティを使用したインライン DTD (ドキュメントタイプ定義)などの見慣れない機能を悪用します。
次の表は、既知の攻撃の概要と、さまざまなモジュールがそれらに対して脆弱であるかどうかを示しています。
親切 | サックス | etree | ミニダム | プルダム | xmlrpc |
---|---|---|---|---|---|
十億の笑い | 脆弱 | 脆弱 | 脆弱 | 脆弱 | 脆弱 |
二次爆発 | 脆弱 | 脆弱 | 脆弱 | 脆弱 | 脆弱 |
外部エンティティの拡張 | 脆弱 | 安全(1) | 安全(2) | 脆弱 | 安全(3) |
DTD 検索 | 脆弱 | 安全 | 安全 | 脆弱 | 安全 |
減圧爆弾 | 安全 | 安全 | 安全 | 安全 | 脆弱 |
- xml.etree.ElementTree は外部エンティティを展開せず、エンティティが発生するとParserErrorを発生させます。
- xml.dom.minidom は外部エンティティを展開せず、展開されていないエンティティをそのまま返します。
- xmlrpclib は外部エンティティを展開せず、それらを省略します。
- 10億の笑い/指数関数的なエンティティの拡大
- Billion Laughs 攻撃(指数エンティティ拡張とも呼ばれます)は、複数レベルのネストされたエンティティを使用します。 各エンティティは別のエンティティを数回参照し、最終的なエンティティ定義には小さな文字列が含まれます。 最終的に、小さな文字列は数ギガバイトに拡張されます。 指数関数的な拡張も多くのCPU時間を消費します。
- 二次爆発エンティティの拡張
- 二次爆発攻撃は、 Billion Laughs 攻撃に似ています。 エンティティの拡張も悪用します。 ネストされたエンティティの代わりに、数千文字の1つの大きなエンティティを何度も繰り返します。 攻撃は指数関数的な場合ほど効率的ではありませんが、高度にネストされたエンティティに対するパーサーの対抗策のトリガーを回避します。
- 外部エンティティの拡張
- エンティティ宣言には、置換用のテキスト以上のものを含めることができます。 また、パブリック識別子またはシステム識別子によって外部リソースを指すこともできます。 システム識別子は標準のURIであるか、ローカルファイルを参照できます。 XMLパーサーは、たとえば次のようにリソースを取得します。 HTTPまたはFTPが要求し、コンテンツをXMLドキュメントに埋め込みます。
- DTD 検索
- Pythonの xml.dom.pulldom などの一部のXMLライブラリは、リモートまたはローカルの場所からドキュメントタイプ定義を取得します。 この機能には、外部エンティティの拡張の問題と同様の影響があります。
- 減圧爆弾
- 解凍爆弾(別名 ZIP爆弾)の問題は、gzip圧縮されたHTTPストリームやLZMA化されたファイルなどの圧縮されたXMLストリームを解析できるすべてのXMLライブラリに当てはまります。 攻撃者にとっては、送信されるデータの量を3桁以上減らすことができます。
PyPIの defusedxml のドキュメントには、例と参照を含むすべての既知の攻撃ベクトルに関する詳細情報があります。
19.6.1。 融合されたパッケージ
これらの外部パッケージは、信頼できないXMLデータを解析するコードに推奨されます。
defusedxml は、潜在的に悪意のある操作を防ぐすべてのstdlibXMLパーサーのサブクラスが変更された純粋なPythonパッケージです。 このパッケージには、エクスプロイトの例と、xpathインジェクションなどのXMLエクスプロイトに関する拡張ドキュメントも付属しています。
defusedexpat は、変更されたlibexpatとパッチが適用された置換pyexpat
拡張モジュールを提供し、エンティティ拡張DoS攻撃に対抗します。 Defusedexpatは、適切で構成可能な量のエンティティ拡張を引き続き許可します。 変更はPythonの将来のリリースにマージされます。
回避策と変更は、下位互換性を損なうため、パッチリリースには含まれていません。 結局のところ、インラインDTDとエンティティ拡張は明確に定義されたXML機能です。