TwistedのHTTP/2の脆弱性、1接続でCPUを使い切らせるおそれと、HTTP/2が有効かの確かめ方・26.10.0への更新(GHSA-vpp8-g58w-m8mp)

公開 2026-11-01公表 2026-10-23更新 2026-11-01資料確認 2026-11-01Pythonの脆弱性 233件のまとめ
対象製品Twisted HTTP/2
識別番号GHSA-vpp8-g58w-m8mp
影響範囲26.4.0以前・HTTP/2サーバー(h2が入りTLSで待ち受ける場合)
修正情報26.10.0(Python 3.10以上)

Python向けのネットワーク処理フレームワークTwistedのHTTP/2サーバーに、認証なしの1接続でCPUを使い切らせる脆弱性(GHSA-vpp8-g58w-m8mp)が、2026年10月23日(日本時間)にTwistedから公表されました。対象は26.4.0以前で、10月30日に修正を含む正式版26.10.0が出ています。TwistedのHTTP/2は、追加の部品とTLSがそろったときだけ動くので、まず自分の環境で有効かを確かめます。

2026-11-01更新:正式版26.10.0の公開(10月30日)を受けて、修正版・要点・手順・よくある質問を更新しました。リリースノートでCVE-2023-44487と結び付けられたことと、KEVとの関係を追記しました。

2026-11-01更新:記事の型を解説に改め、HTTP/2が有効になる条件(h2とTLS)と確かめ方、26.10.0の修正の効き方、CVE番号の扱い、Python 3.9の環境での注意を書き足しました。

この記事の要点
  • 対象は26.4.0以前のtwisted.webのHTTP/2サーバーで、推奨する版は26.10.0です。26.10.0はPython 3.10以上が必要です。
  • HTTP/2が動くのは、h2とpriorityが入っていて(twisted[http2])、TLSでHTTP/2が合意された接続だけです。H2_ENABLEDの値で確かめられます。
  • アドバイザリのCVE欄は空欄で、リリースノートはHTTP/2 Rapid Reset(CVE-2023-44487)として載せています。2023年の同じ番号の別の製品の件と分けて確かめます。

01TwistedのHTTP/2サーバーで起きること

公式アドバイザリによると、相手がEND_STREAM付きの要求を送った直後にそのストリーム(1つの接続の中の個々の通信)を中止すると、Twistedは中止を処理する前に要求の振り分けと応答の作成を済ませてしまいます。中止されたストリームは同時に扱える数(100)の枠から外れ、中止の頻度を抑える仕組みも無かったため、1つの接続で同じことを繰り返すだけで、わずかな通信量でCPUの1コアを使い切らせることができます。[1]

影響はサービス停止(DoS)で、情報の漏えいや改ざん、コードの実行は無いとされています。深刻度は、Twistedの評価でCVSS 3.1の7.5(重要)です。2019年に直したHTTP/2の大量送信の問題(GHSA-32gv-6cf3-wcmq)の修正は、この経路を防いでいません。[1]

要求の直後の中止を1接続で繰り返すと、TwistedのHTTP/2サーバーがCPUを使い切る

公式アドバイザリとソースから、攻撃の入口と脆弱な処理を並べる。

認証のない相手END_STREAM付きの要求を送った直後に、そのストリームを中止する
TLSでHTTP/2を合意した接続

Twisted 26.4.0以前のtwisted.web

HTTP/2サーバーh2とpriorityが入りH2_ENABLEDがTrueのときだけ動く
中止の前に処理を済ませる要求の振り分けと応答の作成を先に行う
枠と制限の抜け中止したストリームは同時の数(100)の枠から外れ、中止の頻度の制限も無い
繰り返すだけで
CPUの1コアを使い切るわずかな通信量でサービス停止(DoS)になる
起きないこと
漏えい・改ざん・コード実行アドバイザリは無いとしている

出典 Twisted公式「GHSA-vpp8-g58w-m8mp」(2026-10-23)、Twistedのソース「twisted/web/http.py」(26.10.0)

02TwistedでHTTP/2が有効になる条件

