サイバー脅威や攻撃の世界では、既知・未知の危険があちこちに潜んでおり、その全容把握が難しくなっています。HTTPリクエストスモグリングはその一例です。問題を引き起こすネットワークの脆弱性であり、ハッカーがHTTPの制限を突破する恐れがあるため、軽視できません。
この表現の文字通りの意味を確認して、その内容を理解してください。
ご存知の通り、HTTPはウェブサイトやアプリで利用されます。ウェブサイトとそのサーバーは、HTTPを介して体系的にリクエストを交換し、通信しています。
しかし、不整合なリクエストはハッカーにとって好機となります。ハッカーはこの弱点を利用して、不正な目的に加え、HTTPリクエストスモグリング攻撃などを行います。記録によれば、この攻撃手法は2005年に初めて成功し、2020年には複数の新たなバリエーションが確認されました。
現代のウェブシステムでは、HTTPリクエストが絶えず交換されることが通信を成立させる要因です。このようにリクエストは連続的に行き来しています。
バランスを保つためには、フロントエンドとバックエンドのサーバーが共にHTTPの規則に従ってリクエストを処理する必要があります。何らかの不整合が生じた場合、ハッカーが2つのサーバーがそれぞれ処理する隙を狙い、改ざんされたリクエストや入力を仕込む可能性があります。これにより攻撃が始まり、ハッカーが重要な情報にアクセスして悪用する結果に繋がります。
熟練のハッカーの手に渡れば、このスモグリング攻撃は予想を超える被害をもたらす可能性があります。攻撃者は次のような行動を行う恐れがあります:
HTTP経由の攻撃を成功させるための最初の要件は、CLとTEヘッダーを組み合わせることです。この手法により、ハッカーはフロントエンドとバックエンドのサーバーの処理を混乱させ、不整合が生じる状況を作り出します。以下に、この攻撃を実現するための代表的な3つの方法を示します。
この脆弱性は、フロントエンドサーバーがCLヘッダーの処理を行い、TEヘッダーはバックエンドサーバーが処理することに起因します。以下にサンプルコードを示します。
POST / HTTP/1.2
Host: example-website-url.com
Content-Length: 20
Transfer-Encoding: chunked
0
成功
動作の仕組みを見てみましょう:
フロントエンドサーバーはCLヘッダーの入力を確認し、処理すべきストリームの長さが20バイトであることを把握します。
この情報はバックエンドサーバーに渡され、TEヘッダーを読み取り、「chunked」処理が必要であると判断されます。
最初のチャンク(長さ0のもの)が処理され、終了します。
このサーバーは『Succeeded』の後のバイトを、新しいHTTPリクエストの開始と見なすため、処理が行われず残されます。しかし、実際はそうではなく、HTTPリクエストの処理に不整合が生じる結果となります。これにより、攻撃が成功します。
この手法では、フロントエンドサーバーがTEヘッダーを処理し、一方でバックエンドサーバーがCLヘッダーの処理を担当します。以下は、この攻撃を行うためのサンプルコードです。
HOST / HTTP/1.2
Host: example-website-url.com
Content-Length: 4
Transfer-Encoding: chunked
11
COMPROMISED
0
それでは、この手法がどのように成功するか説明します。フロントエンドサーバーがTEヘッダーを処理する際、HTTPリクエストボディはチャンク方式で処理されます。
最初に11バイトのチャンク1が処理され、その後、0バイトのチャンク2が処理されます。
次に、バックエンドサーバーはContent-Lengthヘッダー(4バイト)を検出し、『COMPROMISED』を別のリクエストと見なして処理をスキップします。
最後に、TE-TE挙動の手法があります。これは、TEヘッダーのみをフロントエンドとバックエンドサーバーに送信する方法で、TEヘッダーが過剰に利用され、いずれかのサーバーがヘッダーの処理を行わなくなるように強制されることから、TEヘッダーの難読化とも呼ばれます。
以下に、いくつかのHTTPリクエストスモグリングのペイロード例を示します。
Transfer-Encoding: ychunked
Transfer-Encoding: chunked
—————————————
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
—————————————
Transfer-Encoding : chunked
Transfer-Encoding
: chunked
以上の例から、TEヘッダーは実際のHTTP仕様からわずかにずれるだけで、正当なHTTPリクエストに見せかけることが分かります。そのため、多くのサーバー実装ではこれを正規のHTTPリクエストとして受け入れて処理します。
この型の攻撃を実行するためにハッカーが必要とするのは、TEヘッダーの複数のバリエーションを生成する能力のみです。差異が大きいほど、成功率も向上します。
通常のレスポンスの置換
ミドルウェアにキャッシュサーバーが存在する場合にのみ可能なこの攻撃手法は、キャッシュの破損を伴います。対象はキャッシュエントリの一部として保持される不正なレスポンスで、結果としてサービス拒否攻撃の基盤が作られます。
フィルターの回避
これは、セキュリティフィルターを回避しながら、改ざんされたリクエストを直接バックエンドサーバーに転送する手法です。
認証情報の乗っ取り
これは、クエリストリームに小さなクエリ部分を追加し、検証済みのエンドユーザーのクエリが現れるのを待つ手法です。現れた際、ハッカーはその検証済みクエリにアクセスし、最初に追加した小さなクエリ部分に組み込みます。検証済みクエリが悪意のあるクエリと結び付けられるため、プロキシサーバーやロードバランサーは改ざんされたクエリを正当なものと判断して処理します。
問題が検出された際、迅速かつ実効性のある対策を講じることが、被害を抑えネットワーク、サーバー、クライアント側の資産を守る唯一の方法です。以下に、対策を講じる上で推奨される主な手法を示します。
基本的なHTTPリクエストスモグリングの対策は、サーバーとクライアント側のHTTPリクエストを常に監視することです。監視が行き届けば検出が早くなり、被害も小さくなります。しかし、バックエンドサーバー管理に欠かせないロードバランサーが遠隔地に配置される場合もあるため、100%の実現は困難であることを理解する必要があります。
もし、HTTPリクエストの処理状況を把握するために異なるプラットフォームを用いて2つのサーバーを管理している場合でも問題ありません。両者の解釈の仕方と適切な組み合わせに注目してください。
バックエンドの設定変更は必ずしも推奨されるわけではありませんが、CLとTEヘッダーに関連する最適化機能を無効にすることは重要です。これによりウェブシステムのパフォーマンスが多少低下する可能性はありますが、HTTPリクエストスモグリング対策としては迅速な解決策となります。
適切に管理されない場合、これらのツールはハッカーが悪用する手助けとなります。そのため、ウェブシステムにとって非常に必要でない限り、これらのツールの利用は控えるべきです。
質の高いWAFは、トラフィックをフィルタリングし、不正なリンクやコードがウェブサイトに到達するのを防ぐため、ウェブサイトにとって欠かせない存在です。
HTTPログが安全に保護され、認証済みのユーザーのみがアクセスできる状態にあることを確認してください。可能であれば、ユーザー認証も適用してください。
本記事を通じて、HTTPリクエストスモグリングがあらゆるウェブサイト運営者にとって懸念事項であることがお分かりいただけたと思います。このため、Wallarmは本攻撃を抑制し、関連するリスクを防ぐための多様な対策を備えた包括的なウェブセキュリティソリューションを提供しています。
Wallarmを試し、HTTPリクエストスモグリングによるOWASPの脅威から貴社のウェブサイトを守ってください。(まずは無料トライアルがおすすめです。)
最新情報を購読