情報セキュリティ

安全なウェブサイトの作り方 - 1.8 メールヘッダ・インジェクション

概要

ウェブアプリケーションの中には、利用者が入力した商品申し込みやアンケート等の内容を、特定のメールアドレスに送信する機能を持つものがあります。一般に、このメールアドレスは固定で、ウェブアプリケーションの管理者以外の人は変更できませんが、実装によっては、外部の利用者がこのメールアドレスを自由に指定できてしまう場合があります。このような問題を引き起こす脆弱性を「メールヘッダ・インジェクション」と呼び、それを悪用した攻撃を、「メールヘッダ・インジェクション攻撃」と呼びます。

  • メールヘッダ・インジェクション

発生しうる脅威

メールヘッダ・インジェクション攻撃が行われた場合、発生しうる脅威は次のとおりです。

メールの第三者中継

迷惑メールの送信に悪用される

注意が必要なウェブサイトの特徴

利用者が入力した内容を管理者宛にメールで送信する機能を実装しているウェブサイトが、「メールの第三者中継」による影響を受けます。該当する機能には、「問い合わせページ」や「アンケート」等があります。

届出状況

メールの第三者中継が可能な脆弱性の届出は、ウェブサイトの届出全体に占める割合は1パーセント未満と多くはありません。受付開始当初から断続的に届出を受けています。下記は、IPAが届出を受け、同脆弱性の対策が施されたソフトウェア製品の例です。

根本的解決

8-(i)-a メールヘッダを固定値にして、外部からの入力はすべてメール本文に出力する。

「To」、「Cc」、「Bcc」、「Subject」等のメールヘッダの内容が外部からの入力に依存する場合や、メール送信プログラムへの出力処理に問題がある場合、外部からの入力をそのまま出力すると、外部から与えられた改行コードが余分な改行として差し込まれることになります。これを許すと、任意のメールヘッダの挿入や、メール本文の改変、任意の宛先へのメール送信に悪用される原因となります。 外部からの入力をメールヘッダに出力しない実装(脚注1)をお勧めします。

8-(i)-b メールヘッダを固定値にできない場合、ウェブアプリケーションの実行環境や言語に用意されているメール送信用APIを使用する。

メールヘッダを固定値にできない場合の例としては、メールの件名を変更したい場合等があります。

外部からの入力をメールヘッダに出力する場合、ウェブアプリケーションの実行環境や言語に用意されているメール送信用APIを使用することをお勧めします。ただし、APIによっては改行コードの取り扱いが不適切なもの、複数のメールヘッダが挿入できる仕様のものがあります。その場合、脆弱性が修正されたバージョンを使用するか、改行を許可しないよう、開発者自身で適切な処理を実装します。

改行を許可しない適切な処理には、改行コードの後に空白か水平タブを入れることで継続行として処理する方法や、改行コード以降の文字を削除する方法、改行が含まれていたらウェブページの生成の処理を中止する方法等が考えられます。

8-(ii) HTMLで宛先を指定しない。

これは、いわば「論外」の実装ですが、hiddenパラメータ等に宛先をそのまま指定するという事例の届出がありましたので、避けるべき実装として紹介します。

ウェブアプリケーションに渡されるパラメータに宛先を直接指定する実装は、パラメータ値の改変により、メールシステムの第三者中継につながる可能性があります。

保険的対策

8-(iii) 外部からの入力の全てについて、改行コードを削除する。

外部からの入力の全てについて、改行コードを削除します(脚注2)。あるいは改行コードだけではなく、制御コード全てを削除してもよいかもしれません。ただし、ウェブアプリケーションが、メール本文に出力するデータ等、改行コードを含みうる文字列にも、全ての入力に対して処理を行うと、そのウェブアプリケーションが正しく動作しなくなるため、注意が必要です。

以上の対策により、メールヘッダ・インジェクション攻撃に対する安全性の向上が期待できます。メールヘッダ・インジェクションに関する情報については、次の資料も参考にしてください。

脚注

  1. (脚注1)
  2. (脚注2)

CWE