アドバイザリの対象はtwisted.webのHTTP/2サーバーです。ソースを見ると、HTTP/2の処理は追加の部品h2とpriority(twisted[http2]で入る)が読み込めたときだけ有効になり(H2_ENABLED)、そのときだけTLSの合意の候補にHTTP/2を出します。HTTP/2に切り替わるのは、TLSの接続でHTTP/2が合意されたときだけで、それ以外はHTTP/1.1で処理します。[1][5][6][8]

確かめることHTTP/2が動くHTTP/2が動かない
h2とpriority入っている(H2_ENABLEDがTrue)入っていない
待ち受けの方式TLS(ssl:など)平文のTCP(tcp:など)
前段の機器無い、またはTLSをそのまま通す前段がTLSを終端し、HTTP/1.1で渡す

3行目は、ソースから見た当社の整理です。DjangoのASGIサーバーDaphneは、Twisted[tls,http2]を入れてssl:で起動するとHTTP/2を扱い、起動時に「HTTP/2 support enabled」と記録します。[9]

03TwistedのHTTP/2の脆弱性の悪用の状況

米CISAのKEVには、この攻撃の型であるHTTP/2の仕様の番号CVE-2023-44487が、2023年10月10日から載っています。2023年に実際の攻撃で使われた型です。Twistedのこの不具合そのものが悪用されたという記載は、11月1日の確認時点でTwistedのアドバイザリにもKEVにもありません。この件はCVEの番号が付いていないため、今後30日に悪用される見込みの推定(EPSS)もありません。[1][3]

アドバイザリには、攻撃の手順が文章で書かれています(コードは載っていません)。攻撃の型はよく知られているので、HTTP/2を外部に公開しているなら早めに更新します。[1]

攻撃の型は2023年からKEVに載り、Twistedは10月30日に正式版で直した

KEV、アドバイザリ、PyPIの公開日から、日付のある出来事を並べる。

Twisted 米CISA・GitHub

2023年10月10日

HTTP/2の仕様の番号CVE-2023-44487がKEVに2023年に実際の攻撃で使われた型

2026年5月11日

26.4.0を公開この件の対象になる版

10月23日

アドバイザリを公表し、26.10.0rc1で修正攻撃の手順が文章で書かれている
7.5CVSS 3.1(Twistedの評価)

10月27日

26.10.0rc2を公開

10月30日

正式版26.10.0を公開他に6件の脆弱性の修正も入る。同じ日にGitHub Advisory Databaseに収録

11月1日

この不具合の悪用の記載は無いアドバイザリにもKEVにも無い

出典 Twisted公式「GHSA-vpp8-g58w-m8mp」(2026-10-23)、Twisted公式「26.10.0リリースノート」(2026-10-30)、米CISA「Known Exploited Vulnerabilities Catalog」(2026-10-30版)

04Twistedの対象と推奨する版

推奨する版は、Twistedのアドバイザリ(26.4.0以前が対象、26.10.0rc1で修正)と、PyPIに公開済みの版から出しました(11月1日確認)。上げる前に、リリースノートで変更点を確かめてください。[1][2][4]

版PyPIへの公開(日本時間)この件必要なPython
26.4.0以前26.4.0は2026年5月11日対象3.9.12以上(26.4.0)
26.10.0rc1・rc210月23日・10月27日修正済み(リリース候補)3.10以上
26.10.010月30日修正済み(推奨)3.10以上

26.10.0には、他に6件の脆弱性の修正も入っています。リリースノートは、26.10.0がPython 3.10に対応する最後の版だとしています。Python 3.9で使える修正済みの版は無いので、3.9の環境ではPythonから上げます。[2][4][10]

推奨する版は26.10.0で、Python 3.10以上が必要

アドバイザリとPyPIの公開日から、版ごとの扱いを並べる。

26.4.0以前
この件対象
PyPIへの公開26.4.0は2026年5月11日
必要なPython3.9.12以上(26.4.0)
26.10.0rc1・rc2リリース候補
この件修正済み
PyPIへの公開10月23日・10月27日
必要なPython3.10以上
26.10.0推奨
この件修正済み
PyPIへの公開10月30日
必要なPython3.10以上
だから Python 3.9で使える修正済みの版は無いので、3.9の環境はPythonから上げる。

出典 Twisted公式「GHSA-vpp8-g58w-m8mp」(2026-10-23)、PyPI「Twisted」(2026-11-01確認)

