CPython ssl が侵害済み証明書を許可、悪用確認は未公表
CPython の ssl モジュールが、すでに侵害されたと分かっている中間証明書を、失効確認の設定がなければ受け入れてしまう問題です。CPython 3.16.0 以下が対象で、Python から TLS で外部と通信するシステムに影響します。実際の悪用が確認されたとの情報は現時点で明らかになっていないため、自社の Python の版を洗い出し、修正版の公表を確認して更新する準備を進めてください。
急ぎ度: 早めに
CVSS v4は9.4で深刻度は高い一方、実際の攻撃での悪用や悪用される見込みを示す情報は公表されておらず、悪用には通信経路への介在など追加の条件も要るため、至急ではなく計画的な更新を前倒しする水準と判断します。
関係があるか
Python(CPython)のsslモジュールでHTTPSなどのTLS通信を行うアプリケーション、バッチ、運用ツールを持つ組織が対象です。社内ツールから外部APIやSaaSに接続している環境、Pythonを同梱した製品やコンテナイメージを使っている環境も確認が必要です。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| CPython(Python Software Foundation) | 3.16.0以下 | 修正版の版番号は現時点で明らかになっていません。Pythonのセキュリティ告知で確認してください。 |
確かめ方
- 1サーバー、開発端末、コンテナイメージ、仮想環境(venv)ごとにPythonの版を確認し、3.16.0以下のものを一覧にします。
- 2OS標準のPythonだけでなく、アプリケーションに同梱されたPythonや、業務ツール・運用製品が内部で持つPythonもないか確認します。
- 3sslモジュールを直接使っていなくても、urllib、http.client、それらを土台にしたHTTPクライアントライブラリ経由でTLS通信をしていないか、主要な処理を洗い出します。
- 4LinuxディストリビューションのPythonパッケージを使っている場合は、各ディストリビューションのセキュリティ情報で対応状況を確認します。
何が起きたか
インターネット上の通信では、相手のサーバーが本物かどうかを「証明書」で確かめます。この証明書は、認証局(CA)から中間証明書を経て発行される連鎖でできています。この途中にある中間証明書が漏えいや不正利用で侵害されると、攻撃者が本物そっくりの証明書を作れてしまいます。通常は「失効」という仕組みで無効にしますが、Pythonでは失効確認を設定していない環境が多く、侵害が分かっていても受け入れてしまう状態でした。紛失届が出た社員証を、入口の機械が確認せずに通してしまう状況に近いものです。
Pythonはこれに対し、侵害されたと分かっている証明書の拒否リスト(denylist)をsslモジュールに追加しました。リストにある証明書は、SSLContext の検証ポリシーの設定にかかわらず自動的に拒否されます。失効確認を設定していないユーザーも守る狙いです。
分類はCWE-299(証明書の失効確認の不備)です。CVSS v4のベーススコアは9.4のcriticalで、機密性・完全性・可用性への影響が高いと評価されています。どの中間証明書が拒否リストの対象かは、Pythonのセキュリティ告知や関連のIssue、パッチで確認できます。
攻撃の流れ
-
1
証明書の入手
侵害済みの中間証明書を使い、攻撃者が任意のサーバー名の証明書を用意します。
-
2
通信への介在
攻撃者が、利用者のPythonアプリと接続先の間の通信経路に入り込みます。
-
3
検証の通過
対象の版のsslモジュールは、失効確認がなければ侵害済み証明書を有効とみなします。
-
4
なりすまし成立
アプリは偽のサーバーを本物と信じて接続を続けます。
-
5
情報の窃取・改ざん
認証情報やデータが盗み見られたり、通信内容が書き換えられたりするおそれがあります。
どう悪用されるか
CVSS v4のベクターでは、ネットワーク経由(AV:N)で、攻撃の複雑さは低く(AC:L)、事前の権限は不要(PR:N)とされています。利用者の操作は受け身の形で必要(UI:P)とされており、被害者側のアプリが攻撃者の用意した接続先や経路につながる場面が想定されます。一般に、侵害された証明書を悪用するには、通信経路に介在できる位置にいるか、接続先を誘導できる必要があります。
悪用された場合、TLSで守られているはずの通信が、実際には攻撃者に読まれたり書き換えられたりするおそれがあります。APIキー、パスワード、業務データのやり取りや、ソフトウェア更新の取得処理などが影響を受けるおそれがあります。実際にどの程度の被害が出るかは、各システムが何に接続しているかで変わります。
この問題が実際の攻撃で悪用されたとの情報は、現時点で明らかになっていません。
今すぐやること
-
1
使っているPythonの版を洗い出す
サーバー、コンテナ、開発環境、同梱製品を含め、CPython 3.16.0以下を一覧にします。まずは外部の通信先を持つ処理から優先して調べます。
python3 --version -
2
修正版の公表を確認する
Pythonのセキュリティ告知やIssueで、修正を含む版番号と配布状況を確認します。ディストリビューション版のPythonは、各社の告知でパッチ適用済みかどうかを確認します。
-
3
優先順位をつけて更新する
社外のネットワークや信頼できない経路を通る通信を行うシステム、認証情報や機密データを扱うシステムから先に、修正版へ更新します。
-
4
コンテナイメージと同梱製品を作り直す
ベースイメージに古いPythonが含まれている場合は、更新したうえでイメージを再ビルドして再配備します。同梱製品はベンダーの告知を確認します。
-
5
証明書検証を無効にしていないか見直す
検証の無効化(
verify=FalseやCERT_NONEなど)があると、この修正の効果以前に通信が保護されません。見つけたら設定を直します。
すぐ更新できないとき
公式の回避策は現時点で公表されていません。修正版を適用するまでの間は、信頼できないネットワークを経由するPythonの外部通信を減らす、通信先を限定するといった一般的な対策で露出を抑えてください。
背景
PythonのsslモジュールはOpenSSLを土台にしており、標準ライブラリのHTTPクライアントや、それを使う多くのライブラリがTLS通信に利用しています。社内の自動化スクリプト、データ連携、監視ツール、Webアプリのバックエンドなど、業務システムの目立たない部分で使われていることが多く、利用状況を把握しにくい点が管理上の難しさです。
中間証明書や認証局の侵害は、証明書の仕組みでこれまで繰り返し問題になってきた種類の弱点です。失効情報(CRLやOCSP)の確認は、運用の負荷や通信の遅延、取得失敗時の扱いなどの理由から、クライアント側で有効になっていないことが少なくありません。そのため、ブラウザやOSが拒否リストを配布して対処する例があります。今回のPythonの対応も、失効確認の設定に頼らず、侵害が分かっている証明書をあらかじめ拒否する考え方です。
よくある質問
Q.自社のPythonが3.16.0より新しければ安全ですか。
Q.失効確認(CRLやOCSP)を設定していれば問題ありませんか。
Q.すでに悪用されているのですか。
まだ分かっていないこと
- 修正を含む版番号と各ディストリビューションでの提供時期は、現時点で明らかになっていません。
- 実際の攻撃で悪用された事例や、悪用される見込みを示す情報は公表されていません。
- 拒否リストの対象となる証明書の詳細や影響範囲は、Pythonの告知と関連Issueで確認する必要があります。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| Python Software Foundation | CPython |
3.11.18 未満 3.12.0 以上 3.12.16 未満 3.13.0 以上 3.13.18 未満 3.14.0a1 以上 3.16.0 未満 |
3.11.18 3.12.16 3.13.18 3.16.0 |
ディストリビューション別の修正状況
各ディストリビューションが公開している、この CVE の修正パッケージ
- Debian DEBIAN-CVE-2026-115557 python3.11
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Python has added a denylist for known compromised certificates to the "ssl" module to ensure user safety even without certificate revocation configured. Known compromised certificates will automatically be rejected regardless of the SSLContext policy configuration.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory emudhra.we-have-a-problem.com
- advisory mail.python.org
- advisory nvd.nist.gov
- advisory github.com
- package github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- report github.com
- web openwall.com
- web emudhra.we-have-a-problem.com
- web mail.python.org
- web github.com
- web openwall.com