HTTPレスポンス分割

HTTPレスポンス分割とは

HTTPレスポンス分割は、外部からの入力データを使用して動的にHTTPヘッダーを出力するWebアプリケーションの脆弱性を利用し、攻撃者の意のままにできる偽のページをユーザーに取得させるセキュリティ攻撃です。

Jtestでセキュアなアプリケーション開発 失敗しない虚弱性対策とは?

HTTPレスポンス分割の例

HTTPレスポンス分割に利用されることが多いのは、HTTPヘッダーのフィールドのうちリダイレクト先を指定するLocation:フィールドやCookieを設定するSet-Cookie:フィールドです。
例えば、ユーザが選択した言語をリクエストパラメーターに含めて送信し、それに従って各言語別のページにリダイレクトするアプリケーションがあるとします。

正常なレスポンスヘッダーは次のようになります。


ここで、"Japanese" の代わりに次の内容をパラメータとして送信します。

Japaneseの代わりに次の内容をパラメータとして送信します。

すると次のようなレスポンスが生成されます。

次のようなレスポンスが生成されます。

HTTPの仕様では、ヘッダーの終了は改行コード(CR+LF、URLエンコードされた形式では%0d%0a)2つによって表されます。
従って、上の例の「Content-Length:0」の後で1つのレスポンスが終了し、「HTTP/1.1 200 OK」以降は別のレスポンスを構成すると解釈されます。2番目のレスポンスの内容は、完全に攻撃者の制御下にあります。 攻撃者は、この偽のレスポンスをプロキシサーバーにキャッシュさせるなどの方法で、他のユーザーも偽のレスポンスを取得するようにします。これによってページの偽装、クロスサイトスクリプティング、Cookieの操作などの攻撃が可能になります。

HTTPレスポンス分割の対策

コーディングによる対策

HTTPレスポンス分割を防ぐには、ユーザからの入力データの検証と、出力データの適切なエンコーディングを徹底します。
例えば、これらをコーディング規約として定義すること、コードレビューの観点に追加することが想定されます。
  • 入力データをヘッダーに出力する前に、改行コード(CR+LF)が含まれていないかを検証する
  • アプリケーションでLocationフィールドに値を設定する場合、改行コードを取り除く
  • Set-Cookieフィールドに値を設定する場合は、必ずURLエンコードする
ただし、このような対策を行ったとしても大規模なアプリケーションで複数のクラス・メソッドにまたがるソースコードに潜む全て問題を従来の目視レビューだけで発見するのは不可能に近いとも言えます。
そこで、静的解析ツールでコードレビューを自動化して機械的にソースコードの問題を検出するようにします。

静的解析ツールJtestでHTTPレスポンス分割を検出する

Parasoft Jtest にはHTTPレスポンス分割が発生するコードを検出する静的解析ルールがあります。
  • HTTP レスポンス分割から防御する [BD.SECURITY.TDRESP]
このルールは、改行を含んでいる可能性のある入力データが、検証メソッドによるチェックを受けないまま出力メソッドに渡されている場合に違反をレポートします。

検出例 - Jtest 解析結果とソースコード:

Example.javaの15行目でアプリケーションを操作するユーザーが入力したデータを取得し、17行目ではユーザーが入力したデータをもとに作成した Cookie オブジェクトをそのままクライアントに送信します。
ユーザーが入力したデータが正常な場合、レスポンスは以下のようになります。
HTTP/1.1 200 OK
...
Set-Cookie: name=Joe
...

しかし、ユーザーがアプリケーションの脆弱性を狙う攻撃者であれば、あえてHTTP レスポンスが 2 つのレスポンスに分割されるようなデータを入力することもできます。
例えば、悪意のある文字列 "Joe\r\nHTTP/1.1 200 OK\r\n..." が入力されると、上のコードでは以下のようにレスポンスが分割されます。
HTTP/1.1 200 OK
...
Set-Cookie: author=Joe

HTTP/1.1 200 OK
...

2 番目のレスポンスは、完全に攻撃者の制御下にあります。

修正例 - ソースコード:
ユーザーが入力したデータを使用する前に検証します。

ユーザーが入力したデータを java.net.URLEncoder クラスの encode() メソッドを使用して application/x-www-form-urlencoded 形式に変換します。
こうすると、攻撃者が"Joe\r\nHTTP/1.1 200 OK\r\n..."のような悪意のある文字列を入力した場合、レスポンスは次のようになります。
HTTP/1.1 200 OK
...
Set-Cookie: name=Joe%0D%0AHTTP%2F1.1+200+OK%0D%0A
...
このレスポンスは安全です。

Jtest「HTTP レスポンス分割から防御する [BD.SECURITY.TDRESP]」ルールでソースコードを解析することにより、HTTPレスポンス分割による攻撃に対して脆弱なコードを発見し、改修することが可能になります。

Jtestが検出する脆弱性(抜粋)一覧

※ 本ページでご紹介した「HTTP レスポンス分割から防御する [BD.SECURITY.TDRESP]」ルールを含むセキュリティルール及びセキュリティコンプライアンス規約セットによる静的解析には「セキュリティコンプライアンスパック」のライセンス(有償)が必要です。

Java対応静的解析・単体テストツール Jtestに
関するお問い合わせ

  • テクマトリックス株式会社
    東京本社

    ソフトウェアエンジニアリング事業部

    03-4405-7853

メールでのお問い合わせ
parasoft-info@techmatrix.co.jp

お問い合わせ

製品についてやテクマトリックスについてなど、
こちらよりお気軽にお問い合わせいただけます。