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 мешает.

    проблемы в данном случае- возникают из нелепого RFC. Потом у что на практике - то что RFC допускает - не используется в 99,99999% случаев.

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


     
  • 6.47, KonstantinB (ok), 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 +/
    > RFC трудились писали, переписывали много - пришли php кодеры и давай всех
    > обгаживать.

    если вы пишите "по стандарту" и в результате получается жопа - то это проблема стандарта а не кодеров.

     
     
  • 8.22, Аноним (-), 12:49, 29/12/2016 [^] [ответить]    [к модератору]  
  • +5 +/
    Если разработчики не могут безопасно реализовать стандарт, то это проблема разработчиков, а не стандарта.
     
     
  • 9.33, Sw00p_aka_Jerom (ok), 13:11, 29/12/2016 [^] [ответить]     [к модератору]  
  • –5 +/
    Безопасно реализовать стандарт Эт как У вас рфс написано как это делать Ой п... весь текст скрыт [показать]
     
     
  • 10.36, Crazy Alex (ok), 13:15, 29/12/2016 [^] [ответить]     [к модератору]  
  • +2 +/
    Эти символы и в именах файлов, например, разрешены И ничего, все живы до сих по... весь текст скрыт [показать]
     
     
  • 11.44, Sw00p aka Jerom (?), 17:44, 29/12/2016 [^] [ответить]    [к модератору]  
  • –1 +/
    ага слеш разрешён в качестве имени файла
     
  • 7.31, Sw00p_aka_Jerom (ok), 13:07, 29/12/2016 [^] [ответить]    [к модератору]  
  • –1 +/
    Писали трудились, писаки что ли? Покажите мне код где реализована эта фуллвая спека рфс

     
  • 7.57, Аноним (-), 06:25, 30/12/2016 [^] [ответить]    [к модератору]  
  • +1 +/
    > пришли php кодеры и давай всех обгаживать.

    это НЕ кодеры -- они даже PHP не осилили.  кодеры молча кодят и у них всё работает.

     
  • 6.13, Square1 (?), 11:18, 29/12/2016 [^] [ответить]     [к модератору]  
  • –4 +/
    вы просто потакаете безответственности и халатности RFC подкладывающий мину за... весь текст скрыт [показать]
     
     
  • 7.23, angra (ok), 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, бедный буратино (ok), 10:54, 29/12/2016 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    кучно пошли
     
  • 1.15, Онаним (?), 11:27, 29/12/2016 [ответить] [показать ветку] [···]    [к модератору]  
  • +2 +/
    Баг закрыли багом...
    Эпично!
     
     
  • 2.16, анан (?), 11:30, 29/12/2016 [^] [ответить]    [к модератору]  
  • +/
    это же пхп что от них ожидали
     
  • 1.17, th3m3 (ok), 12:05, 29/12/2016 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    >>Из-за особенностей PHP

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

     
     
  • 2.19, Аноним (-), 12:35, 29/12/2016 [^] [ответить]    [к модератору]  
  • +/
    не кто то а большинство.
    юзает и будет узать.
    и кол-во пользователей будет только увеличиваться.
    гдето недавно проскакивала статистика увеличения роста востребовааности PHP.

     
     
  • 3.51, th3m3 (ok), 21:14, 29/12/2016 [^] [ответить]    [к модератору]  
  • +/
    Да, а вот Гугл Тренды с тобой не согласятся :)
    Для веба, будет стандартом де факто - js. Вот увидишь.
    Можешь скринить.
     
     
  • 4.53, Arcade (ok), 23:51, 29/12/2016 [^] [ответить]    [к модератору]  
  • –1 +/
    Не знаю как где а у нас по Украине в этом году JavaScript отобрал третье место у PHP.
     
  • 4.54, cmp (ok), 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.wikipedia.org/wiki/PhpBB

     
  • 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 обязательно должно быть:
    disable_functions=popen,set_time_limit,passthru,system,exec,proc_open,shell_exec,proc_close,symlink
     
     
  • 3.55, KonstantinB (ok), 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 (ok), 18:49, 29/12/2016 [^] [ответить]    [к модератору]  
  • –1 +/
    Бвахахаха.

    У меня наоборот получилось. Когда прогеры начали жаловаться что не вся почта доходит и пых тормозит я им сказал перестать пользовать sendmail, показал в сторону PHPMailer и создал аккаунт для авторизации на почтовом сервере. ЧЯДНТ?

    Потом ещё помог сделать базовую очередь отправки сообщений через базу и крон.

     
  • 3.59, Тот самый (?), 00:02, 31/12/2016 [^] [ответить]    [к модератору]  
  • +/
    > админ локалхоста как есть...
    > они тебя даже спрашивать не будут - поставят задачу "починить отправку почты
    > из PHPMailer, срок исполнения - пять дней назад, потому что должно
    > было работать сразу". Это когда тебя повысят до админа не локалхоста
    > а чего-то что приносит деньги.

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

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

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


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