30年前のFastCGIがHTTPより優れたリバースプロキシプロトコルである理由
原題: FastCGI: 30 years old and still the better protocol for reverse proxies
なぜ重要か
HTTPプロキシの脆弱性問題を根本的に解決する30年前の技術が再評価されており、セキュリティ強化の新たな選択肢となる。
FastCGIプロトコルが1996年から提供する明確なメッセージ境界により、HTTPリバースプロキシでよく発生するdesync攻撃やリクエストスマグリング脆弱性を回避できる。GoやPython等の実装も簡単で、Apache、nginx、Caddy、HAProxyなど主要プロキシがサポートしている。
HTTPリバースプロキシは脆弱性の温床となっている。最近もDiscordのメディアプロキシでdesync脆弱性が発見され、プライベート添付ファイルの盗聴が可能になった。問題の根本原因は、リバースプロキシとバックエンド間の通信にHTTPプロトコルが広く使用されていることだ。
HTTP/1.1は表面的にはシンプルに見えるが、実際には堅牢な解析が困難なプロトコルである。同一のHTTPメッセージを表現する方法が複数あり、エッジケースや曖昧性が多すぎて、実装間で一貫した処理ができない。最も深刻な問題は、HTTPメッセージに明示的なフレーミングがないことで、メッセージ自体が終了位置を記述する仕組みになっている。これにより実装間でメッセージ境界の認識が異なり、HTTP desync攻撃やリクエストスマグリング攻撃の基盤となる。
一方、1996年にリリースされたFastCGIプロトコルは、メッセージ境界を明確に定義することでこれらの問題を回避する。FastCGIはプロセスモデルではなくワイヤープロトコルとして使用でき、Goではnet/http/fcgiパッケージを使ってhttp.Serveをfcgi.Serveに置き換えるだけで実装できる。Apache、Caddy、nginx、HAProxyなど主要なプロキシがFastCGIバックエンドをサポートしており、設定も簡単だ。