メールヘッダ・インジェクション脆弱性
発生箇所 | メール送信機能のあるページ |
---|---|
影響を受けるページ | 直接影響を受けるページはない。メールを送られたユーザが被害を受ける。 |
影響の種類 | 迷惑メールの送信、メールの宛先や件名・本文の改ざん、ウイルス添付メールの送信 |
利用者の関与の度合い | 不要 |
概要
メールヘッダ・インジェクションは宛先(To)や件名(Subject)などのメールヘッダを外部から指定する際に、改行文字を使ってメールヘッダや本文を追加・変更する手法である。
影響は以下。
- 件名や送信元、本文が改変される。
- 迷惑メールの送信に悪用される。
- ウイルスメールの送信に悪用される。
攻撃手法
以下のようなメール送信フォームを考える。
<form action="mail.php" method="POST"> メール:<input type="text" name="from"><br> 本文:<textarea name="body"></textarea> <input type="submit" value="送信"> </form>
フォームからのリクエストを受けてメールを送信するスクリプトは以下になる。
$from = $_POST['from']; $body = $_POST['body']; mb_language('Japanese'); mb_send_mail( "aaa@example.jp", "問い合わせがありました。", "以下の問い合わせがありましたので対応をお願いします\n\n" . $body, "From: " . $from);
上記スクリプトで使用している mb_send_mail() の第4引数は追加のメールヘッダで、これを利用してFromアドレスを設定している。
この引数は改行で区切ることで複数のヘッダを指定可能である。しかし、上記のスクリプトでそのことを考慮されておらず、メールヘッダインジェクション脆弱性がある。
最初に示したメール送信フォームでFromアドレス用のinputタグをtextareaタグに変えたフォームを考える。
このフォームで先のスクリプトのメールヘッダ・インジェクション脆弱性を利用して宛先を追加することができる。Fromアドレスのtextareaに
aaa@example.jp Bcc: bbb@example.jp
と入力すると、スクリプトで指定した宛先の他にBccヘッダが追加され、Bccヘッダで指定したメールアドレスにもメールが送信される。
他に添付ファイルを追加したり、ヘッダの下に空行を1行入れてさらに入力すれば本文を改ざんすることも可能である。
脆弱性の原因
メールのメッセージヘッダは各フィールドが改行で区切られている。
アプリケーションが外部から指定するパラメータの改行をチェックしていない場合、ヘッダや本文を追加・変更できることになる。これがメールヘッダ・インジェクション脆弱性の原因である。
対策
以下の対策が推奨される。
- メール送信に専用のライブラリを使用する
メール送信に専用ライブラリを使用せずにsendmailコマンドを使用すると、アプリケーションがメールのメッセージ組み立ての責任を持たなければならず、メールヘッダ・インジェクション脆弱性が入り込みやすい。また、OSコマンド・インジェクション脆弱性が混入する可能性がある。
また、メールヘッダ・インジェクション脆弱性は本来はメール送信ライブラリで対策されるべきものである。
しかし、多くのメール送信ライブラリにメールヘッダ・インジェクション脆弱性が見つかっているため、さらに以下のいずれかの実施が推奨される。
- 外部からのパラメータをメールヘッダに含ませないようにする。
- 外部からのパラメータには改行を含まないようにチェックする。
mb_send_mail()のようなメール送信ライブラリの関数のラッパー関数を作成し、ラッパー関数側で改行文字をチェックするとよい。
また、予防的対策としてメールアドレスと件名のチェックがある。メールアドレス・件名には本来、改行は含まれないので、入力値の妥当性検証でチェックされるべきものである。よって、適切に入力値の検証がなされれば予防的な対策となる。
RFC5322で定められたメールアドレスの規定はかなり複雑なので、WEBアプリケーションの要件としてメールアドレスの仕様を定め、その要件にマッチしているか入力値を検証すればよい。
参考文献:体系的に学ぶWebアプリケーションの作り方 4.9.2 メールヘッダ・インジェクション脆弱性
体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 徳丸 浩 ソフトバンククリエイティブ 2011-03-03 売り上げランキング : 4070 Amazonで詳しく見る by G-Tools |
« 2014冬アニメ第1話感想 | Main | WordPressでsession_start()など初期化処理をしたい »
「PHP」カテゴリの記事
- PHPStorm 2018.1.7 に更新(2018.12.09)
- PHPメモ051:includeとrequireの使い分け(2015.06.19)
- CakePHPのインストール(2015.06.14)
- PHPからPDOでPostgreSQLに接続する(2015.06.09)
- PHPでメールを送信したら一部のOutlookで受信したメールでヘッダがおかしくなった(2015.05.31)
「セキュリティ」カテゴリの記事
- PHPメモ041:パスワードのSalt付きハッシュ値(2014.08.09)
- ファイルインクルード脆弱性(2014.05.18)
- ファイルダウンロードによるXSS その3(2014.03.27)
- ファイルダウンロードによるXSS その2(2014.03.23)
- ファイルダウンロードによるXSS その1(2014.02.24)
The comments to this entry are closed.
« 2014冬アニメ第1話感想 | Main | WordPressでsession_start()など初期化処理をしたい »
Comments