HTTP/3 脆弱性「Header Accordions」を、FoxIO の Sébastien Féry 氏が2026年10月20日に公表した。HTTP/3 のヘッダー圧縮 QPACK で、展開した後のヘッダーの大きさに上限が効いていない実装があり、認証の要らない遠隔のクライアントが、送った量よりはるかに大きいメモリをサーバーに使わせられる。既定設定のサーバーが1接続でメモリ不足や応答不能になりうる。本記事は防御側の情報に絞り、影響を受ける実装と直った版、まだ直っていない実装の当面の手当て、自分の環境の版の確かめ方を、各リポジトリのタグと公開アドバイザリで 2026-10-22 に確かめた結果でまとめる。

FIXED OR NOT直った版の有無

直った版が出た実装と、まだの実装

修正版あり

この版以上に上げる

  • quic-go 0.57.0(推奨 0.59.1)
  • Cloudflare quiche 0.29.3
  • lsquic 4.9.0
  • Wireshark 4.6.2 / 4.4.12

安定版に修正なし

2026-10-22 時点

  • Bun 1.4.3(main に修正の変更)
  • h3 0.0.8(上限の既定値なし)
  • aioquic 1.7.0
  • mitmproxy 12.3.0(aioquic 1.2.0)
出典: FoxIO(2026-10-20)・GitHub Advisory Database・各リポジトリのタグとリリース(2026-10-22確認)

30秒でわかる Header Accordions(2026-10-22時点)

  • ・何が起きる:小さな圧縮ヘッダーが、展開後に大きなメモリを使わせる。HTTP/3 を受け付けるサーバーが1接続で止まりうる
  • ・直った:quic-go 0.57.0(同種の後続の件まで含めると 0.59.1)・Cloudflare quiche 0.29.3・lsquic 4.9.0・Wireshark 4.6.2/4.4.12
  • ・安定版に修正なし:Bun 1.4.3・h3 0.0.8・aioquic 1.7.0・mitmproxy 12.3.0
  • ・影響なし(FoxIO):IIS(http.sys)・Envoy・ngtcp2/nghttp3・Google quiche

まずやること

  • ・自分で上げられる:Caddy は v2.11.3 以上、Traefik は v2.11.49/v3.6.20/v3.7.4 以上、Go のアプリは quic-go 0.59.1 以上
  • ・修正版が無い:Bun の HTTP/3 サーバーは外に出さない。mitmproxy は --set http3=false。Rust の h3 は max_field_section_size を設定する
  • ・配布元に任せる:OS のパッケージや製品に組み込まれた版は、配布元の告知を待ちつつ go version -m で中身の版を確かめる

依存しているライブラリの穴を追う全体像は、サプライチェーン攻撃とは|手口・防御ツール比較・npm 12の新機構まで実践解説にまとめている。

HTTP/3 脆弱性 Header Accordions の時系列

TIMELINE報告から公表まで

報告から11か月後に公表、3実装は未修正のまま

  1. 2025-11

    FoxIO が報告を始める

    quic-go・Wireshark・quiche へ

  2. 2025-12

    quic-go 0.57.0・Wireshark 4.6.2

    11/21 と 12/3。nghttp3 は文書を更新

  3. 2026-07

    quiche 0.29.3・lsquic 4.9.0

    Bun へは 2026-05 に報告

  4. 2026-10

    20日に FoxIO が公表

    Bun・h3・aioquic は未修正

    公表

出典: FoxIO(2026-10-20)・proxy.golang.org・crates.io・lsquic CHANGELOG・Wireshark リリースノート

FoxIO は 2025年11月から実装ごとに報告し、2026-10-20 に公表した。報告日は FoxIO の公表、修正版の日付は各実装のタグとパッケージの公開日(proxy.golang.org・crates.io・PyPI・npm)で突き合わせた。

