水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > メモ : メッセージヘッダのインジェクションと SMTPコマンドインジェクション

メモ : メッセージヘッダのインジェクションと SMTPコマンドインジェクション

2007年4月6日(金曜日)

メモ : メッセージヘッダのインジェクションと SMTPコマンドインジェクション

はびこる「インジェクション系」のぜい弱性 (itpro.nikkeibp.co.jp)」。……徳丸さんの記事ですね。これも「サニタイズ言うな」という話の流れなのですが、説明がとても分かりやすいと思いました。連載ということなので期待大です。

ただ、非常に細かいのですが一点だけ気になった点が。

表中に「SMTPヘッダー・フィールドの追加」という項目がありますが、「SMTPヘッダー・フィールド」という言い方には違和感があります。SMTP においては、メッセージヘッダは単に DATA コマンドで送られるデータの一部です。これは名前の通りメッセージのヘッダであって、プロトコルの中でヘッダとして扱われているわけではありません。ですので、メッセージヘッダの定義は SMTP の仕様について述べた RFC2821ではなく、メッセージの書式を述べた RFC2822 のほうに入っています。

そもそも sendmail -t に対するインジェクションと SMTP コマンドのインジェクションは少し性質が違いますので、一緒に扱うのは良くないかもしれません。以下はメモですが……。

メッセージヘッダの To: と実際の送信先となるエンベロープ To は必ずしも一致しませんから、たとえ To: がインジェクションできても、それが RCPT TO: コマンドに反映されない限り第三者中継は成立しません。では何故メッセージヘッダのインジェクションで第三者中継が起きるのかというと、多くの場合、メール送信には sendmail -t が (あるいは、それと互換性のある何かが) 使われているためです。sendmail に -t オプションを付けて呼び出すと、sendmail は標準入力の内容 (メールのヘッダと本文) から To: や Cc: などの値を読み取り、それを SMTP の RCPT TO: で宛先に設定します。このため、メッセージヘッダに To: などがインジェクションされると、任意の宛先にメールが送られてしまいます。

逆に sendmail コマンドが -t なしで呼び出されていたり、sendmail -t と互換性のないメール送信方法が使われているような場合は、メッセージヘッダに To: がインジェクションされても送信先には影響ありません。メールに謎のヘッダが増えたりしているので受け取った人は混乱するかもしれませんが、それだけです。

では SMTP に対するインジェクションは起こり得ないのかというと、そんなことはありません。SMTP コマンドのほとんどは <CRLF> で終わりとなりますから、送る値 (たとえば MAIL FORM: や RCPT TO: のメールアドレス) に <CRLF> が含まれていると、やはり任意の SMTP コマンド実行のおそれがあります。では、一律 <CRLF> をはじけば……と思うかもしれませんが、そうはいきません。なぜなら、メールのヘッダや本文には普通に <CRLF> が含まれるからです。メッセージヘッダと本文を送るのは DATA コマンドですが、このコマンドでは <CRLF> を普通に扱うことができるかわりに、ピリオドだけの行 (<CRLF>.<CRLF>というデータ) がデータの終わりを意味します。

あらためてまとめると、こんな感じですね。

もっとも、実際には Web アプリケーションの開発者が SMTP を直接どうこうする場面はほとんど無いでしょう。たいていはデータを MTA に渡すだけでしょうから、メッセージヘッダの <CRLF> に気をつけていれば良いことになります。任意の SMTP コマンドのインジェクションができてしまう MTA があったら、それは MTA の脆弱性でしょうし。

※そんな問題のある MTA は滅多にないと思いますが、「JVN#86092776 BASP21 においてメールの不正送信が可能な脆弱性 (jvn.jp)」というのはその希な例だったのだろうと思います (参考 : [memo:9233] Re: JVN#86092776: BASP21 においてメールの不正送信が可能な脆弱性 (memo.st.ryukoku.ac.jp))。

関連する話題: セキュリティ / MTA / 狙われるWebアプリケーション / サニタイズ言うな / RFC

最近の日記

関わった本など