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

当ページでは、「HTTPリクエストスマグリング」と呼ばれるサイバー攻撃の概要、攻撃手順やその被害の例、対策方法について分かりやすく図解を用いてまとめています。
攻撃手法を理解する上で必要な「Content-Length」ヘッダと「Transfer-Encoding」ヘッダの動作の仕組みに関しても解説しています。
 
 
 

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

HTTPリクエストスマグリングとは、クライアントからアプリケーションサーバまで(CDN, WAF, フロントエンドサーバ, バックエンドサーバなど)の間でHTTPリクエストの終端の判定方法が異なる場合、他ユーザのリクエストに対するレスポンスの内容を改変したりする攻撃。
 
スマグリング(smuggling)とは、「こっそり持ち込む」という意味。
つまり、WAFなどの規制を回避して後続のサーバへHTTPリクエストを持ち込むことができる攻撃となる。
 
リクエストの終わりを判定のために使われるリクエストヘッダには「Transfer-Encoding」と「Content-Length」の2種類があり、システム間で採用しているヘッダが異なる場合に攻撃が可能となる。
 

リクエスト終了判定の仕組み

リクエスト終了判定に使うヘッダは「Content-Length」ヘッダと「Transfer-Encoding」ヘッダの2種類あり、どちらか一方を使用する。
両方のヘッダが指定されている場合は「Transfer-Encoding」ヘッダが使われる。(Content-Lengthヘッダの値が無視される。)
 

Content-Lengthヘッダの動作

ボディのバイト数を10進数で表記する方式。
最後の2つの改行を除いたバイト数の値を10進数で表記する。
 

具体的な通信の例

リクエストボディ「q=smuggling」の合計バイト長「11」を「Content-Length」ヘッダの値に指定する。
 

Transfer-Encodingヘッダの動作

データを分割し、個々の分割データをサイズとセットで送信する方式。
大容量ファイルを送信する際など、全送信データのサイズを予めチェックチェックするのが難しいケースで利用する。
 
ポイントは以下の通り
  • 「Transfer-Encoding: chunked」ヘッダを付与し、bodyがchunked encodingを使っていることを示す。
  • サイズは16進数で表記(以降の残りのデータ数を示す)
  • Chunked Transfer:最後に「0」と送信することで、コンテンツの切れ目がわかるようになっている
  • 改行コードも文字数にカウントする点に注意(CRLF で 2 文字)
 

具体的な通信の例

リクエストボディ「q=smuggling」の合計バイト長は「11」。
「11」を16進数で表すと「b」となるためボディの始めに記載。
最後に「0」と送信することで、コンテンツの切れ目を示す。
 

HTTPリクエストスマグリングの種類

HTTPリクエストスマグリングの種類は、攻撃対象のシステムの構成によって「CL:TE 」「TE:CL」「TE:TE」の3タイプに分類される。
CL:TE フロントエンドサーバがContent-Lengthヘッダ、バックエンドサーバがTransfer-Encodingヘッダを利用している環境での攻撃。
TE:CLフロントエンドサーバがTransfer-Encodingヘッダ、バックエンドサーバがContent-Lengthヘッダを利用している環境での攻撃。
TE:TEフロントエンドサーバとバックエンドサーバ両方がTransfer-Encodingヘッダを利用している環境での攻撃。

CL:TE

フロントエンドサーバがContent-Lengthヘッダ、バックエンドサーバがTransfer-Encodingヘッダを利用している環境でのHTTPリクエストスマグリング。
バックエンドサーバでリクエストが2つに分離されて処理される。

TE:CL

フロントエンドサーバがTransfer-Encodingヘッダ、BEがContent-Lengthヘッダを利用している環境でのHTTPリクエストスマグリング。
バックエンドサーバでリクエストが2つに分離されて処理される。

TE:TE

フロントエンドサーバ・バックエンドサーバの両方がTransfer-Encodingヘッダを利用している環境でのHTTPリクエストスマグリング。
ヘッダを細工して片方のみでTransfer-Encodingヘッダを利用させる。
 

攻撃された場合の被害

WAF(Web Application Firewall)による検査を回避し、システム内部のサーバで不正なHTTPリクエストを送信される可能性がある。
 
また、他のユーザのリクエストに介入することで以下のような攻撃に応用される。
  • キャッシュポイズニング
  • セッションハイジャック
  • クロスサイトスクリプティング(XSS)
 

対策方法

バックエンド通信にHTTP/2を使用する

HTTP/2ではリクエスト間の境界の曖昧さを防止する機能があるため、バックエンドサーバの通信にHTTP/2を使用することでHTTPリクエストスマグリングを防止可能。

フロントエンドとバックエンドで同じWebサーバアプリを使う

HTTPリクエストの終端の判定方法を統一させるためにフロントエンドとバックエンドで同じWebサーバアプリを使うことも有効。

両方のヘッダがある時はリクエストを処理しない

「Content-Length」ヘッダと「Transfer-Encoding」ヘッダの両方が付与されているHTTPリクエストは処理しないことで攻撃を防止可能。

関連情報・参考情報

その他のサイバー攻撃・セキュリティ関連記事も良かったらご参照ください!