日付 出来事
2025-11-09 quic-go に報告
2025-11-14/15 Wireshark/Cloudflare quiche に報告
2025-11-21 quic-go 0.57.0 公開(CVE-2025-64702 の修正)
2025-12-03/05 Wireshark 4.6.2/4.4.12 のタグ(wnpa-sec-2025-07)
2025-12-04 h3(hyperium)に報告。翌日クローズ
2025-12-17 nghttp3 が上限の扱いをドキュメントに明記(PR #445)
2026-05-11 quic-go 0.59.1 公開(トレーラーの同種の件 CVE-2026-40898 の修正)
2026-05-24 Bun に報告
2026-07-13 aioquic・lsquic に報告
2026-07-14/15 quiche 0.29.3/lsquic 4.9.0 公開
2026-10-20 FoxIO が公表
2026-10-21 Bun の main に HTTP/3 のヘッダー上限を強制する変更(安定版は未公開)

何が起きるのか:QPACK で展開した後の大きさに上限が効いていなかった

WHAT WAS NOT COUNTED数えていなかった所

展開後の大きさに上限が効いていなかった

届いた時点の大きさ: 圧縮ヘッダー

展開してから使うもの:

  1. 展開した名前と値の長さ
  2. 項目ごとの管理分(RFC 9114 で加算)
  3. 組み立てたヘッダーが使うメモリ

展開後の大きさで上限を強制する

出典: RFC 9114 §4.2.2・GHSA-g754-hx8w-x2g6(quic-go)をもとに編集部が整理

HTTP/3 はヘッダーを QPACK(RFC 9204)で圧縮して送る。受け手は展開してから名前と値の組を組み立てる。RFC 9114 §4.2.2 はヘッダーの大きさの上限を展開後の大きさで数え、1項目ごとに32バイトを足すと定めている。受け手はこの上限を SETTINGS で相手に伝える。

FoxIO によると、影響を受けた実装は展開後の上限が無いか、数え方が不完全か、上限を当てるのが遅かった。quic-go のアドバイザリでは、同社の実装は圧縮されたフレームの大きさ(サーバーの既定は 1MB)だけを制限し、展開後の大きさを数えていなかった。展開すると圧縮時のおよそ50倍まで膨らみうるという。

入口は HTTP/3 で接続できることだけで、認証は要らない。quic-go のアドバイザリは、ヘッダーの組み立てがサーバーとクライアントで共通のためクライアントも影響を受けるとしている(悪意あるサーバーに接続した場合)。

どんなヘッダーをどう組むと膨らむかは、本記事では書かない。防御側が確かめるのは「展開後の上限が効く版か」と「HTTP/3 の口を外に出しているか」の2点で、どちらも次の表とコマンドで分かる。

DoS攻撃 対策:実装ごとの修正版と、まだ直っていない実装の手当て

実装ごとの状況(2026-10-22 時点)

実装 識別子 直った版 最新 当面の手当て
quic-go(Go) CVE-2025-64702・GHSA-g754-hx8w-x2g6(Moderate) 0.57.0。トレーラーの件は 0.59.1 0.64.1 0.59.1 以上に上げる
Cloudflare quiche(Rust) CVE-2026-12523・GHSA-4fgf-9xrr-88gf 0.29.3 0.30.0 0.29.3 以上に上げる
lsquic(C) CVE なし 4.9.0 4.10.2 4.9.0 以上に上げる
Wireshark CVE-2025-13945・wnpa-sec-2025-07 4.6.2・4.4.12 4.6.16 上げる
Bun なし 安定版に修正なし 1.4.3 HTTP/3 のサーバーを外に出さない
h3(hyperium・Rust) なし 修正なし 0.0.8 max_field_section_size を設定する
aioquic(Python) なし 修正なし 1.7.0 HTTP/3 を外に出さない
mitmproxy なし 修正なし 12.3.0 --set http3=false

quic-go の2件はどちらも Moderate(CVSS 3.1 の基本値 5.3、可用性だけに影響)。quiche 0.29.3 には「qpack: fix size calculation when decoding」と「h3: implement a default for SETTINGS_MAX_FIELD_SECTION_SIZE」のコミットが入っている。lsquic 4.9.0 の CHANGELOG には「Limit number of buffered header sets to cap memory use」とある。

Bun:2026-10-21(米国時間)に main へ入った PR #46392 は、HTTP/3 のヘッダーの大きさを RFC 9114 §4.2.2 の数え方で強制し、サーバーは告知した上限(--max-http-header-size、既定 16KB)を超える要求に 431 を返すと説明している。10-22 時点で安定版 1.4.3(10-10 公開)には入っておらず、公開時刻から見て canary 1.4.3-canary.20261021.1 にも入っていない。PR の説明は FoxIO の報告に触れていない。Bun HTTP/3 サーバー(Bun.serve({ http3: true }))を外に出しているなら、修正入りの版が出るまで HTTP/3 を外す。

h3:crates.io の最新は 0.0.8(2025-05-06)。main の max_field_section_size の既定は VarInt の最大値で、事実上の上限なしのまま(2026-09-20 のコミット時点)。FoxIO によると、メンテナーはアルファ版のライブラリとして既定値を変える予定と答えた。サーバーを組むときに h3::server::builder() の max_field_section_size で、アプリが受け付ける大きさに合った値を入れる(参考までに Bun の HTTP/3 サーバーは既定 16KB)。

aioquic と mitmproxy:aioquic 1.7.0(10-16)の変更履歴に該当する修正は無い。mitmproxy 12.3.0(10-22)も変更履歴に該当する修正が無く、aioquic を 1.2.0 に固定している。mitmproxy HTTP/3 の受け口(http3 オプション)は既定で有効なので、要らなければ --set http3=false で切る。aioquic を使う hypercorn で HTTP/3 を有効にしている場合も、修正が出るまで外に出さない。

Caddy・Traefik・cloudflared は、どの版から直った quic-go を含むか

各プロジェクトのタグの go.mod から quic-go の版を拾った。公式のビルドはこの版で組まれる。

製品 0.57.0 以上を含む最初の版 0.59.1 以上を含む最初の版 最新(10-22)
Caddy v2.11.0(2026-02・0.59.0) v2.11.3(2026-05) v2.11.7(0.63.0)
Traefik v2 v2.11.32(2025-12・0.57.1) v2.11.49(2026-06) v2.11.60(0.59.1)
Traefik v3 v3.6.3(2025-12・0.57.1) v3.6.20・v3.7.4(2026-06) v3.7.16(0.62.0)
cloudflared 2026.8.0(2026-08) 2026.8.0(0.59.1 を基にしたフォーク) 2026.10.3

Caddy は v2.10.2 まで quic-go 0.54.0 以下だった。cloudflared は quic-go を自社のフォークに差し替えており(go.mod の replace)、2026.8.0 から「This fork is based on quic-go v0.59.1」と注記している。2026.10.3 のソースには quic-go の HTTP/3 パッケージを読み込む箇所が無く、quic-go はエッジへのトンネル(QUIC)に使われている。FoxIO は cloudflared を利用先に挙げているが、影響の有無について Cloudflare の告知は確かめられていない。2026.8.0 以上に上げておけば、どちらでも差し支えない。

自分の環境で HTTP/3 脆弱性の影響を確かめるコマンド

確かめるのは版と、HTTP/3 の口が開いているかだけ。攻撃の再現はしない。下の3つのコードブロックは、対象を入れた環境(UDP 443 は待ち受けあり)と、何も入れていない環境の両方で、掲載したまま実行して出力を確かめた(2026-10-22、Linux x86_64、Go 1.24.7・cargo 1.97.0・Python 3.13)。

# Go のモジュール:選ばれている quic-go の版(go.mod のあるディレクトリで)
go list -m github.com/quic-go/quic-go
# ビルド済みの Go バイナリ:中に入っている quic-go の版(例は caddy。traefik・cloudflared も同じ形)
go version -m "$(command -v caddy)" | grep 'quic-go/quic-go'

go list -m は github.com/quic-go/quic-go v0.59.1 のように版を返し、replace で差し替えていれば => の後ろに実際に使う版が出る。依存していなければ not a known dependency で終わる。go version -m は dep github.com/quic-go/quic-go v0.54.0 の行を出す(Caddy v2.10.2 をソースから組んで確かめた)。grep を quic-go だけにすると quic-go/qpack の行も拾うので、quic-go/quic-go で絞る。ソースから組んだ caddy は caddy version が unknown を返したので、版は go version -m で見るほうが確実。

# Bun の版(Bun.serve で http3 を有効にしているかはコードで確かめる)
bun --version
# aioquic と mitmproxy の版(使っている Python 環境で)
python3 -m pip show aioquic mitmproxy 2>/dev/null | grep -E '^(Name|Version)'
# Rust のプロジェクト:h3 と quiche の版(Cargo.toml のあるディレクトリで)
cargo tree -i h3 --depth 0
cargo tree -i quiche --depth 0

mitmproxy 12.3.0 を入れた環境では Version: 12.3.0 と、依存の aioquic の Version: 1.2.0 が並ぶ。cargo tree -i は h3 v0.0.8 のように1行返し、依存に無ければ did not match any packages のエラーになる。

# UDP の 443 番で待ち受けているプロセス(HTTP/3 の口が開いているかの目安)
sudo ss -ulnp 'sport = :443'

この確認で分からないこと

  • ・どれも版と構成の確認で、脆弱性の判定ではない。この結果だけでは安全とは言えない
  • ・古い quic-go が出ても、HTTP/3 を有効にしていなければサーバーとしての入口は無い。ただし HTTP/3 で外へ接続するクライアントの経路は残る
  • ・新しい版番号が出ても、フォークや手を入れた版(cloudflared の replace など)は中身が上流と同じとは限らない
  • ・UDP 443 が空でも別のポートで HTTP/3 を待ち受けていることがあり、開いていても HTTP/3 とは限らない
  • ・最終的な根拠は、上の表の上流の修正版か、配布元が出した修正パッケージの告知

影響範囲:サーバー・クライアント・解析ツール

・HTTP/3 を受け付けるサーバー:影響の中心。1接続でメモリ不足や応答不能になりうる(FoxIO)
・クライアント:quic-go では、悪意あるサーバーに接続したクライアントも影響を受ける(アドバイザリ)。Bun の PR #46392 も fetch の HTTP/3 クライアントに上限を設けている
・Wireshark:止まるのは通信を解析する側。リリースノートの記載は「HTTP3 dissector crash」で、該当する HTTP/3 の通信を解析すると止まる
・影響なし(FoxIO):IIS(http.sys)・Envoy・ngtcp2/nghttp3・Google quiche。nghttp3 は上限を相手に伝えるだけで、強制はアプリ側の責任だとドキュメントに明記した(PR #445)。nghttp3 を直接使うアプリは自分で上限を強制する
・見分け方:FoxIO は自社のスキャナー JA4Scan で、影響を受ける版のサーバーを見分ける指紋を公開している

本件とは別に、nginx の HTTP/3 モジュールにも CVE-2026-42530 が出ている。nginx を使っているなら nginx CVE-2026-42055/42530/48142 解説 で条件と修正版を確かめてほしい。依存ライブラリの脆弱性が一度に複数出たときの直す順番は、npm audit の結果はどれから直すか で到達性から仕分ける手順を書いた。HTTP/3 を外に出していない依存は、後回しにできる側に入る。

参照ソース

・FoxIO: Header Accordions — QPACK Amplification Attacks Against HTTP/3 Servers(2026-10-20)
・GHSA-g754-hx8w-x2g6:quic-go HTTP/3 QPACK Header Expansion DoS(CVE-2025-64702)
・GHSA-vvgj-x9jq-8cj9:quic-go HTTP/3 QPACK Trailer Expansion(CVE-2026-40898)
・GHSA-4fgf-9xrr-88gf:Cloudflare quiche(CVE-2026-12523)
・lsquic CHANGELOG(4.9.0・2026-07-15)
・Wireshark wnpa-sec-2025-07
・oven-sh/bun PR #46392(2026-10-21)
・ngtcp2/nghttp3 PR #445:Clarify field size limits
・mitmproxy CHANGELOG(12.3.0・2026-10-22)
・RFC 9114 §4.2.2 Header Size Constraints・RFC 9204 QPACK