v8.0.2:PROXYプロトコル実装のセキュリティ修正
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.rb の PUMA_VERSION および VERSION が "8.0.1" から "8.0.2" に更新されています。
まとめ
本リリースはPROXYプロトコルv1の解析ロジックにおけるインジェクションとスプーフィングという2つの脆弱性を修正します。PROXYプロトコルを有効にしている環境では、8.0.2への早期アップデートが推奨されます。