05TwistedのHTTP/2が有効かを確かめて、26.10.0へ上げる手順

  1. 動いているPython環境で、Twistedとh2・priorityの版を確かめます。「Required-by」に、Twistedを必要としているパッケージ(Daphneなど)が出ます。

    ターミナル
    python -m pip show twisted h2 priority
  2. TwistedのHTTP/2の処理が有効かを確かめます。Trueなら、TLSで待ち受けるサーバーはHTTP/2を受け付けます。

    ターミナル
    python -c "from twisted.web.http import H2_ENABLED; print(H2_ENABLED)"
  3. 外から見て、そのサーバーがHTTP/2で応答するかを確かめます。「2」と出ればHTTP/2です。前段の機器があるときは、Twistedが直接応答しているかを構成と照らし合わせます。

    ターミナル
    curl -s --http2 -o /dev/null -w "%{http_version}\n" https://<ホスト>:<ポート>/
  4. Pythonの版を確かめ、3.10以上なら26.10.0以上に上げます。ロックファイルに古い版が固定されていないかも確かめ、使っている場合はロックファイルも更新します。

    ターミナル
    python --version
    python -m pip install --upgrade "twisted>=26.10.0"
    grep -i -n "twisted" requirements*.txt poetry.lock uv.lock
  5. サーバーを再起動し、動いている環境(コンテナなど)の中でもう一度版を確かめます。

    ターミナル
    docker exec <コンテナ名> python -m pip show twisted

06すぐに26.10.0へ上げられないとき

公式のアドバイザリに回避策の記載はありません。条件から見ると、HTTP/2を使わない環境は影響の経路から外れます。h2が読み込めなければTwistedはHTTP/2を候補に出さず、HTTP/1.1だけで処理します。Daphneならhttp2の追加の部品を入れない形に戻します。これらはソースから見た当社の整理で、提供元が示した回避策ではありません。[5][6]

h2は他のパッケージ(HTTP/2を使うクライアントなど)が必要としていることもあるので、外す前にpip show h2の「Required-by」を確かめます。

07Twisted 26.10.0の修正の効き方

26.10.0では、相手がストリームを中止する頻度に上限が付きました。ソースでは、中止は一度に1,000回まで、その後は毎秒33回ずつ回復し、使い切った接続はENHANCE_YOUR_CALMの理由を付けて切断します。設定を変えなくても初期設定で効きます。上限の値は名前が_で始まる内部の値で、設定項目としては公開されていません。[2][7]

08CVE-2023-44487の番号と、この件の関係

Twistedのアドバイザリと、GitHub Advisory Database(日本時間10月30日に収録)のCVE欄は空欄です。一方で26.10.0のリリースノートは、この件を「CVE-2023-44487 (GHSA-vpp8-g58w-m8mp)」として載せています。CVE-2023-44487は2023年に多くの製品で同時に公表されたHTTP/2の仕様の番号です。[1][2][10]

このため、CVEの番号で照らし合わせる脆弱性スキャナーでは、2023年の他の製品の件と混ざったり、番号の無い件として出たりします。Twistedについては、GHSAの番号とTwistedの版で判断します(当社の整理)。

脆弱性の公表・更新一覧で、Pythonの関連情報を調べることもできます。

緊急の場合AI攻撃リスク即点検サービス公開情報と、契約後すぐに用意できるアクセスの記録から先に調べ、被害や狙われやすい構成がないかを早く確かめます。

よくある質問

ScrapyなどでTwistedをクライアントとして使っています。対象ですか?

アドバイザリの対象はHTTP/2サーバーで、クライアントとしての使い方の記載はありません。ただ26.10.0には他の6件の修正も入っているので、使っている機能をリリースノートで確かめます。[1][2]

26.10.0rc1を入れていれば足りますか?

この件の修正はrc1から入っています。ただrc1はリリース候補で、正式版の26.10.0にはrc1の後の修正も入っています。正式版に上げます。[1][2]

CVE-2023-44487の対策は2023年に済ませました。それでも上げますか?

2023年の対策が前段の機器や他の製品のものなら、Twisted自身は直っていません。TwistedがHTTP/2を直接処理しているなら、26.10.0に上げます。[2]

Python 3.9のまま直す方法はありますか?

修正を含む版はどれもPython 3.10以上が必要で、3.9で使える修正版はありません。Pythonを上げるまでは、HTTP/2を使わない形にするかを検討します。[4]

