まず前提として、PHPMailerの脆弱性は
https://github.com/opsxcq/exploit-CVE-2016-10033/blob/master/www/index.php#L33
この箇所のコード、外部からの入力$email
を送信者アドレスとして$phpmailer->setFrom($email, $name)
と設定することで発生する。
または直接$phpmailer->Sender = $email
としても同じ。
それ以外ではPHPMailer
のSender
プロパティが書き換わることは無く脆弱性も発生しないという認識なんだけれども。合ってるだろうか。
WordPressのメール送信はwp_mail
という関数で実行されていて、そこには
/**
* Filters the email address to send from.
*
* @since 2.2.0
*
* @param string $from_email Email address to send from.
*/
$from_email = apply_filters( 'wp_mail_from', $from_email );
/**
* Filters the name to associate with the "from" email address.
*
* @since 2.3.0
*
* @param string $from_name Name associated with the "from" email address.
*/
$from_name = apply_filters( 'wp_mail_from_name', $from_name );
$phpmailer->setFrom( $from_email, $from_name, false );
とある。基本的に送信者は全体で共通になっている。かつ第三引数がfalse
なのでSender
が書き換わらない。
WordPressの他のメール送信機能では、例えばプラグインのContact Form 7がある。
が、デフォルトの送信者アドレスは固定になっている。
http://ryus.co.jp/blog/contactform7-error/
こちらに書かれているように[your-name] <[your-email]>
という設定になっているとフォームの入力値が設定される。
しかし、そもそもContact Form 7はPHPMailer
のsetFrom
を呼び出しておらず、Sender
が設定されない。
なので、Sender
を書き換えるには上記設定に加えて
http://2inc.org/blog/2013/08/05/3459/
ここに書かれているようなカスタマイズをしないといけない。(ここでは固定値なのでもうひと手間かかる)
ここまでやって得られるのはReturn-Path
書き換えによるSPFレコード不一致によるスパム判定なので、WordPressで該当する人は多くないんじゃないだろうか。
SPFレコードが使われるようになってから、送信者アドレス(From
でなくReturn-Path
)をフォームの入力値で書き換えること自体がおかしいとも言える。
まあでもContact Form 7はたまたま該当機能を使っていなかっただけで、PHPMailerの
/**
* Set the From and FromName properties.
* @param string $address
* @param string $name
* @param boolean $auto Whether to also set the Sender address, defaults to true
* @throws phpmailerException
* @return boolean
*/
public function setFrom($address, $name = '', $auto = true)
$auto = true
が初期値になっているので、From
を変えたいだけなのにReturn-Path
も変わってしまってSPFでエラーになるし脆弱性も発生するしという状況もあるのかもしれない。