Pythonにおける`str.lower()`がセキュリティ脆弱性になる場合 — セス・ラーソン

2026/08/26 5:49

Pythonにおける`str.lower()`がセキュリティ脆弱性になる場合 — セス・ラーソン

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Python は標準ライブラリの IDNA 実装を StringPrep および IDNA 2003(RFC 3491)で要求されている Unicode 3.2.0 の小文字化ルールと整合させるための重大なセキュリティ修正を発表しました。以前は Python が最新バージョンの Unicode データ(例:17.0.0)に依存しており、StringPrep の小文字化ステップにおいて

str.lower()
を使用していましたが、これは RFC 3454 と矛盾し、特定のドメイン名の符号化を誤ったものとして生成していました。例えば、「ᎠᎠ」という文字列が最新データ下では 'xn--kz9aa' と符号化されますが、コンプライアンス要件を満たす正解は 'xn--58da' でした。この問題を解決するため、Python は内部例外を導入し、StringPrep および IDNA アルゴリズムに対して
str.lower()
が呼び出された場合に Unicode 3.2.0 のマッピングテーブルを仮定して動作するようにしました。同時に、現代の Unicode データを置き換えることもせず、PyPI の
idna
パッケージ利用者には影響を与えません(同パッケージは一般的に好まれる IDNA 2008 を既にサポートしています)。この修正は CVE-2026-17084 で文書化されており、標準ライブラリ内の国際化タスクにおいて一貫した正規形ドメイン名形式を保証します。この脆弱性は Bitshift によって報告され、Stan Ulbrych が共同で修復を開発し、Marc-Andre Lemburg および Petr Viktorin によるレビューを経て完了しました。

本文

IDNA 脆弱性の原因と対策:Unicode バージョン不整合について

背景:国際化ドメイン名(IDN)の課題

  • インターネット標準ではASCII 文字のみをサポートしているが、世界中で多様な文字が使われている。
  • ドメイン名に Unicode を使用するためには、Unicode から ASCII へのマッピングが必要。
  • その解決策の一つが NamePrep(RFC 3491) で、国際化ドメイン名(IDNA)実装の重要な要素である。

アルゴリズムとバージョンの進化

  • NamePrep は「StringPrep」のプロファイルとして定義され、IDNA 2003としても知られる。
    • 規定書:RFC 3454(StringPrep)および RFC 5890〜5893(IDNA 2003)。
  • Python における実装状況:
    • IDNA 2003: 標準ライブラリの
      stringprep
      モジュールでサポート。
    • IDNA 2008: パッケージインデックス上の
      idna
      パッケージ(
      str.encode('idna')
      )でサポート。
  • 推奨事項: 古い動作が必要な場合を除き、IDNA 2008 を使用すべき

脆弱性の原因:ケースフォールドの不整合

StringPrep の第 3.2 節では「ケースフォールド」が定義されており、文字列の区分別比較を行うためのステップである。

  • 仕様上の動作 (B.2 テーブル): Unicode ルールに従いすべての文字を小文字化(実質的に
    str.lower()
    )。
  • 例外処理 (B.3 テーブル): 特殊なケースのみ例外として扱う。

Python 標準ライブラリにおいて、以下のコードが脆弱性の原因となっていた:

def map_table_b3(code):
    r = b3_exceptions.get(ord(code))
    if r is not None:
        return r
    return code.lower()  # ⚠️ ここが問題の所在

なぜ
str.lower()
はダメなのか?

  • Python インタープリタは付帯された最新のUnicode データベースを直接使用しているため。
  • 現在の環境(例:
    unicodedata.unidata_version
    '17.0.0'
    )では、最新の Unicode ルールが適用される。

仕様との不一致の具体例

StringPrep は一貫性のある動作のため、Unicode 3.2.0 のデータベースを必須としている(RFC 3454 に基づく)。

  • 正しい挙動 (Unicode 3.2.0):

    # RFC 3454 準拠の期待される結果
    "ᎠᎠ".encode("idna") 
    # 'xn--58da'
    
  • 脆弱性の原因 (現在の Python 17.0.0):

    # Unicode 17.0.0 のルールが適用され、仕様に沿わない結果
    "ᎠᎠ".encode("idna") 
    # 'xn--kz9aa'
    

対策:例外テーブルの作成と修正

  • str.lower()
    を Unicode 3.2.0 の動作に見立てるために、新しい例外テーブルを作成した。
  • 最新の Unicode バージョンと Unicode 3.2.0 との挙動が異なるすべてのコードポイントを検出・記録した。
  • これにより、IDNA 2003 は仕様に完全準拠するようになった。

謝辞とクレジット

  • 脆弱性の報告: Bitshift
  • 対策の開発: Stan Ulbrych(共同開発)
  • 対策のレビュー: Marc-Andre Lemburg, Petr Viktorin
  • 詳細情報:CVE-2026-17084 をご参照ください。

おわりに

Python Software Foundation のセキュリティ開発者として、Alpha-Omega による支援に感謝します。

  • 共有: Mastodon、メール、Bluesky で考えを発信できます。
  • アーカイブ: このブログの全投稿(193 件)を閲覧可能です。
  • フォロー: RSS やニュースレターを通じて最新情報を取得できます。
  • 推奨: まずは外に出て過ごすことが一番おすすめです。

同じ日のほかのニュース

一覧に戻る →

2026/08/26 6:39

Python の事前宣言定数は少し奇妙です

