The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"В PHPMailer выявлена ещё одна критическая уязвимость, вызван..."
Отправлено opennews, 29-Дек-16 10:22 
В библиотеке PHPMailer выявлена (https://legalhackers.com/advisories/PHPMailer-Exploit-Remote...) ещё одна критическая уязвимость (CVE-2016-10045), позволяющая выполнить свой код на сервере. Проблема устранена в выпуске PHPMailer 5.2.20 (https://github.com/PHPMailer/PHPMailer/releases). Уязвимость позволяет обойти метод защиты, реализованный для блокирования прошлой уязвимости (https://www.opennet.ru/opennews/art.shtml?num=45774), и касается не столько самого PHPMailer, сколько внутренних проблем с функцией mail() и средствами экранирования символов в PHP.

Напомним, что уязвимость в PHPMailer позволяла через передачу специально оформленного адреса отправителя, корректного и полностью соответствующего RFC 3696 (https://tools.ietf.org/html/rfc3696), организовать передачу дополнительных аргументов утилите /usb/sbin/sendmail, запускаемой по умолчанию при вызове PHP-функции mail(). Для атаки используется  опция "-X", позволяющая записать тело сообщения в переданный в качестве аргумента файл (игнорируется в реализациях утилиты sendmail от проектов Postfix и Exim). Так как формально атака осуществляется через корректный email-адрес, проходящий проверку на предмет соответствия требованиям RFC 3696, при выпуске первого исправления для блокирования уязвимости был добавлен дополнительный вызов escapeshellarg(), производящий экранирование аргументов, передаваемых в функцию mail().


Из-за особенностей PHP данная защита оказалась (https://github.com/PHPMailer/PHPMailer/wiki/About-the-CVE-20...) неэффективной. В частности, для защиты от подстановки дополнительных shell-команд в функции mail() уже применяется экранирование итоговой команды через escapeshellcmd(). Добавленное разработчиками PHPMailer экранирование отдельных аргументов при помощи escapeshellarg() привело к некорректному двойному экранированию спецсимволов, в результате которого на выходе остаётся рабочая команда. Например, попытка отправки по адресу "\"Attacker\\' -Param2 -Param3\"@test.com" приводит к следующей расстановке аргументов при вызове функции mail():


   Arg no. 0 == [/usr/sbin/sendmail]
   Arg no. 1 == [-t]
   Arg no. 2 == [-i]
   Arg no. 3 == [-f\"Attacker\\\]
   Arg no. 4 == [-Param2]
   Arg no. 5 == [-Param3"@test.com']

Так как выполнение escapeshellcmd(escapeshellarg($address)) ломает всю защиту и штатными средствами устранить уязвимость через экранирование символов оказалось невозможно, разработчики PHPMailer  решились на нарушение совместимости с RFC 3696 и в версии PHPMailer 5.2.20 реализовали (https://github.com/PHPMailer/PHPMailer/commit/06aae8b651aa4a...) дополнительную фильтрацию, которая может привести к прекращению обработки некоторых сложных email-адресов.


В ходе разработки исправления был поднят пласт проблем (https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9...) с функциями escapeshellcmd() и scapeshellarg(), поведение которых отличается для разных платформ и локалей. Кроме mail(),  escapeshellcmd() также вызывается в некоторых других PHP-функциях, что мешает применению для них escapeshellarg() для экранирования отдельных аргументов. При включении Safe mode число таких функций расширяется, что создаёт дополнительные скрытые подводные камни при обеспечении безопасности (при включении safe mode защита через  escapeshellarg для некоторых функций PHP перестаёт работать). По мнению разработчиков PHPMailer для полноценного устранения проблемы требуется внутренняя переработка функции  mail() в PHP, в которой следует вместо строки $additional_parameters подставляемой в выполняемую команду использовать массив отдельных аргументов и обеспечить запуск sendmail напрямую, а не через shell.


Следует отметить, что проблема не ограничивается PHPMailer и, например, вчера обнаружена (https://legalhackers.com/advisories/SwiftMailer-Exploit-Remo...) (CVE-2016-10074) в другой популярной PHP-библиотеке SwiftMailer (http://swiftmailer.org/), которая используется в таких проектах, как Yii2 (https://github.com/yiisoft/yii2-swiftmailer), Laravel (https://laravel.com/docs/5.1/mail) и Symfony (http://symfony.com/doc/current/email.html). Несмотря на то, что разработчики были уведомлены о проблеме ещё 2 декабря, исправление до сих пор не выпущено и последний выпуск SwiftMailer 5.4.5-dev остаётся уязвимым. Метод эксплуатации полностью аналогичен уязвимости в PHPMailer.


   $email_from = '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php "@email.com';

   Arg no. 0 == [/usr/sbin/sendmail]
   Arg no. 1 == [-t]
   Arg no. 2 == [-i]
   Arg no. 3 == [-fattacker\]
   Arg no. 4 == [-oQ/tmp/]
   Arg no. 5 == [-X/var/www/cache/phpcode.php]
   Arg no. 6 == ["@email.com]


URL: http://openwall.com/lists/oss-security/2016/12/28/4
Новость: http://www.opennet.ru/opennews/art.shtml?num=45779

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру