はじめに
先日セキュリティについて勉強していたところ、知らない言葉が多く出てきたので簡単にまとめます。
HTTPパラメータ汚染(HTTP Parameter Pollution)
概要
HTTPパラメータ汚染(HPP)は、同一のパラメータ名を複数回送信することで、サーバ側の処理を混乱させる攻撃手法です。
仕組み
- 同一のパラメータ名を複数回送信する
- サーバ側で最初のパラメータの値を保持しつつ、後続のパラメータを無視する
- 結果として、意図しない動作や情報漏洩が発生する
対策方法
- 同一のパラメータ名を複数回送信しない
- サーバ側で受け取ったパラメータを厳密に検証する
- 不要なパラメータは削除する
リクエストスマグリング
リクエストスマグリングとは
リクエストスマグリング攻撃は、フロントエンドのプロキシサーバ(ロードバランサーなど)とバックエンドサーバの間で、HTTPリクエストの境界認識に差異がある場合に発生する攻撃です。
攻撃の仕組み
HTTP/1.1では、リクエストの長さを指定する方法が2つあります:
- Content-Length: バイト数で指定
- Transfer-Encoding: チャンク形式で指定
この2つが同時に存在する場合、サーバによって優先度が異なります💀
フロントエンドサーバの解釈:
-
Transfer-Encoding: chunked
を優先 -
0
でチャンクが終了と判断 - 残りの部分を次のリクエストとして処理
バックエンドサーバの解釈:
-
Content-Length: 44
を優先 - 44バイト全体を1つのリクエストとして処理
対策方法
- フロントエンドとバックエンドでHTTPリクエストの処理を統一する
- バックエンドのサーバーとの通信に HTTP/2 を利用する
まとめ
今回紹介した2つの脆弱性は、いずれも「入力データの処理」に関わる重要なセキュリティ課題です
共通の対策原則
- 入力バリデーション: すべての入力データを厳密に検証
- ホワイトリスト方式: 許可されたデータのみを処理
- 複数層での防御: フロントエンド・バックエンドの両方で対策
- 安全なライブラリの使用: 実績のあるセキュリティライブラリを活用
- 定期的なセキュリティテスト: ペネトレーションテストや脆弱性スキャンの実施