HTTPリクエストスマグリング

HTTPリクエストスマグリング（英:HTTP request smuggling、略称：HRS）は、HTTPプロトコルにおけるセキュリティ脆弱性を利用した攻撃手法である。これは、HTTPプロキシサーバのチェーン内にある複数のHTTPサーバ実装間において、Content-LengthヘッダとTransfer-Encodingヘッダの解釈に不一致があることを利用する。共通脆弱性タイプではCWE-444に分類される。

Transfer-Encodingヘッダは、HTTPリクエストのボディをどのように解釈するかという指示を定義するものであり、この攻撃において一般的かつ不可欠な指示はチャンク形式転送エンコードである。Transfer-Encodingヘッダが存在する場合、Content-Lengthヘッダは省略されることになっている。Content-Lengthヘッダも同様の役割を果たすが、構文が異なり、ヘッダ自体の値としてボディのサイズをバイト単位で指定する。悪意のあるHTTPリクエストにこれら両方のヘッダが含まれている場合、フロントエンドサーバまたはバックエンドサーバがリクエストを誤って解釈することで、不正なクエリを防止するためのセキュリティ機能をバイパスしてしまう脆弱性が発生する。

 種類 

 CL.TE 
このタイプのHTTPリクエストスマグリングでは、フロントエンドがContent-Lengthヘッダを使用してリクエストを処理し、バックエンドがTransfer-Encodingヘッダを使用してリクエストを処理する。攻撃は、リクエストの最初の部分で長さ0のチャンクを宣言することによって行われる。フロントエンドサーバはこれを見てリクエストの最初の部分のみを読み取り、意図せず第2の部分をバックエンドサーバに渡してしまう。バックエンドサーバに渡された第2の部分は、次のリクエストとして扱われて処理され、攻撃者の隠されたリクエストが実行される。

 TE.CL 
このタイプでは、フロントエンドがTransfer-Encodingヘッダを使用してリクエストを処理し、バックエンドがContent-Lengthヘッダを使用して処理する。この攻撃では、攻撃者は悪意のあるリクエストを含む最初のチャンクの有効な長さを宣言し、その後に長さ0の第2のチャンクを宣言する。フロントエンドサーバは長さ0の第2のチャンクを見ると、リクエストが完了したと判断してバックエンドサーバに転送する。しかし、バックエンドサーバはContent-Lengthヘッダを使用して処理するため、最初のチャンクに残された悪意のあるリクエストは、次の一連のリクエストの開始点として扱われるまで未処理のまま残り、その後に実行される。

 TE.TE 
このタイプでは、フロントエンドとバックエンドの両方がTransfer-Encodingヘッダを使用してリクエストを処理するが、一報のサーバのみがヘッダを無視するように、非標準の空白形式や重複ヘッダなどを用いてヘッダを難読化する。難読化の手法としては、「Transfer-Encoding: xchunked」のように不正な文字を追加したり、「Transfer-Encoding」と「: chunked」の間に異常な改行文字を入れたりする形がある。フロントエンドまたはバックエンドのいずれかのサーバが依然としてこれらの難読化されたリクエストを処理する場合、攻撃の残りの部分はCL.TEまたはTE.CL攻撃と同様の仕組みとなる。

 対策 
最も確実な対策は、フロントエンドとバックエンドのサーバがHTTPリクエストを全く同じ方法で解釈することである。しかし、ロードバランサは異なるソフトウェアやプラットフォームで動作するバックエンドサーバをサポートしているため、これは通常、選択肢にはならない。この攻撃のほとんどの変種は、リクエストの長さを決定するために異なる手法を用いるHTTP/2を使用することで防ぐことができる。別の回避策としては、フロントエンドサーバがバックエンドに渡す前にHTTPリクエストを正規化し、確実に同じ解釈がなされるようにすることである。Webアプリケーションファイアウォール（WAF）の設定も有効であり、多くのWAFは攻撃の試みを特定し、疑わしいリクエストをブロックまたはサニタイズする技術を備えている。

Grenfeldtら（2021年）の研究によれば、ほとんどのフロントエンドWebサーバ（プロキシサーバなど）は、バックエンドサーバに対する既知のHRS攻撃を実際に阻止するためのパース機能を提供していることがわかった。Huangら（2022年）は、Flaskを使用して適切なパース機能を実装し、フロントエンドプログラムやWebサーバからのHRS攻撃を防ぐ手法を提案した。

 脚注 

Category:エクスプロイト
Category:HTTP
Category:コンピュータ・ネットワーク・セキュリティ