XMLを扱うモジュール群
*********************

**ソースコード:** Lib/xml/

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

PythonのXMLを扱うインターフェースは "xml" パッケージにまとめられていま
す。

警告:

  XML モジュール群は不正なデータや悪意を持って作成されたデータに対して
  安全ではありません。信頼できないデータをパースする必要がある場合は
  XML の脆弱性 と defusedxml パッケージ を参照してください。

注意すべき重要な点として、 "xml" パッケージのモジュールは SAX に対応し
た XML パーザが少なくとも一つ利用可能でなければなりません。Expat パー
ザが Python に取り込まれているので、 "xml.parsers.expat" モジュールは
常に利用できます。

"xml.dom" および "xml.sax" パッケージのドキュメントは Python による
DOM および SAX インターフェースへのバインディングに関する定義です。

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 parser バインディング


XML の脆弱性
============

XML 処理モジュールは悪意を持って生成されたデータに対して安全ではありま
せん。攻撃者は XML の機能を悪用して DoS攻撃、ローカルファイルへのアク
セス、他マシンへのネットワーク接続、ファイアーウォールの迂回などを行う
ことが出来ます。

以下の表は既知の攻撃と各モジュールがそれに対し脆弱かどうかの概要を示し
ています。

+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| 種類                      | 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        | 安全               | 安全               | 安全               | 安全               | **脆弱**           |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| large tokens              | **Vulnerable** (6) | **Vulnerable** (6) | **Vulnerable** (6) | **Vulnerable** (6) | **Vulnerable** (6) |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+

1. Expat 2.4.1 and newer is not vulnerable to the "billion laughs" and
   "quadratic blowup" vulnerabilities. Items still listed as
   vulnerable due to potential reliance on system-provided libraries.
   Check "pyexpat.EXPAT_VERSION".

2. "xml.etree.ElementTree" は外部エンティティを展開せず、エンティティ
   が現れた場合は "ParserError" を送出します。

3. "xml.dom.minidom" は外部エンティティを展開せず、展開前のエンティテ
   ィをそのまま返します。

4. "xmlrpclib" は外部エンティティを展開せず、除外します。

5. Python 3.7.1 からは、一般の外部エンティティはデフォルトで処理されな
   くなりました。

6. Expat 2.6.0 and newer is not vulnerable to denial of service
   through quadratic runtime caused by parsing large tokens. Items
   still listed as vulnerable due to potential reliance on system-
   provided libraries. Check "pyexpat.EXPAT_VERSION".

billion laughs / exponential entity expansion
   Billion Laughs 攻撃 -- または指数関数的エンティティ展開
   (exponential entity expansion) -- は複数階層の入れ子になったエンテ
   ィティを使用します。 各エンティティは別のエンティティを複数回参照し
   、最終的なエンティティの定義は短い文字列です。 指数関数的に展開され
   ることで数 GB のテキストができ、多くのメモリと CPU 時間を消費します
   。

quadratic blowup entity expansion
   二次爆発攻撃 (quadratic blowup attack) はエンティティ展開を悪用する
   点で Billion Laughs 攻撃に似ています。 入れ子になったエンティティの
   代わりに、この攻撃は数千字の大きなエンティティを何度も繰り返します
   。 この攻撃は指数関数的なものほど効率的ではありませんが、パーザの深
   い入れ子になったエンティティを禁止する対抗手段をすり抜けます。

external entity expansion
   (外部エンティティ展開) エンティティの定義はただのテキスト置換以上の
   ことが出来ます。 外部のリソースやローカルファイルを参照することも出
   来ます。 XML パーザはリソースにアクセスしてその内容を XML 文書に埋
   め込みます。

DTD retrieval
   Python の "xml.dom.pulldom" のような XML ライブラリは DTD をリモー
   トやローカルの場所から読み込みます。 この機能には外部エンティティ展
   開の問題と同じことが予想されます。

decompression bomb
   解凍爆弾 (あるいは ZIP 爆弾) は、gzip 圧縮 HTTP ストリームや LZMA
   圧縮ファイルなどの圧縮された XML ストリームをパースできる全ての XML
   ライブラリに対し行われます。 攻撃者は送信データ量を1/3以下に減らす
   ことができます。

large tokens
   Expat needs to re-parse unfinished tokens; without the protection
   introduced in Expat 2.6.0, this can lead to quadratic runtime that
   can be used to cause denial of service in the application parsing
   XML. The issue is known as CVE-2023-52425.

PyPI 上の defusedxml のドキュメントには既知の攻撃手法の詳細が例と文献
付きであります。


"defusedxml" パッケージ
=======================

defusedxml は潜在的に悪意のある操作を防ぐ、修正された stdlib XML
parsers のサブクラスが付属している純 Python パッケージです。信頼出来な
い XML データをパースするサーバーコードではこのパッケージの使用が推奨
されます。パッケージには悪用の例に加え、XPath injection 等のさらなる
XML の悪用の例があります。
