- PVSM.RU - https://www.pvsm.ru -

Уязвимости выполнения произвольного кода в PHPMailer и SwiftMailer

В последние дни было зарегистрировано три уязвимости, касающиеся PHPMailer [1] и SwiftMailer [2]:

Все три отчёта об уязвимостях упоминают фреймворк Yii наряду с другими PHP фреймворками как уязвимый, потому цель этой статьи — прояснить, кто именно подвержен этой уязвимости и что нужно сделать для того, чтобы обезопасить себя.

Что касается PHPMailer, Yii никогда официально не предоставлял никаких компонентов, связанных с PHPMailer'ом. Кроме того, Yii никогда не включал PHPMailer в какой-либо код, который официально выпускался командой Yii.

Упоминание Yii в отчётах скорее всего является копи-пастой из README PHPMailer'a, где сказано, что он может быть использован вместе с фреймворком Yii. Для PHPMailer уже выпущен патч [6], нужно обновиться до версии как минимум 5.2.20.

Ситуация касательно SwiftMailer отличается. Для него мы предоставляем расширение yii2-swiftmailer [7] и для SwiftMailer пока нет патча.

Суть уязвимости

Так как PHP-функция mail() [8] не предоставляет отдельного параметра для указания адреса отправителя, единственным способом сделать это — является передача строки 3-им аргументом ($additional_parameters). Строка должна содержать флаг -f, следом за которым идёт email отправителя (например -fadmin@example.com).

Это приводит к вызову /usr/bin/sendmail со списком параметров, сформированным из вызова PHP-функции mail(). Например:

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

Когда разработчик самостоятельно передаёт 3-ий аргумент в функцию mail(), подразумевается, что он читает документацию и знает, что email нужно проверить и экранировать, чтобы он был безопасен для использования в командной строке. В случае, если это не сделано, очевидно, что вся ответственность лежит на разработчике, который допустил инъекцию параметров командной строки.

Однако, библиотеки PHPMailer и SwiftMailer предоставляют удобный API, который скрывает факт передачи email в командную строку опасным способом. Разработчик надеется, что библиотеки выполняют достаточное экранирование для обеспечения безопасности вызова программы sendmail.

Обнаруженные уязвимости указывают на то, что библиотеки PHPMailer и SwiftMailer не выполняли достаточного экранирования. Это значит, что если адрес отправителя будет сформирован специальным образом, он будет передан в третий параметр PHP-функции mail() и выполнен как дополнительные параметры при вызове программы sendmail.

Например, передача следующей строки, как email адреса, позволяет внедрить в параметры -oQ и -X, которые будут обработаны программой sendmail:

-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().

Что нужно сделать, чтобы обезопасить приложение?

Учитывая, что уязвимости касаются только поля "От", вам нужно вспомнить, где в ваших приложениях пользователь может указать собственное значение для адреса отправителя. Чаще всего это используется в контактных формах и скриптах гостевых книг.

Если вы корректно валидируете email на этапе приёма его от пользователя, то эта уязвимость вас скорее всего и не коснётся.

Хорошей практикой является валидация данных сразу при приёме от пользователя, что помогает избежать обработки невалидных данных в других частях приложения, в том числе передачи сторонним библиотекам, которые могут оказаться уязвимыми.

Для Yii существует EmailValidator [9], который не пропускает адреса по примеру тех, которые использовались в данной уязвимости

Кроме того, в PHP существует нативная функцию filter_var(), которой можно проверить email. Например:

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

Автор: SilverFire

Источник [10]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/vulnerability/226921

Ссылки в тексте:

[1] PHPMailer: https://github.com/PHPMailer/PHPMailer

[2] SwiftMailer: http://swiftmailer.org/

[3] Уязвимость удалённого выполнения кода через PHPMailer: https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html

[4] Уязвимость удалённого выполнения кода через PHPMailer: https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html

[5] Уязвимость удалённого выполнения кода через SwiftMailer: https://legalhackers.com/advisories/SwiftMailer-Exploit-Remote-Code-Exec-CVE-2016-10074-Vuln.html

[6] патч: https://github.com/PHPMailer/PHPMailer/releases/tag/v5.2.20

[7] yii2-swiftmailer: https://github.com/yiisoft/yii2-swiftmailer

[8] mail(): http://php.net/manual/en/function.mail.php

[9] EmailValidator: http://www.yiiframework.com/doc-2.0/yii-validators-emailvalidator.html

[10] Источник: https://habrahabr.ru/post/318698/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best