v8.0.2:PROXYプロトコル実装のセキュリティ修正

puma/puma

Puma 8.0.2では、PROXYプロトコルv1の処理に起因する2つのセキュリティ上の問題が修正されました。細工されたリクエストによるインジェクションと、keep-alive接続でのヘッダースプーフィングがそれぞれ対処されています。

背景

PumaはTCPロードバランサー(AWS ELBなど)と連携する際に、クライアントの実IPアドレスを伝達する PROXYプロトコル を利用します。PROXYプロトコルv1はテキストベースの1行ヘッダーで、TCP接続の先頭に付加される仕様です。今回の #3944 で報告・修正された問題は、このヘッダー解析ロジックの不備に起因します。

技術的な変更

今回の修正は #3944 で実施された2点のバグフィックスを含み、History.md とバージョン定数 const.rb の更新を伴うリリースです。

修正1: PROXYプロトコルv1の正規表現にアンカーと最大行長の制限を追加

従来の正規表現はPROXYヘッダーの文字列先頭への一致を強制しておらず、またマッチ対象の行長に上限が設けられていませんでした。この不備により、細工されたリクエストボディにPROXYヘッダー形式の文字列を埋め込むことで、解析処理にインジェクションを行える可能性がありました。修正では正規表現を文字列先頭に アンカー し、さらに最大行長を超える入力を拒否するよう制限が加えられています。

修正2: PROXYプロトコルヘッダーの解析を1接続につき最初の1リクエストのみに限定

HTTP/1.1の keep-alive接続 では、1つのTCP接続上で複数のHTTPリクエストがやり取りされます。従来の実装では各リクエストの先頭でPROXYヘッダーの解析を試みていたため、攻撃者が後続リクエストにPROXYヘッダー形式のデータを送り込むことで、接続元IPアドレスを偽装(スプーフィング)できる恐れがありました。修正後は1接続の最初のリクエスト処理時のみヘッダーを解析し、以降のリクエストでは再解析を行わない実装に変更されています。

バージョン定数についても、lib/puma/const.rbPUMA_VERSION および VERSION"8.0.1" から "8.0.2" に更新されています。

まとめ

本リリースはPROXYプロトコルv1の解析ロジックにおけるインジェクションとスプーフィングという2つの脆弱性を修正します。PROXYプロトコルを有効にしている環境では、8.0.2への早期アップデートが推奨されます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
582bb908

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
3回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→背景・技術的な変更(各論)→まとめ(結論)という「総論→各論→結論」の構成が明確で、読者が内容を理解しやすい構造になっています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

PR番号へのリンク記法([#3944](URL))が正しく使用されています。記事内にコードブロックがないため、シンタックスハイライトの評価は対象外ですが、問題は見られません。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

「PROXYプロトコル」「インジェクション」「スプーフィング」「keep-alive接続」といった専門用語を前提知識として扱っており、専門家であるエンジニア読者に対して適切なレベルで記述されています。

パラグラフ・ライティング ⚠ WARNING

トピックセンテンス・1段落1トピック・段落長

ほとんどの段落でトピックセンテンスが先頭にあり構成は良好ですが、「技術的な変更」セクションの「修正2」に関する説明が3つのパラグラフに細かく分割されすぎています。関連する内容のため、1つにまとめる方がより論理的です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事の説明は`History.md`のDiff内容を正確に反映しています。正規表現のアンカーと行長制限、初回リクエストのみの解析という2つの修正点を、Diffの記述通りに解説できています。バージョン定数の変更にも言及しており、正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「PROXYプロトコル」「インジェクション」「ヘッダースプーフィング」「アンカー」「keep-alive接続」などの技術用語を、文脈に沿って正確に使用できています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

Diffに記載された修正内容から、その背景にある脆弱性(インジェクション、スプーフィング)のメカニズムを論理的に説明できており、技術的に正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の主張はすべてPRのDiff(特に`History.md`)で裏付けられており、ハルシネーション(捏造)は見られません。PROXYプロトコルの一般的な説明は、文脈を補うための妥当な範囲です。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

バージョン番号(8.0.2)、PR番号(#3944, #3945)が、提供された情報と正確に一致しています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

PRタイトルは「v8.0.2」とシンプルですが、記事タイトル「v8.0.2:PROXYプロトコル実装のセキュリティ修正」は、Diffから読み取れるPRの核心的な内容を的確に要約しており、非常に優れています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事にはPR情報に基づかない外部知識(LTS、EOLなど)の追加はなく、ルールを遵守しています。PROXYプロトコルの一般的な説明は、記事の理解を助けるための適切な補足です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「修正されました」「対処されています」といった過去形の表現は、リリース済みのバージョンに関する記述として適切です。時間表現の歪曲はありません。