Puma 8.0.2:PROXYプロトコル処理の2つのセキュリティ修正
次期リリースのPuma 8.0.2には、PROXYプロトコルv1の処理に関する2件のセキュリティ修正が含まれる予定です。インジェクション攻撃とkeep-alive接続でのスプーフィング攻撃を防ぐ、いずれも重要な修正です。
背景
PROXYプロトコルは、ロードバランサーやリバースプロキシがバックエンドサーバーにクライアントのIPアドレス等の接続情報を伝達するためのプロトコルです。Pumaはこのプロトコルをサポートしており、接続確立時にヘッダーを解析してリクエスト元の情報を取得します。今回の修正(#3944)は、このヘッダー解析ロジックに存在した2つの脆弱性に対処するものです。
技術的な変更
今回のリリースには2つの独立したバグ修正が含まれており、いずれも#3944でNate Berkopecによって実装されています。
1つ目の修正は、PROXYプロトコルv1のヘッダーを検証する正規表現に関するものです。従来の正規表現は文字列の先頭にアンカーされておらず、最大行長の制限もありませんでした。修正後は正規表現を文字列の先頭に固定し(アンカー)、最大行長を強制することで、細工されたリクエストボディを通じたインジェクション攻撃の経路を遮断します。
2つ目の修正は、keep-alive接続におけるPROXYプロトコルヘッダーの解析タイミングに関するものです。修正後は1接続につき最初のリクエストのみでPROXYヘッダーを解析するよう変更されており、keep-alive接続を通じた後続リクエストへのヘッダー注入によるスプーフィングを防ぎます。
バージョン定数は lib/puma/const.rb 内の PUMA_VERSION および VERSION が "8.0.1" から "8.0.2" に更新される予定です。
まとめ
今回の2件の修正はいずれも、PROXYプロトコル実装における入力検証の不備を是正するものです。PROXYプロトコルを有効にしている環境では、8.0.2のリリース後に更新を検討してください。