TwistedのHTTP/2の脆弱性、1接続でCPUを使い切らせるおそれと、HTTP/2が有効かの確かめ方・26.10.0への更新(GHSA-vpp8-g58w-m8mp)
GHSA-vpp8-g58w-m8mpPython向けのネットワーク処理フレームワーク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を使い切る
公式アドバイザリとソースから、攻撃の入口と脆弱な処理を並べる。
Twisted 26.4.0以前のtwisted.web
出典 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日
2026年5月11日
10月23日
10月27日
10月30日
11月1日
出典 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・rc2 | 10月23日・10月27日 | 修正済み(リリース候補) | 3.10以上 |
| 26.10.0 | 10月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の公開日から、版ごとの扱いを並べる。
出典 Twisted公式「GHSA-vpp8-g58w-m8mp」(2026-10-23)、PyPI「Twisted」(2026-11-01確認)
05TwistedのHTTP/2が有効かを確かめて、26.10.0へ上げる手順
動いているPython環境で、Twistedとh2・priorityの版を確かめます。「Required-by」に、Twistedを必要としているパッケージ(Daphneなど)が出ます。
ターミナルpython -m pip show twisted h2 priorityTwistedのHTTP/2の処理が有効かを確かめます。Trueなら、TLSで待ち受けるサーバーはHTTP/2を受け付けます。
ターミナルpython -c "from twisted.web.http import H2_ENABLED; print(H2_ENABLED)"外から見て、そのサーバーがHTTP/2で応答するかを確かめます。「2」と出ればHTTP/2です。前段の機器があるときは、Twistedが直接応答しているかを構成と照らし合わせます。
ターミナルcurl -s --http2 -o /dev/null -w "%{http_version}\n" https://<ホスト>:<ポート>/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サーバーを再起動し、動いている環境(コンテナなど)の中でもう一度版を確かめます。
ターミナルdocker exec <コンテナ名> python -m pip show twisted
06すぐに26.10.0へ上げられないとき
07Twisted 26.10.0の修正の効き方
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の関連情報を調べることもできます。

よくある質問
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]
出典・参考資料
- Twisted公式:GHSA-vpp8-g58w-m8mp2026-10-23(日本時間) / 対象(26.4.0以前)、修正(26.10.0rc1)、仕組み、影響、CVSS 3.1 7.5(Twisted)、手順の記載、CVE欄が空欄、回避策の記載がないこと
- Twisted公式:26.10.0リリースノート2026-10-30 / 中止の頻度の制限、CVE-2023-44487との対応、他の6件の修正、Python 3.10に対応する最後の版
- 米CISA:Known Exploited Vulnerabilities Catalog(CVE-2023-44487)2026-10-30版 / HTTP/2(IETF)のKEV追加日2023-10-10
- 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以上)
- Twistedのソース:twisted/web/http.py(26.10.0)2026-11-01確認 / H2_ENABLEDの決まり方、TLSでh2が合意されたときだけHTTP/2に切り替えること
- Twistedのソース:twisted/web/server.py(26.10.0)2026-11-01確認 / H2_ENABLEDのときだけh2を合意の候補に出すこと(Site.acceptableProtocols)
- Twistedのソース:twisted/web/_http2.py(26.10.0)2026-11-01確認 / 中止の上限(1,000回、毎秒33回)とENHANCE_YOUR_CALMでの切断
- Twistedのソース:pyproject.toml(26.10.0)2026-11-01確認 / http2の追加の部品がh2とpriorityであること
- Daphne:README(HTTP/2 Support)2026-11-01確認 / Twisted[tls,http2]とssl:の起動でHTTP/2を扱うこと、起動時の記録
- GitHub Advisory Database:GHSA-vpp8-g58w-m8mp2026-10-30収録(日本時間) / データベースへの収録日、CVE欄が空欄であること
- 修正のプルリクエスト:github.com/twisted/twisted/pull/12749GitHub Advisoryの参考リンク / 修正の内容・経緯
- 修正のコミット:github.com/twisted/twisted/commit/498939422b69d5a75c4b8f81fa7926423dac534dGitHub Advisoryの参考リンク / 修正の内容・経緯
- リリースノート:github.com/twisted/twisted/releases/tag/twisted-26.10.0rc1GitHub Advisoryの参考リンク / 修正の内容・経緯
- NVD:nvd.nist.gov/vuln/detail/cve-2023-44487GitHub Advisoryの参考リンク / 修正の内容・経緯
あわせて読みたい記事
Brotliの脆弱性の確認方法、PythonとNode.jsで対象かを確かめて直す(CVE-2026-111497、コード実行のおそれ)
圧縮形式Brotliの展開処理の脆弱性CVE-2026-111497(HTTP2Shell)は、米CISAが悪用を確認しています。Pythonのbrotli・brotlicffi、Node.jsの同梱版などで、自分の版と構成が対象かを確かめる方法と修正版を、言語ごとに説明します。
Starletteの脆弱性BadHost、Hostヘッダーでパスによる認証の確認を回避されるおそれ。FastAPIを上げても古い版が残る場合の確かめ方
Starletteの脆弱性CVE-2026-48710(BadHost)は、細工したHostヘッダーでrequest.url.pathを偽り、パスで判定するアクセスの確認を回避されるおそれがあります。9月2日にKEVに追加されました。FastAPI・vLLM・LiteLLMの下で古いStarletteが残る例と、間接依存の確かめ方を説明します。
Pillowの脆弱性、olefile入りの環境で細工したFlashPix画像を開くとコード実行のおそれ(CVE-2026-112398、修正は13.0.0)
PythonのPillowの脆弱性CVE-2026-112398は、olefileを入れた環境で細工したFlashPix画像をImage.openで開くと、ヒープの範囲外書き込みで任意のコード実行に至るおそれがあります。対象かの見分け方、13.0.0への更新、すぐ上げられないときの対処を説明します。