## Japanese Translation: Python は 6 つのプリデークレードされた項目を持っています:`True`, `False`, `None`, `__debug__`, `Ellipsis`(`...`), および `NotImplemented`。これらはしばしば「定数」と呼ばれますが、その挙動は大きく異なります。 このうち 4 つ(`True`, `False`, `None`, `__debug__`)は通常の識別子ではなく特別な構文的トークンです。そのため: • `x.True` などの式は `SyntaxError` を発生させます。 • 他の文脈では構文上問題がないにもかかわらず、これらに直接代入または削除を行うことは `SyntaxError` を引き起こします(例:`__debug__ = 67` または `del __debug__`)。 • オブジェクト上の属性経由でのアクセス(例:`obj.__debug__`)は無効ではありませんが、`builtins` 内のエントリを変更する(`getattr`/`setattr` を通じて)ことは、構文的トークンの挙動には影響しません。 対照的に、`Ellipsis` と `NotImplemented` は通常のビルトイン関数に近い動作を示します: • 代入によってグローバルにシャドウ化されることが可能です(例:`NotImplemented = 67`)。 • `builtins` 内の値を変更してもモジュールレベルでの名前には影響しますが、構文的トークン(`...` または `NotImplemented` という識別子)そのものには変更はありません。 さらに、`__debug__` は通常 `True` ですが、Python を `-O` フラグで実行すると `False` になります。これら 6 つの項目を区別する exact な設計理由、特になぜ 4 つだけが構文的トークンとして特別扱いされ、残りの 2 つは通常のビルトインとして扱われるのかは、現在も不明です。

2026/08/25 22:01

Apple、M6 と M5 Ultra を発表する

## Japanese Translation: 8 月 25 日(2026 年)、カリフォルニア州クアパティーノでアップルは、地域のアートフィシャルインテリジェンスを変革することを目的とした革命的なシリコンチップを発表しました。頭部のイノベーションは、Mac mini 向けの新しい **M6 チップ**であり、画期的な **2 ナノメートル製造プロセス**を特徴としています。このチップは、12 コア CPU(2 つのスーパークコア、4 つのパフォーマンスコア、および 6 つのエフィシェンシーコアから構成)、ニューラルアクセラレータを備えた 12 コア GPU、そして最大 32GB の統一メモリを高速で最大 170GB/s の速度でサポートします。 新しい Mac Studio とペア付けられているのは、アップルの最初のクワッドダイアーキテクチャであり、高度なウルトラフュージョン技術を利用した **M5 Ultra**です。これは、最大 36 コアの CPU コアと最大 80 コアの GPU コアで構成され、1.2TB/s の帯域幅で驚くべき 512GB の統一メモリをサポートする大規模なスケーラビリティを提供します。M5 Ultra は、AI における M3 Ultra に比べて最大 4.5 倍のパーク GPU コンピューティングを提供するため、大きなパフォーマンスの向上が期待されます。両方のチップは、高解像度のビデオ編集や複雑なエージェントワークフローを可能にする先進的なグラフィック機能を備えており、第 3 世代レイトレーシングとハードウェア加速メッシュシェーディングが含まれています。 これらのアップグレードにより、「Apple Intelligence」(2026 年秋の macOS 27 で、Apple Beta Software プログラムを通じて利用可能)がユーザーデバイスの上で完全に動作し、数百億パラメータを持つ最先端 AI モデルをクラウドサーバーに依存せずにホストできるようになります。新しい開発者フレームワークにより、Xcode や Core ML のようなツールを使用して大規模言語モデルのローカルでの微調整が可能となり、英語、中国語、日本語、韓国語を含む複数の言語で利用できる強力なプライバシー重視のオンデバイス AI 計算への決定的なシフトを示しています。

2026/08/25 23:06

OpenAI Jalapeño:Nvidia Blackwell より優れている

## Japanese Translation: OpenAI は、Broadcom との協力による約 16 ヶ月の開発(2024 年中盤から開始)を経て、「Jalapeño」という推論専用の ASIC を発表しました。LLM の推論のためにゼロから設計された Jalapeño は、過剰な特殊化ではなく極限までのハードウェア・ソフトウェアのコデザインと一般化に依存しており、推定的デコードや特定のワークロード調整を必要とせず、あらゆるモデル推論シナリオで高い性能を実現しています。 InferenceX スイートを用いた独立したベンチマーク(Hot Chips で実施)により、Jalapeño はトークン毎ワットあたりで Nvidia、AMD、Google のチップを上回ることが確認されました。TSMC の N3P プロセスで作製され、HBM4 メモリを備えるこのチップは、GPU に見られる固定されたレイテンシを排除するために順序変換コアと L1 キャッシュを採用し、MXFP 数値形式およびウェイト定数型シンタリック配列を用いて性能の急激な低下を防いでいます。OpenAI の独自プログラミング言語「Gluon」は、高効率を実現するために直接永続スレッドにマッピングされたハンドチューニング済みカーネルを可能にしています。 システムアーキテクチャは、CPU ホストラック(「Katsu」、AMD EPYC プロセッサ搭載)と ASIC ラック(「Vindaloo」、トレイあたり 16 チップ)から構成されます。この設計により、ハイブリッド銅線/光ネットワークを活用して最大 2,048 ユニットまで柔軟にグローバルなスケールアップが可能です。2025 年 11 月にタプトアウト(A0 ステッピング)され、初版はすぐにデプロイが可能で、タプトアウト直後にスループットの大幅な向上が実現されています。現在ファブ内にある将来の B0 ステッピングでは、効率性が約 25% 向上しており、Nvidia の Rubin チップに比べて優れた消費電力性能を提供します。生産は 2027 年に段階的に増産され、多くの出力は翌年の後半に期待されており、OpenAI パートナーが信頼性データを収集する期間としては 1 月までとされています。