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

## 今回の脆弱性

[CVE-2016-10033](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10033)
[CVE-2016-10045](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10045)
[CVE-2016-10074](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10074)(Swift Mailer)

### 追記

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

2016/12/28 15:35
PHPMailer5.2.18の修正を回避する新しい攻撃が見つかり、 CVE-2016-10045として登録され[その攻撃方法も公開されてます。](https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html)こちらは[PHPMailer5.2.21で対応されています](https://github.com/PHPMailer/PHPMailer/commits/master)。
この攻撃は、PHPMailer5.2.18で入った対策を回避するようになってます。[詳細と対策は徳丸さんの記事](http://blog.tokumaru.org/2016/12/PHPMailer-Vulnerability-CVE-2016-10033.html)をご覧ください。

2016/12/29 16:54
Swift Mailerにも同様の脆弱性があるようです。(CVE-2016-10074)
[「メール送信ライブラリ「Swift Mailer」に脆弱性 - 修正パッチは未公開」](http://www.security-next.com/077113) -> 対応済み
多くの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日の時点で、[このチケット](https://core.trac.wordpress.org/ticket/37210)で議論されているようです。
参考: [「PHPMailer」の脆弱性、「WordPress」などでは悪用できず](http://www.security-next.com/077088)
とのことですので、WordPressの本体だけを利用している場合は影響がないようです。ただしプラグインなどが利用している可能性もあるため注意が必要です。

## 影響範囲

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

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


[PoC](https://github.com/opsxcq/exploit-CVE-2016-10033)では、以下のようにPCREが入ってないことが条件になってますが、それはこのPoCの条件であって[他のパターン](https://legalhackers.com/exploits/CVE-2016-10033/PHPMailer-RCE-exploit-poc.txt)ではPCREが入ってても抜けてしまいます。

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


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

```PHP
<?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の修正パッチは[これです](https://github.com/PHPMailer/PHPMailer/compare/c700f9868d37ea66b7f0f69b202baf6d56243850...master?diff=split&name=master)。

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

## その他の情報
- [PHPMailerの脆弱性CVE-2016-10033について解析した ](http://blog.tokumaru.org/2016/12/PHPMailer-Vulnerability-CVE-2016-10033.html)
- [Drupal Security advisories](https://www.drupal.org/psa-2016-004)
- [PHPMailerの脆弱性CVE-2016-10033はWordPressにどの程度影響するのだろうか](http://qiita.com/nishimura/items/869362ab33b5e82080b7)

## WAFでの対応

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

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