HeadlinesBriefing favicon HeadlinesBriefing.com

Python str.lower() IDNA セキュリティバグが修正されました

Hacker News •
×

一部のインターネット標準はASCII文字のみをサポートしていますが、世界中で使用されているのはローマ字アルファベット以上です。そのため、ドメイン名で使用するためのUnicodeからASCIIへのマッピングが必要です。Name Prepはこの解決策の一部であり、RFC 3491でString Prepのプロファイルとして定義され、Applicationでの国際化ドメイン名(IDNA)の重要なコンポーネントですが、"IDNA 2003"としても知られています。String PrepアルゴリズムはRFC 3454で定義されています。IDNA 2003はRFC 5890、5891、5892、5893で定義されたIDNA 2008によって廃止されました。PythonはIDNA 2003をidnaエンコーダ(str.encode('idna'))を通じてサポートし、IDNA 2008はPythonパッケージインデックスのidnaパッケージによってサポートされています。PythonのString Prepの実装は標準ライブラリのstringprepモジュールに実装されています。

一般的には、idnaパッケージ(IDNA 2008)を使用し、.encode("idna")(IDNA 2003)を使用すべきですが、時には古い動作が必要になることがあります。String Prepはセクション3.2で"ケースフッキング"ステップ(ケースフッキングとは"コードポイントを小文字/大文字にする方法"の約です)を定義し、テーブルB.2とB.3を通じてすべての文字をマッピングすることで、文字列のケースインセンシティブな比較を可能にします。B.2は実質的にstr.lower()であり、Unicodeのルールに従ってすべての文字を小文字に変換し、B.3には例外が含まれています。

この関数でのstr.lower()呼び出しは脆弱性です!なぜならstrは特定のPythonインタプリタが同梱しているUnicodeデータを使用するため、unicodedata.unidata_versionにアクセスすることで特定のPythonインタプリタが使用するUnicodeバージョンを確認できます。また、すべてのPythonバージョンで使用可能なUnicode 3.2.0データベースもあります(unicodedata.ucd_3_2_0)、これはString PrepとIDNAアルゴリズムのために特別に用意されています。String Prepは一貫した動作を確保するためにこの特定のUnicodeバージョンに依存しており、RFC 3454のB.2とB.3のテーブルは、テーブルにエンコードされたUnicode 3.2.0のケースフッキングルールです。したがって、私たちはUnicode 3.2.0のケースフッキングルールを使用し、新しいUnicodeケースフッキングルールを使用しません。

修正は、str.lower()が特定の関数でUnicode 3.2.0を使用しているかのように振る舞うため、新しい例外を作成することでした。この脆弱性を報告したBitshift、修復の共同開発を行ったStan Ulbrych、そして修復のレビューを行ったMarc-Andre LemburgPetr Viktorinに感謝します。詳細についてはCVE-2026-17084を参照してください。

キーエンティティ:企業:Python Software Foundation、Alpha-Omega | 人物:Seth Larson、Bitshift、Stan Ulbrych、Marc-Andre Lemburg、Petr Viktorin