The OpenNET Project / Index page

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

29.12.2016 09:37  В PHPMailer выявлена ещё одна критическая уязвимость, вызванная недоработкой в PHP

В библиотеке PHPMailer выявлена ещё одна критическая уязвимость (CVE-2016-10045), позволяющая выполнить свой код на сервере. Проблема устранена в выпуске PHPMailer 5.2.20. Уязвимость позволяет обойти метод защиты, реализованный для блокирования прошлой уязвимости, и касается не столько самого PHPMailer, сколько внутренних проблем с функцией mail() и средствами экранирования символов в PHP.

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

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



   $mail->SetFrom("\"Attacker\\' -Param2 -Param3\"@test.com", 'Client Name');

   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 реализовали дополнительную фильтрацию, которая может привести к прекращению обработки некоторых сложных email-адресов.

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

Следует отметить, что проблема не ограничивается PHPMailer и, например, вчера обнаружена (CVE-2016-10074) в другой популярной PHP-библиотеке SwiftMailer, которая используется в таких проектах, как Yii2, Laravel и Symfony. Несмотря на то, что разработчики были уведомлены о проблеме ещё 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]



  1. Главная ссылка к новости (http://openwall.com/lists/oss-...)
  2. OpenNews: Критическая уязвимость в PHPMailer, применяемом в WordPress, Drupal и Joomla
  3. OpenNews: Уязвимость в Roundcube Webmail, позволяющая выполнить код на сервере
  4. OpenNews: Новая версия почтового сервера Exim 4.88 с устранением уязвимостей
Лицензия: CC-BY
Тип: Проблемы безопасности
Ключевые слова: php, phpmailer
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение Линейный вид | Ajax | Показать все | RSS
 
  • 1.1, Аноним, 10:22, 29/12/2016 [ответить] [смотреть все]
  • +8 +/
    > Из-за особенностей PHP

    Не из-за "особенностей", а из-за его  "дизайна".

    [сообщение отредактировано модератором]

     
     
  • 2.2, Аноним, 10:25, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]
  • +/
    >Не из-за "особенностей", а из-за его  "дизайна".

    Это одно и то же.

     
     
  • 3.3, Аноним, 10:27, 29/12/2016 [^] [ответить] [смотреть все]
  • +/
    кэп - P S Народ совершенно перестал воспринимать сарказм без закадрового смех... весь текст скрыт [показать]
     
  • 3.4, Square1, 10:34, 29/12/2016 [^] [ответить] [смотреть все]  
  • –2 +/
    какие мы грозные а может все таки кривой RFC ... весь текст скрыт [показать]
     
     
  • 4.5, Неиилюзорная Фтопка Локалхоста, 10:36, 29/12/2016 [^] [ответить] [смотреть все]  
  • +17 +/
    Плохому программисту RFC мешает.
     
     
  • 5.6, Square1, 10:38, 29/12/2016 [^] [ответить] [смотреть все]  
  • –6 +/
    проблемы в данном случае- возникают из нелепого RFC Потом у что на практике - т... весь текст скрыт [показать]
     
     
  • 6.7, Аноним, 10:41, 29/12/2016 [^] [ответить] [смотреть все]  
  • +1 +/
    Ага знаем мы как ПХП разработчики перекладывают свои болезни на более квалифицир... весь текст скрыт [показать]
     
  • 6.8, Аноним, 10:44, 29/12/2016 [^] [ответить] [смотреть все]  
  • +/
    Ну перепишут sendmail как модуль расширения на си, доволен?
     
     
  • 7.30, Sw00p_aka_Jerom, 13:04, 29/12/2016 [^] [ответить] [смотреть все]  
  • +/
    Дык давно уже нужно было писать модуль для smtp, а не все подряд звать через exe... весь текст скрыт [показать]
     
     
  • 8.48, KonstantinB, 18:35, 29/12/2016 [^] [ответить] [смотреть все]  
  • –1 +/
    Такие модули есть такие и в phpmailer-е, и в swiftmailer-е Это не значит, что н... весь текст скрыт [показать]
     
     
  • 9.58, Sw00p aka Jerom, 16:20, 30/12/2016 [^] [ответить] [смотреть все]  
  • +/
    Речь шла о smtp модуле php написанном на С, а так на самом php любой модуль можн... весь текст скрыт [показать]
     
  • 6.21, angra, 12:46, 29/12/2016 [^] [ответить] [смотреть все]  
  • +6 +/
    Проблемы в данном случае возникают из-за того, что функция mail четвертым и пятым параметром принимает не значение одного аргумента как to, from и msg, которое сама экранирует и подставляет в sendmail, а произвольную строку в качестве _набора_ дополнительных аргументов для sendmail. А вот тут с экранированием возникают некоторые проблемы. Принимала бы вместо строки ассоциативный массив, не было бы проблем.


     
  • 6.47, KonstantinB, 18:33, 29/12/2016 [^] [ответить] [смотреть все]  
  • +4 +/
    Нет, проблема возникает из-за идиота, который писал реализацию mail() в PHP.
     
  • 5.11, Lander, 11:01, 29/12/2016 [^] [ответить] [смотреть все]  
  • +4 +/
    >Плохому программисту RFC мешает.

    В мемориз!!

     
     
  • 6.12, Аноним, 11:04, 29/12/2016 [^] [ответить] [смотреть все]  
  • +3 +/
    RFC трудились писали, переписывали много - пришли php кодеры и давай всех обгажи... весь текст скрыт [показать]
     
     
  • 7.14, Square1, 11:20, 29/12/2016 [^] [ответить] [смотреть все]  
  • –5 +/
    если вы пишите по стандарту и в результате получается жопа - то это проблема с... весь текст скрыт [показать]
     
     
  • 8.22, Аноним, 12:49, 29/12/2016 [^] [ответить] [смотреть все]  
  • +5 +/
    Если разработчики не могут безопасно реализовать стандарт, то это проблема разра... весь текст скрыт [показать]
     
     
  • 9.33, Sw00p_aka_Jerom, 13:11, 29/12/2016 [^] [ответить] [смотреть все]  
  • –5 +/
    Безопасно реализовать стандарт Эт как У вас рфс написано как это делать Ой п... весь текст скрыт [показать]
     
     
  • 10.36, Crazy Alex, 13:15, 29/12/2016 [^] [ответить] [смотреть все]  
  • +2 +/
    Эти символы и в именах файлов, например, разрешены И ничего, все живы до сих по... весь текст скрыт [показать]
     
     
  • 11.44, Sw00p aka Jerom, 17:44, 29/12/2016 [^] [ответить] [смотреть все]  
  • –1 +/
    ага слеш разрешён в качестве имени файла
     
  • 7.31, Sw00p_aka_Jerom, 13:07, 29/12/2016 [^] [ответить] [смотреть все]  
  • –1 +/
    Писали трудились, писаки что ли Покажите мне код где реализована эта фуллвая сп... весь текст скрыт [показать]
     
  • 7.57, Аноним, 06:25, 30/12/2016 [^] [ответить] [смотреть все]  
  • +1 +/
    это НЕ кодеры -- они даже PHP не осилили кодеры молча кодят и у них всё работа... весь текст скрыт [показать]
     
  • 6.13, Square1, 11:18, 29/12/2016 [^] [ответить] [смотреть все]  
  • –4 +/
    вы просто потакаете безответственности и халатности RFC подкладывающий мину за... весь текст скрыт [показать]
     
     
  • 7.23, angra, 12:49, 29/12/2016 [^] [ответить] [смотреть все]  
  • –2 +/
    Владимир Владимирович?
     
  • 7.26, Аноним, 12:58, 29/12/2016 [^] [ответить] [смотреть все]  
  • +5 +/
    При чем тут RFC, когда в PHP банально используют shell для запуска внешних проце... весь текст скрыт [показать]
     
  • 1.9, Аноним, 10:50, 29/12/2016 [ответить] [смотреть все]  
  • +/
    https://github.com/php/php-src/commit/8f4050709c833b9d42cd65349b7747f8e61d171f
     
     
  • 2.46, Sw00p aka Jerom, 17:52, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • –2 +/
    ext filter tests 058 phpt ver 238 , VER 206 ver 238 ve... весь текст скрыт [показать] [показать ветку]
     
  • 1.10, бедный буратино, 10:54, 29/12/2016 [ответить] [смотреть все]  
  • +/
    кучно пошли
     
  • 1.15, Онаним, 11:27, 29/12/2016 [ответить] [смотреть все]  
  • +2 +/
    Баг закрыли багом...
    Эпично!
     
     
  • 2.16, анан, 11:30, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    это же пхп что от них ожидали
     
  • 1.17, th3m3, 12:05, 29/12/2016 [ответить] [смотреть все]  
  • +/
    >>Из-за особенностей PHP

    И ведь, его такого особенного, ещё кто-то в 2017 будет юзать. Поздравляю ;)

     
     
  • 2.19, Аноним, 12:35, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    не кто то а большинство юзает и будет узать и кол-во пользователей будет толь... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.51, th3m3, 21:14, 29/12/2016 [^] [ответить] [смотреть все]  
  • +/
    Да, а вот Гугл Тренды с тобой не согласятся Для веба, будет стандартом де фак... весь текст скрыт [показать]
     
     
  • 4.53, Arcade, 23:51, 29/12/2016 [^] [ответить] [смотреть все]  
  • –1 +/
    Не знаю как где а у нас по Украине в этом году JavaScript отобрал третье место у... весь текст скрыт [показать]
     
  • 4.54, cmp, 00:24, 30/12/2016 [^] [ответить] [смотреть все]  
  • +/
    Угу, скорость у жс вменяемая, уникального ie больше нет, и пусть клиент сам себе... весь текст скрыт [показать]
     
  • 2.20, Аноним, 12:36, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • –3 +/
    не ктото а большинство
    а в будущем и все  перейдут на PHP
     
  • 2.32, Аноним, 13:07, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • –1 +/
    Например, все те миллионны форумов, которые используют phpBB https en wikipe... весь текст скрыт [показать] [показать ветку]
     
  • 1.18, Аноним, 12:19, 29/12/2016 [ответить] [смотреть все]  
  • +5 +/
    следующая новость ахтунг в php обнаружена уязвимость в функциях system и exec... весь текст скрыт [показать]
     
     
  • 2.24, Анонимен, 12:51, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    "О сколько нам открытий чудных готовит просвещенья дух!" (с)
     
  • 1.25, Аноним, 12:52, 29/12/2016 [ответить] [смотреть все]  
  • +/
    т.е. кто-то не фильтрует входящие данные, а виноват пхп? лол
     
     
  • 2.28, Аноним, 13:00, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • +2 +/
    Да, виноват PHP, так как входящие данные полностью соответствуют RFC ... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.34, Аноним, 13:14, 29/12/2016 [^] [ответить] [смотреть все]  
  • +1 +/
    ну так sql injection тоже проходит в стандарт, давайте теперь не будет проверять... весь текст скрыт [показать]
     
     
  • 4.39, рлрлро, 14:20, 29/12/2016 [^] [ответить] [смотреть все]  
  • +1 +/
    Дык, разработчкик PHP Mailer и проверяют данные, но...
     
  • 2.38, Аноним, 13:25, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • +4 +/
    Да, виноват похапе. Обезьяны не осилили exec() и продолжают юзать system()
     
  • 1.40, Тот самый, 14:53, 29/12/2016 [ответить] [смотреть все]  
  • +/
    Еще лет 15 назад я на всех своих серваках сделал симлинк /usr/sbin/sendmail на /bin/true, а почту из приложений передаю только по TCP 127.0.0.1:25. Лучшее лекарство от кретинов-программистов.

    Ах, какой я молодец!

     
     
  • 2.41, Тот самый, 15:06, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    А еще от php кодеров требуется серьезная защита В php ini обязательно должно бы... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.55, KonstantinB, 01:01, 30/12/2016 [^] [ответить] [смотреть все]  
  • +/
    В контексте этой новости в этот список еще надо добавить mail(). :-)
     
     
  • 4.56, ACDC, 01:19, 30/12/2016 [^] [ответить] [смотреть все]  
  • +/
    Я бы добавил disable_functions=* и забиндил пхп процесс на другой ЯзыкП.
     
  • 2.42, Аноним, 15:18, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • +1 +/
    угу, а когда тебе надо поставить что-то, что должно отправлять почту - ты сам бы... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.49, Arcade, 18:49, 29/12/2016 [^] [ответить] [смотреть все]  
  • –1 +/
    Бвахахаха У меня наоборот получилось Когда прогеры начали жаловаться что не вс... весь текст скрыт [показать]
     
  • 3.59, Тот самый, 00:02, 31/12/2016 [^] [ответить] [смотреть все]  
  • +/
    > админ локалхоста как есть...
    > они тебя даже спрашивать не будут - поставят задачу "починить отправку почты
    > из PHPMailer, срок исполнения - пять дней назад, потому что должно
    > было работать сразу". Это когда тебя повысят до админа не локалхоста
    > а чего-то что приносит деньги.

    Чегож с тебя так ядовитое дерьмо прет? Совсем неудачник по жизни? Соберись с силами и переломи!

     
  • 2.43, angra, 16:33, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    Действительно, не читать же в самом деле админу локалхоста системную почту.
     
  • 2.50, Arcade, 18:52, 29/12/2016 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    А я нихрена не делал, я подождал когда ко мне прийдут с вопросом "А почему нас постоянно банят за рассылку почты".
     
  • 1.60, Аноним, 05:11, 31/12/2016 [ответить] [смотреть все]  
  • +/
    Итак, исходя из куска кода mail new PHPMailer email_from attacker ... весь текст скрыт [показать]
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:


      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor TopList