FastCGI:30年経った今もリバースプロキシに最適なプロトコル
要約
- FastCGIは30年前のワイヤープロトコルだが、デザイン上の理由からHTTPリバースプロキシにおけるデシンク攻撃やヘッダーインジェクションといったセキュリティ上の落とし穴を回避できる。
主なポイント
- HTTP/1.1のデシンク(リクエストスマグリング)は構造的な欠陥だ。明示的なメッセージフレーミングがないため、プロキシとバックエンドがメッセージ境界を異なって解釈することがある。これにより、最近発覚したDiscordメディアプロキシ脆弱性のような攻撃が成立してしまう。
-
FastCGIはすべてのクライアントヘッダーに
HTTP_というプレフィックスを付与するため、攻撃者がREMOTE_ADDRやX-Real-IPなどの信頼されたプロキシデータと誤認されるヘッダーを注入することが構造上不可能になっている。 -
Goへの移行は最小限の作業で済む。
net/http/fcgiを使ってhttp.Serveをfcgi.Serveに差し替えるだけだ。nginx、Caddy、Apache、HAProxy はいずれも1行の設定変更でFastCGIバックエンドをサポートする。 - HTTP/2はデシンクを解決するが、ヘッダー信頼の分離は解決しない。また、nginxがHTTP/2バックエンドをサポートしたのは2025年末のことで、Apacheのサポートはいまだ実験的段階だ。
- FastCGIはWebSocketをサポートしておらず、ベンチマークではいくらかスループットの低下が見られる。これはプロトコルのオーバーヘッドではなく、最適化が不十分なコードパスに起因するとされている。
Hacker News コメント欄
- 現時点では実質的なHNの議論はない。
英語版: FastCGI: 30 Years Old and Still the Better Protocol for Reverse Proxies · Original source