The OpenNET Project / Index page

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

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

29.12.2016 09:37

В библиотеке 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
Тип: Проблемы безопасности
Короткая ссылка: https://opennet.ru/45779-php
Ключевые слова: php, phpmailer
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (54) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | 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, а не все подряд звать через exec.

    Пс: ответственость тут лежит пополам как на пхп, так и на хорошем примере как не надо писать рфс, рфс на все случаи жизни. Думаю нужно от таких рфс избавляться, ярчайщий пример безалаберства проектировщика


     
     
  • 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 подкладывающий "мину замедленного действия" - из -за недодуманности, или "и так сойдет" , или  "а давайте и эту хрень воткнем" - плохой RFC.

     
     
  • 7.23, angra (ok), 12:49, 29/12/2016 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Владимир Владимирович?
     
  • 7.26, Аноним (-), 12:58, 29/12/2016 [^] [^^] [^^^] [ответить]  
  • +5 +/
    > RFC подкладывающий "мину замедленного действия"

    При чем тут RFC, когда в PHP банально используют shell для запуска внешних процессов с передачей им списка аргументов в виде строки, вместо того чтобы выполнить exec с раздельной передачей аргументов. Это кривость рук чистой воды и стандарт никоим образом не должен её прикрывать.

    > из -за недодуманности, или "и так сойдет" , или  "а давайте и эту хрень воткнем" - плохой RFC.

    Возможность использование пробелов в недоменной части email ничем не хуже использования пробелов в недоменной части URL, и никто про кривость стандартов там никто и не подумает кричать, ибо привыкли к нормальному экранированию.


     

  • 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 +/
    > https://github.com/php/php-src/commit/8f4050709c833b9d42cd65349b7747f8e61d171f

    ext/filter/tests/058.phpt
    +'"verî.(),:;<>[]\".VERÎ.\"verî@\ \"verî\".unüsual"@strange.example.com',

    как бы намекают - какой длб будет использовать такой имейл, а мы всё же его валидируем )))) ппц маразм


     

  • 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:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

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