出典・参考資料

  1. Twisted公式:GHSA-vpp8-g58w-m8mp2026-10-23(日本時間) / 対象(26.4.0以前)、修正(26.10.0rc1)、仕組み、影響、CVSS 3.1 7.5(Twisted)、手順の記載、CVE欄が空欄、回避策の記載がないこと
  2. Twisted公式:26.10.0リリースノート2026-10-30 / 中止の頻度の制限、CVE-2023-44487との対応、他の6件の修正、Python 3.10に対応する最後の版
  3. 米CISA:Known Exploited Vulnerabilities Catalog(CVE-2023-44487)2026-10-30版 / HTTP/2(IETF)のKEV追加日2023-10-10
  4. PyPI:Twisted(版ごとの公開日時と必要なPython)2026-11-01確認 / 26.4.0・26.10.0rc1・rc2・26.10.0の公開日時、requires_python(26.4.0は3.9.12以上、26.10.0系は3.10以上)
  5. Twistedのソース:twisted/web/http.py(26.10.0)2026-11-01確認 / H2_ENABLEDの決まり方、TLSでh2が合意されたときだけHTTP/2に切り替えること
  6. Twistedのソース:twisted/web/server.py(26.10.0)2026-11-01確認 / H2_ENABLEDのときだけh2を合意の候補に出すこと(Site.acceptableProtocols)
  7. Twistedのソース:twisted/web/_http2.py(26.10.0)2026-11-01確認 / 中止の上限(1,000回、毎秒33回)とENHANCE_YOUR_CALMでの切断
  8. Twistedのソース:pyproject.toml(26.10.0)2026-11-01確認 / http2の追加の部品がh2とpriorityであること
  9. Daphne:README(HTTP/2 Support)2026-11-01確認 / Twisted[tls,http2]とssl:の起動でHTTP/2を扱うこと、起動時の記録
  10. GitHub Advisory Database:GHSA-vpp8-g58w-m8mp2026-10-30収録(日本時間) / データベースへの収録日、CVE欄が空欄であること
  11. 修正のプルリクエスト:github.com/twisted/twisted/pull/12749GitHub Advisoryの参考リンク / 修正の内容・経緯
  12. 修正のコミット:github.com/twisted/twisted/commit/498939422b69d5a75c4b8f81fa7926423dac534dGitHub Advisoryの参考リンク / 修正の内容・経緯
  13. リリースノート:github.com/twisted/twisted/releases/tag/twisted-26.10.0rc1GitHub Advisoryの参考リンク / 修正の内容・経緯
  14. NVD:nvd.nist.gov/vuln/detail/cve-2023-44487GitHub Advisoryの参考リンク / 修正の内容・経緯

あわせて読みたい記事

Python公表 2026-10-22

Brotliの脆弱性の確認方法、PythonとNode.jsで対象かを確かめて直す(CVE-2026-111497、コード実行のおそれ)

圧縮形式Brotliの展開処理の脆弱性CVE-2026-111497(HTTP2Shell)は、米CISAが悪用を確認しています。Pythonのbrotli・brotlicffi、Node.jsの同梱版などで、自分の版と構成が対象かを確かめる方法と修正版を、言語ごとに説明します。

Python公表 2026-05-22

Starletteの脆弱性BadHost、Hostヘッダーでパスによる認証の確認を回避されるおそれ。FastAPIを上げても古い版が残る場合の確かめ方

Starletteの脆弱性CVE-2026-48710(BadHost)は、細工したHostヘッダーでrequest.url.pathを偽り、パスで判定するアクセスの確認を回避されるおそれがあります。9月2日にKEVに追加されました。FastAPI・vLLM・LiteLLMの下で古いStarletteが残る例と、間接依存の確かめ方を説明します。

Python公表 2026-10-18

Pillowの脆弱性、olefile入りの環境で細工したFlashPix画像を開くとコード実行のおそれ(CVE-2026-112398、修正は13.0.0)

PythonのPillowの脆弱性CVE-2026-112398は、olefileを入れた環境で細工したFlashPix画像をImage.openで開くと、ヒープの範囲外書き込みで任意のコード実行に至るおそれがあります。対象かの見分け方、13.0.0への更新、すぐ上げられないときの対処を説明します。