HTTPリクエストスマグリング(HRS)は、HTTPプロキシサーバーチェーン内のHTTPサーバー実装間のヘッダーの解釈の不一致を利用するHTTPプロトコルのセキュリティエクスプロイトです。[1] [2]これは2005年にLinhartらによって初めて文書化されました。[3]Content-LengthTransfer-Encoding
Transfer-Encoding ヘッダーは、 HTTP リクエストの本文を解釈する方法に関する指示を定義することで機能します。この攻撃に共通かつ必要な指示は、チャンク転送エンコーディングです。[4] Transfer-Encoding ヘッダーが存在する場合、Content-Length ヘッダーは省略されるはずです。[4]同様に機能しますが構文が異なり、Content-Length ヘッダーは、ヘッダー自体の値として本文のサイズをバイト単位で指定します。[5]これらのヘッダーの両方が悪意のある HTTP リクエストに含まれていると、フロントエンド サーバーまたはバックエンド サーバーのいずれかがリクエストを誤って解釈することで、サーバーへの悪意のある HTTP クエリを防ぐためのセキュリティ機能がバイパスされ、脆弱性が発生します。 [6] HTTP リクエストのスマグリングは、一般的に CL.TE、TE.CL、または TE.TE の形をとりますが、HRS を使用したより複雑な攻撃も存在します。[6]
種類
CL.TE
このタイプの HTTP リクエスト スマグリングでは、フロントエンドは Content-Length ヘッダーを使用してリクエストを処理し、バックエンドは Transfer-Encoding ヘッダーを使用してリクエストを処理します。[2]攻撃は、リクエストの最初の部分で長さがゼロのチャンクを宣言して実行されます。[6]これを見たフロントエンド サーバーは、リクエストの最初の部分のみを読み取り、意図せずに 2 番目の部分をバックエンド サーバーに渡します。[6]バックエンド サーバーに渡されると、次のリクエストとして扱われて処理され、攻撃者の隠されたリクエストが実行されます。[6]
TE.CL
このタイプの HTTP リクエスト スマグリングでは、フロントエンドは Transfer-Encoding ヘッダーを使用してリクエストを処理し、バックエンドは Content-Length ヘッダーを使用してリクエストを処理します。[2]この攻撃では、ハッカーは悪意のあるリクエストを格納する最初のチャンクの有効な長さを宣言し、次に長さが 0 の 2 番目のチャンクを宣言します。[6]フロントエンド サーバーは、長さが 0 の 2 番目のチャンクを確認すると、リクエストが完了したと判断し、バックエンド サーバーに渡します。[6]ただし、バックエンド サーバーは Content-Length ヘッダーを使用してリクエストを処理するため、最初のチャンクに残っている悪意のあるリクエストは、シーケンス内の次のリクエストの先頭として扱われて実行されるまで処理されません。[2]
てて
このタイプの HTTP リクエスト密輸では、フロントエンドとバックエンドの両方が Transfer-Encoding ヘッダーを使用してリクエストを処理しますが、ヘッダーは、サーバーのうちの 1 つがそれを無視し、もう 1 つのサーバーがそれを無視しないような方法で難読化できます (たとえば、非標準の空白のフォーマットや重複したヘッダーなど)。[2]ヘッダーの難読化は、Transfer-Encoding: xchunked などの誤った文字を追加したり、'Transfer-Encoding' と ': chunked' の間に通常とは異なる改行文字を追加したりする形を取る場合があります。[6]フロントエンドまたはバックエンド サーバーの 1 つがこれらの難読化された HTTP リクエストを引き続き処理する場合、攻撃の残りの部分は CL.TE または TE.CL 攻撃の仕組みと同様になります。[6]
防止
これらの攻撃に対する最善の予防策は、フロントエンド サーバーとバックエンド サーバーが HTTP リクエストを同じように解釈することです。ただし、ロード バランサーは異なるソフトウェアを使用して異なるプラットフォームで実行されるバックエンド サーバーをサポートするため、通常はこのオプションは使用できません。[6]この攻撃のほとんどの亜種[指定]は、リクエストの長さを決定するために異なる方法を使用するHTTP/2を使用することで防止できます。攻撃を回避するもう 1 つの方法は、フロントエンド サーバーが HTTP リクエストをバックエンドに渡す前に正規化し、同じ方法で解釈されるようにすることです。[2] Web アプリケーション ファイアウォールを構成することも、HRS 攻撃を防ぐ優れた方法です。多くのファイアウォールには、攻撃の試みを識別し、疑わしい受信リクエストをブロックまたはサニタイズするテクノロジが搭載されているためです。[6]
Grenfeldtら(2021)は、ほとんどのフロントエンドWebサーバー(プロキシサーバーなど)が、バックエンドWebサーバーに対するすべての既知のHRS攻撃を実際に阻止するための解析機能を提供していることを発見しました。[7] Huangら(2022)は、フロントエンドプログラムまたはWebサーバーからのHRS攻撃を防ぐ適切な解析機能を実装するためにFlaskを使用する方法を提案しました。 [8]
参考文献
- ^ 「CWE - CWE-444: HTTP リクエストの一貫性のない解釈 ('HTTP リクエストのスマグリング') (4.0)」。cwe.mitre.org 。2020 年 3 月 13 日閲覧。
- ^ abcdef 「HTTP リクエストスマグリングとは何か?チュートリアルと例 | Web セキュリティアカデミー」。portswigger.net。2020年3 月 13 日閲覧。
- ^ Linhart, Chaim; Klein, Amit; Heled, Ronen; Orrin, Steve (2005). 「HTTP リクエストの密輸」(PDF)。
- ^ ab "Transfer-Encoding". developer.mozilla.org . 2022年12月15日閲覧。
- ^ “Content-Length”. developer.mozilla.org . 2022年12月15日閲覧。
- ^ abcdefghijk 「HTTPリクエストスマグリング」。imperva.com 。 2022年12月15日閲覧。
- ^ Grenfeldt M、Olofsson A、Engström V、Lagerström R (2021)。「HTTPリクエストスマグリングを使用したWebサイトへの攻撃:サーバーとプロキシの実証的テスト」。2021 IEEE第25回国際エンタープライズ分散オブジェクトコンピューティング会議(EDOC)。オーストラリア:IEEE。pp.173–181。doi :10.1109/EDOC52215.2021.00028。
- ^ Huang Q、Chiu M 、Chen Y、Sun H ( 2022)。「Webサイトへの攻撃:HTTPリクエストスマグリング攻撃の検出と防止」。セキュリティと通信ネットワーク。2022 :1–14。doi :10.1155/2022/3121177。
