CRLFインジェクションとは?
目次
CRLFインジェクションとは?
Webアプリケーションでは通信のルールとしてHTTP(Hypertext Transfer Protocol)を利用します。このHTTPは付帯的な情報を付与するヘッダ部分とHTMLやJSONデータを格納するボディ部分に分かれており、ヘッダ部とボディ部の間には改行コードのみを挿入するという決まりがあります。
上記のHTTPの仕様から、仮に外部入力からHTTPレスポンスデータに改行コードを埋め込むことができた場合、応答データ自体の意味を変えてしまうことができます。このような外部入力の改行コードによって引き起こされる問題をCRLFインジェクション脆弱性と呼び、この問題を狙った攻撃のことをCRLFインジェクション攻撃といいます。
CRLFインジェクション攻撃の仕組み
CRLFインジェクションは一般的に受動的攻撃に分類されます。CRLFインジェクション攻撃は、改行コードが出力される位置によって以下のような影響があります。
【HTTPレスポンスヘッダ内に出力される場合】
- Locationヘッダのフィールド値の追加によるリダイレクト先の変更
- Set-Cookieヘッダのフィールド値の追加によるCookie値の書き換え
【HTTPレスポンスボディ内に出力される場合】
- HTTPレスポンスボディ内に任意のHTMLデータの挿入
- リバースプロキシ等にキャッシュさせることでキャッシュデータを汚染
以下はCRLFインジェクション攻撃の例となります。
CRLFインジェクション攻撃の例
- 攻撃者は罠ページの公開や不正なリンクを含むメールを送信して罠を仕掛けます。
- 被害者が気付かずに罠ページを閲覧する、あるいはメールのリンクをクリックすることでCRLFインジェクション攻撃が発動します。
- 問題のあるWebアプリケーションでは改行コードを正しく処理できていないため、改行コードが含まれた任意のヘッダやボディ部を含むHTTPレスポンスデータを生成し被害者に応答します。
- 被害者のWebブラウザは、任意のヘッダやボディが含まれた応答データを解釈するため、不正なJavaScriptが実行される、あるいは偽のWebページが表示されるなどの問題が発生します。
- 4までの手順で攻撃が成功すると攻撃者は被害者の機密情報などを奪取することができます。
脆弱性の解説動画
CRLFインジェクションが起こる原因
以下はCRLFインジェクション攻撃の際のHTTPリクエストと脆弱性のあるWebアプリケーションからの応答であるHTTPレスポンスの例です。
HTTPリクエストの例
GET /redirect?page=/index%0d%0aSet-Cookie:%20session=evil HTTP/1.1
Host: security-test.xyz
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Connection: close
HTTPレスポスンスの例
HTTP/1.1 302 Found
Server: nginx
Date: Thu, 15 Dec 2022 07:16:34 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Location: http://www.example.com/index
Set-Cookie: session=evil
Content-Length: 0
上記のように問題のあるWebアプリケーションではURLエンコードされた改行コードである「%0d%0a」をそのままHTTPレスポンスに出力しているため、応答データ内に改行コードが含まれてしまうことが原因で問題が発生します。
なお、HTTPの仕様ではレスポンスヘッダ1行につき1つの意味を持つため、Webアプリケーション側で改行コードの処理が適切に行われていない場合、不正なレスポンスヘッダが追加できることになります。また前述した通りヘッダ部とボディ部は改行コードで区切られているため、改行コードのみの1行を追加した後、さらに改行コードを挿入することでHTTPレスポンスボディを追加することも可能になります。
CRLFインジェクション攻撃への対策手法
CRLFインジェクション攻撃を防止するためには以下の対策が必要となります。
必須対策
外部入力がそのままHTTPレスポンスに出力されてしまうことが原因で問題が発生するため、HTTPレスポンスヘッダを出力する際には、開発者がプログラミングで実装せずにWebアプリケーションの実行環境やライブラリに用意されているヘッダ出力用のAPIやメソッドを利用するようにします。実行環境やライブラリに用意されているヘッダは改行コードを適切に処理するように設計、およびテストされているため、一から実装するよりもCRLFインジェクションの混入を防ぐことが期待できます。
推奨対策
何らかの理由により必須対策が実施できない場合は、改行コードを許可しないように適切な処理を実装します。なお改行コードはOSによって異なるため、この点については注意が必要です。
【改行コードの種類】
記号 | 読み方 | URLエンコード(ASCIIコード) | 対応OS |
CR | キャリッジリターン | 0x0d | Mac OS(ver 9以前) |
LF | ラインフィールド | 0x0a | Unix、Linux、Mac OC X |
CRLF | キャリッジリターン・ラインフィールド | 0x0d0a | Windows |
Webアプリケーションの仕様にもよりますが、実装する場合、基本的には改行コードについては含まれていた場合、すべて削除することが望ましいと言えます。ただしTextareaタグなどの改行コードを含む可能性のあるデータを受け付ける場合は、全削除を行うとWebアプリケーションが仕様通りに動作しなくなるため、このようなケースでは別途、処理を追加する必要があります。