2016年12月25日、PHPのメール送信ライブラリPHPMailerに任意のコード実行可能な脆弱性が確認されたとして情報が公開されました。ここでは脆弱性の関連情報をまとめます。
脆弱性の概要
対象 | PHPMailer |
---|---|
CVE | CVE-2016-10033 CVE-2016-10045 |
影響 | RCE |
重要度 | Critical(発見者) 緊急(JVN) |
CVSS | JPCERT/CC評価 CVSSv3:5.4 (CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N) CVSSv2:5.5 (AV:N/AC:L/Au:S/C:P/I:P/A:N) |
PoC | インターネット上に公開済 CVE-2016-10033⇒2016/12/26 CVE-2016-10045⇒2016/12/28 |
発見者/報告者 | CVE-2016-10033:Dawid Golunski氏(@dawid_golunski) CVE-2016-10045:Dawid Golunski氏(@dawid_golunski) / Paul Buonopane氏(@Zenexer) |
PHPMailer
タイムライン
日時 | 出来事 | |
---|---|---|
2016年12月24日 | CVE-2016-10033を修正したPHPMailer 5.2.18が公開 | |
2016年12月25日 | Dawid Golunski氏がCVE-2016-10033の脆弱性情報公開 | |
2016年12月26日 | マイナーアップデートをしたPHPMailer 5.2.19が公開 | |
2016年12月27日 | Dawid Golunski氏が脆弱性の実証コード公開 | |
2016年12月28日 | Dawid Golunski氏が修正は不完全でバイパス可能として新たにCVE-2016-10045の脆弱性情報と実証コード公開 | |
〃 | CVE-2016-10045を修正したPHPMailer 5.2.20が公開 | |
〃 | マイナーアップデートをしたPHPMailer 5.2.21が公開 |
脆弱性情報
Dawid Golunski氏の公開情報
- CVE-2016-10033 https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html
- CVE-2016-10045 https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html
[Crit. #RCE #0day #vuln] PHPMailer -Patch before the attackers patch it (via a rev. shell ;)https://t.co/raJYd6PsFv #infosec #security #php pic.twitter.com/g1a9m8CGFQ
— Dawid Golunski (@dawid_golunski) 2016年12月26日
影響範囲
影響を受けるPHPMailerのバージョン
CVE-2016-10033
- PHPMailer 5.2.18未満のバージョン
Version 5.2.18 (December 24th 2016)
SECURITY Critical security update for CVE-2016-10033 please update now! Thanks to Dawid Golunski.
https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md
CVE-2016-10045
- PHPMailer 5.2.20未満のバージョン
Version 5.2.20 (December 28th 2016)
SECURITY Critical security update for CVE-2016-10045 please update now! Thanks to Dawid Golunski and Paul Buonopane (@Zenexer).
https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md
影響を受けるCMS等
複数のソフトウェアでPHPMailerが利用されており、有名なものでは次の名前が挙げられている。対象のリストにYiiが含まれていたが既に依存関係にない。またその後更新された情報で、Wordpress、Drupal、Joomla!のコア部分では脆弱性の影響を受けないことが発表された。
自分のCMS等が使ってるか知りたい人は下のコマンド使って調べてみてください。例えばWordPressなら
— そーだい@初代ALF (@soudai1025) 2016年12月28日
grep -R "class PHPMailer" /WordPressを設置してるフォルダパス(例 /var/www/html/) https://t.co/YmUB1sZpqN
対策
脆弱性実証コード(PoC)
Dawid Golunski氏
CVE-2016-10033
- https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html
- https://legalhackers.com/videos/PHPMailer-Exploit-Remote-Code-Exec-Vuln-CVE-2016-10033-PoC.html
CVE-2016-10045
opsxcq氏
CVE-2016-10033
実証コードが動作する環境・条件
- メール送信の際にFROMに信頼できないデータが入る実装がされている。
- 次の組み合わせで「影響あり」に該当する。
PHPのバージョン | PCREの有無 | 影響の有無 |
---|---|---|
5.2.0未満 | あり | 影響あり |
〃 | 無し | 影響あり |
5.2.0以上 | あり | 影響あり |
〃 | 無し | 影響無し |
- Postfix使用時は"-X"オプションは無視されることから少なくとも公開されているExploitは動作しない。
PHPMailerの脆弱性、 ; などで別コマンド実行はできないので良かった。
— cakephper (@cakephper) 2016年12月28日
Postfixを使ってる場合は -X オプションがないので発動しない。(-Xに相当するものがあるとNGだけど)
very specific conditionをめぐる経緯
Dawid Golunski氏に先んじてopsxcq氏が公開したPoCでは「非常に特殊な条件が満たされた場合にリモートのサーバーに対し侵害が可能となる」と説明されていた。
PHPMailer before its version 5.2.18 suffer from a vulnerability that could lead to remote code execution (RCE). If a very specific condition is met, a remote server can be compromised. This condition is specified in Vulnerable Code section bellow.
「非常に特殊な条件」は次の内容とされていた。
* PHPMailer < 5.2.18 * Compile PHP without PCRE. * PHP version must be inferior to 5.2.0.
あるいは$patternselectに「noregex」が指定された場合がこの条件に該当*1する模様。opsxcq氏が公開した脆弱性の検証環境でもその指定が書き加えられている。
一方でその後公開された Dawid Golunski氏のPoCではそのような条件記述は見受けられない。さらにichikawayさんの調査によればPCREが入ったPHP5.2以上の環境で抜けるパターンが存在することを指摘している。
PHPMailerの問題、PCRE入っててもNGですね。
— cakephper (@cakephper) 2016年12月27日
PCREがなくて、かつPHP5.2以上だとfilter_varが使われるので救われる。
PHP5.2以上は全てPHPのfilter_varを使ってメールアドレスを検証するようにすれば良いのに・・PCRE優先なんだよな
その後、Dawid Golunski氏のPoCではopsxcq氏が記載した「非常に特殊な条件」に係わらず影響を受けることが確認されたためか、これに関する記述がopsxcq氏のReadmeより削除された。Exploitなども更新されている。
CVE-2016-10033の調査、まとめ、注意喚起など
更新履歴
- 2016年12月27日 PM 新規作成
- 2016年12月28日 AM 続報追記
- 2016年12月28日 PM CVE-2016-10045に関する情報を追記
- 2016年12月29日 PM 続報追記
*1:メールアドレスに「@」が存在しているかのみ検証される。