PHPMailerのリモートコード実行脆弱性(CVE-2016-10033)の影響範囲

  • 120
    Like
  • 2
    Comment

今回の脆弱性

CVE-2016-10033
CVE-2016-10045
CVE-2016-10074(Swift Mailer)

追記

2016/12/28 14:15
Postfixを使っていて、sendmailコマンドの代わりにPostfixのsendmailコマンドを使っている場合は、Postfixのsendmailコマンドが -X オプションを無視するようですので大きな影響を受けないと思います。ただ、別のオプションで違う脆弱性が発生する可能性もあるので、PHPMailerはアップデートしたほうが良いですね。

2016/12/28 15:35
PHPMailer5.2.18の修正を回避する新しい攻撃が見つかり、 CVE-2016-10045として登録されその攻撃方法も公開されてます。こちらはPHPMailer5.2.21で対応されています
この攻撃は、PHPMailer5.2.18で入った対策を回避するようになってます。詳細と対策は徳丸さんの記事をご覧ください。

2016/12/29 16:54
Swift Mailerにも同様の脆弱性があるようです。(CVE-2016-10074)
「メール送信ライブラリ「Swift Mailer」に脆弱性 - 修正パッチは未公開」 -> 対応済み
多くのPHPフレームワークでSwift Mailerは使われているので影響はあるのですが、今回の脆弱性では、メールのFromにユーザが入力した任意のメールアドレスがセットでき、SendmailのMTAという条件ですので、自分がフレームワークを使って開発している場合は出来合いのCMSを使ってるよりも、影響範囲の把握は簡単そうです。
Fromにユーザメールアドレスを入れるケースは、SPFでもfailになるため自作アプリでそのような実装をしているのは少ないのではないでしょうか。

2016/12/30 15:00
Swift Mailerも対応が完了したようです。(CVE-2016-10074)
https://github.com/swiftmailer/swiftmailer/commits/master

脆弱性の概要

PHPMailer5.2.18より下のバージョンで発生します。
フォームからメールアドレスを受け付けて自前バリデーションせずにPHPMailerのFromにセットしている場合かつ、sendmailを利用している場合に発生する可能性。
任意のPHPコードをサーバに設置できるため、外部からWebシェルなどが設置されるなど、影響は大きいです。

影響が大きいため、PHPMailerを使っているCMSなど(WordPress, Drupal, 1CRM, SugarCRM, Yii,Joomla!)も含めてバージョンアップが必要です。PHPMailerはメール送信ライブラリのため、知らない間にプラグインなどで利用されている可能性もあります。

WordPressの場合はwp-includes/class-phpmailer.phpですかね。
2016年12月28日の時点で、このチケットで議論されているようです。
参考: 「PHPMailer」の脆弱性、「WordPress」などでは悪用できず
とのことですので、WordPressの本体だけを利用している場合は影響がないようです。ただしプラグインなどが利用している可能性もあるため注意が必要です。

影響範囲

PHPMailer5.2.18より下のバージョンで、メール送信にSendmailを使っている場合、下記の条件になります。

  • PCREが入っている場合
    • すべてのPHPバージョンで影響
  • PCREが入っていない場合
    • PHP5.2より下のバージョンで影響

PoCでは、以下のようにPCREが入ってないことが条件になってますが、それはこのPoCの条件であって他のパターンではPCREが入ってても抜けてしまいます。

  • PHPMailer < 5.2.18
  • Compile PHP without PCRE.
  • PHP version must be inferior to 5.2.0.

例えばこんなコードで検証すればPCREが入ったPHP5.2以上の環境でもメールアドレスのバリデーションは通ってしまいます。

<?php
require 'PHPMailerAutoload.php';
//$address = 'ichikaway@gmail.com';
$address = '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php  some"@email.com';
var_dump(PHPMailer::validateAddress($address)); // true

悲しいことに、PCREが入っているほうがPHPの対象範囲が広くなってしまいます・・・
PCREが入っておらず、PHP5.2以上の場合はPHPのfilter_var()でメールアドレスチェックが行われるため救われます。PCREの正規表現よりもfiter_var()を優先すれば良いのに・・・
コードはこのあたりをみればバリデーションの適用条件がわかると思います。
https://github.com/PHPMailer/PHPMailer/blob/master/class.phpmailer.php#L1068

最新版のパッチ

CVE-2016-10033、CVE-2016-10045の修正パッチはこれです

最新の5.2.21が最新版です。(2016/12/29)
https://github.com/PHPMailer/PHPMailer

その他の情報

WAFでの対応

クラウド型Web Application FirewallのScutumでは、今回の2つのCVEに対応済みです。
http://www.scutum.jp/information/technical_articles/phpmailer.html

Scutumのように、すぐに対応できるのはクラウド型WAFを自前で開発してる強みですね。
今後、連休で同じような問題が発生して辛い思いをするよりは、このようなFirewallを入れておくのも良いかと思います。