PHPMailerおよびSwiftMailerの任意のコード実行の脆弱性

最近、 PHPMailerSwiftMailerに関する3つの脆弱性が記録されています



3つの脆弱性レポートはすべて、Yiiフレームワークと他のPHPフレームワークを脆弱であると述べているため、この記事の目的は、この脆弱性に対して誰が脆弱であり、それ自体を保護するために何をする必要があるかを明確にすることです。


PHPMailerに関しては、YiiはPHPMailerに関連するコンポーネントを公式に提供したことはありません。 さらに、Yiiは公式にYiiチームによってリリースされたコードにPHPMailerを含めませんでした。


レポートでのYiiの言及は、おそらくREADME PHPMailerからのコピー&ペーストであり、Yiiフレームワークで使用できると言われています。 PHPMailerのパッチはすでにリリースされています。バージョン5.2.20以上にアップグレードする必要があります。


SwiftMailerに関する状況は異なります。 彼のために、拡張yii2-swiftmailerを提供します。 SwiftMailerもパッチをリリースしました。少なくとも5.4.5のバージョンにアップグレードする必要があります。


脆弱性の本質


mail() PHP関数は、送信者アドレスを指定するための個別のパラメーターを提供しないため、これを行う唯一の方法は、5番目の引数( $additional_parameters )で文字列を渡すことです。 行には-fフラグと、それに続く送信者の電子メールが含まれている必要があります(たとえば、 -fadmin@example.com )。


これにより、PHPのmail()関数の呼び出しから形成されたパラメーターのリストを使用して、 /usr/bin/sendmailが呼び出されます。 例:


 /usr/sbin/sendmail -t -i -fadmin@example.com 

開発者が独自に5番目の引数をmail()関数に渡すと、ドキュメントを読んでおり、コマンドラインで安全に使用できるように電子メールをチェックおよびエスケープする必要があることがわかります。 これが行われない場合、すべての責任は開発者にあり、開発者はコマンドラインパラメーターの注入を許可したことは明らかです。


ただし、PHPMailerおよびSwiftMailerライブラリは、危険な方法でコマンドラインに電子メールを送信するという事実を隠す便利なAPIを提供します。 開発者は、ライブラリがsendmailを呼び出すセキュリティを確保するために十分なシールドを実行することを望んでいます。


検出された脆弱性は、PHPMailerおよびSwiftMailerライブラリが十分なスクリーニングを実行しなかったことを示します。 これは、送信者アドレスが特別な方法で形成された場合、PHP mail()関数の5番目のパラメーターに転送され、 sendmailプログラムが呼び出されたときに追加パラメーターとして実行されることを意味します。


たとえば、次の行を電子メールアドレスとして-oQと、 sendmailによって処理されるパラメーターに-oQおよび-Xを埋め込むことができます。


 -f"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php some"@email.com //    /usr/sbin/sendmail -t -i -f"attacker" -oQ/tmp/ -X/var/www/cache/phpcode.php some@email.com 

脆弱性の再現に関する詳細情報は、記事の冒頭にあるリンクにあります。


誰が危険にさらされていますか?


まず、 Swift_MailTransportまたはPHPMailerクラスを使用してメッセージを送信するユーザー。 これらのクラスは、PHP mail()関数を使用します。


アプリケーションを保護するには何が必要ですか?


脆弱性が[差出人]フィールドのみに関係していることを考えると、アプリケーションのどこでユーザーが送信者アドレスに自分の値を指定できるかを覚えておく必要があります。 ほとんどの場合、これは連絡先フォームおよびゲストブックスクリプトで使用されます。


ユーザーから電子メールを受信する段階で電子メールを正しく検証した場合、この脆弱性はほとんど影響しません。


データをユーザーから受け取ったらすぐに検証することをお勧めします。これにより、脆弱性のあるサードパーティライブラリへの転送など、アプリケーションの他の部分の無効なデータの処理を回避できます。


Yiiには、この脆弱性で使用されている例に続くアドレスをスキップしないEmailValidatorがあります


さらに、PHPには、電子メールのチェックに使用できるネイティブfilter_var()関数があります。 例:


 public function validateEmail() { if (filter_var($this->email, FILTER_VALIDATE_EMAIL) === false) { throw new InvalidParamException('The email contains characters that are not allowed'); } } 

UPD1: SwiftMailerはパッチをリリースしました。少なくとも5.4.5のバージョンにアップグレードする必要があります。



Source: https://habr.com/ru/post/J318698/


All Articles