MOPB-33-2007:PHP mail() Message ASCIIZ Byte Truncation

(Last Updated On: )

Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。

■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser

■PoCまたは攻撃コード
必要なし

■リファレンス
なし

■サマリ
mail()関数がASCIIZバイト(訳注:NULLバイトのこと)呼ばれるとmail()関数はそこでメッセージが終了したものとしてしまいます。ユーザ入力のNULLバイトをフィルタせずにメッセージを追加している場合、メールトランケート脆弱性が発生します。

■詳細情報
EメールをPHPのmail()関数で送信しているWebアプリケーションは、以下のようなコードで生成されることが多いです。

$message = “Dear “.$_GET[‘name’];
$message .= “you have successfully …”;

この例では名前がチェックなしで名前が挿入されています。このコードはテキストブロック(訳注:$_GET[‘name’]以降)のメールメッセージをメッセージを送信するユーザの完全な制御下にあることは明らかです。しかし、通常の状況では、元のメッセージがメールに添付されているので、メッセージの改ざんは明らかです。

残念ながらmail()関数は内部的にASCIIZバイトを文字列の終端として取扱い、攻撃者は単にASCIIZ文字を追加することにより以降のメッセージを表示させないようにできます。

■PoC、攻撃コードまたは再現手順
簡単な脆弱性テストコードは以下のようになります。

<?php
mail(“test@domain(dot)com”, “Truncation Test”, “You will see this message\0but not this”);
?>

■備考
Eメールインジェクション解説文では、通常は追加ヘッダによるヘッダインジェクションにのみ解説しています。しかし、NULLバイトによるインジェクションによってEメールメッセージの完全に別のメッセージに書き換え、トランケートさせることが可能な場合が多いです。

(訳注:例え送信先を制御できなくても、ブログのコメント通知などで、コメントではなく別の通知、たとえば「パスワードの更新が必要です」とメッセージを表示しPhishingするなど、としてメールを送信できると困るアプリケーションも多いと思います)

投稿者: yohgaki