27 марта 2013 в 16:30

Уязвимость нулевого дня в roundcube из песочницы

Есть много разного полезного софта, который присутствует на большинстве хостингов. Например, стандартом de-facto является phpmyadmin, отсутствие которого пользователи не поймут и не оценят.

Для почты такое “приложение по умолчанию” — roundcube.

Сегодня мы поговорим о уязвимости zero-day, которая отдает в руки злоумышленнику всю почту ваших пользователей


Традиционно считается, что такие популярные скрипты не могут содержать сколько-нибудь значимых уязвимостей. Да, возможно XSS, может быть CSRF, это неприятно, но сложно эксплуатируется и к утечке серьезных данных в большинстве случаев не приводит.

Мы проектировали shared-hosting с полным пониманием того, что наши клиенты крайне чувствительны к любым нарушениям безопасности. Не должно быть ни явных ни потенциальных угроз. Тем не менее, с некоторых пор мы наблюдали статистически значимое увеличение жалоб на доступ посторонних лиц к FTP.

Было проверено всё — начиная с внутренней безопасности, заканчивая любыми вариантами утечек через биллинг, от самих пользователей и т.д.

В какой-то момент стало ясно, что утечка идёт из почтовой системы и скорее всего из её веб-части.

Паттерн эксплуатации крайне странный — взломщик получает пароль от базы roundcube, через phpmyadmin вытаскивает оттуда сессии, получает из сессий пароли к почте. Причем, сессии roundcube шифрует, а значит доступ есть и к ключу шифрования.

Найти уязвимость помогло частичное протоколирование POST-запросов:

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:
else if ($RCMAIL->action == 'save-pref') {
 include INSTALL_PATH . 'program/steps/utils/save_pref.inc';
}


program/steps/utils/save_pref.inc:
$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.

Патч для временного затыкания дыры:

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 и т.д. Фактически этой уязвимости подвержены большинство современных хостингов.

Счастья вам. Будьте бдительны.

Update 28.03.2013
Патч от разработчиков
Патчи для других версий — http://sourceforge.net/news/?group_id=139281&id=310497
Версия 0.8.6, исправляющая уязвимость — http://roundcube.net/download
+63
22954
76
netguard 6,5

Комментарии (26)

+1
zudabi, #
Молодцы, что заморочились и раскопали. А о каком шаред-хостинге речь? Не рекламы для, интереса ради (можно в личку), как раз сейчас перебираю варианты.
0
Coder, #
Судя по куску лога ddos-guard.net.
+1
cronfy, #
Спасибо за информацию.
+8
librarian, #
Разработчикам уже сообщили?
0
netguard, #
Тикет у разработчиков уже есть:
trac.roundcube.net/ticket/1489021
0
cronfy, #
И коммит с фиксом уже наблюдается: github.com/roundcube/roundcubemail/commit/e1d9b4824c1e5750dfbf51dc1c8b2d54cf0895c3
0
zerkms, #
Вот только 500 ошибку — зря они выбрасывают
0
Zante, #
Проверили версию 0.8.4 вот что вывело:

SERVICE CURRENTLY NOT AVAILABLE!
Error No. [501]
0
vstaf, #
Поправил у себя, спасибо!)
0
datacompboy, #
А с какой версии ошибка появилась? У меня там такой код:
// save preference value
else if ($RCMAIL->action == 'save-pref') {
  $RCMAIL->user->save_prefs(array(get_input_value('_name', RCUBE_INPUT_POST) => get_input_value('_value', RCUBE_INPUT_POST)));
  $OUTPUT->reset();
  $OUTPUT->send();
}
0
datacompboy, #
и "$_SESSION[$" вообще найти не могу по шкрубику.
0
netguard, #
$RCMAIL->user->save_prefs(array(get_input_value('_name', RCUBE_INPUT_POST) => get_input_value('_value', RCUBE_INPUT_POST))


Перезапишет любой конфиг $_POST['_name'] на $_POST['_value'], так что наверное давно появилось
0
datacompboy, #
ага, вижу. спасибо.
+2
equand, #
Не проще ли die('oops');?
+1
netguard, #
Для быстрого затыкания уязвимости — безразлично
0
eZzZz, #
Версия 0.8.1. Такая же срань.
Заткнул дырку временно…
Спасибо.
–7
Nordvind, #
Офигеть, даже не проверять ввод юзера… Секьюрные приложения на пхп такие секьюрные.
+2
ranzhe, #
Ну и причем тут php? Нет, я понимаю, что уже довольно давно многие решили, что проблемы безопасности php-приложений — это проблемы безопасности самого php, но давайте все-таки смотреть на вещи трезво?
0
Nordvind, #
Проблемы среднего уровня разработчиков на данном языке.
–1
ranzhe, #
del (я буду читать пост до конца перед отправкой комментария)
0
eZzZz, #
Из твиттера:

We just published new releases which fix a recently reported vulnerability that allows an attacker to access files on the server. Please update your installations with the new versions or patch them with the fix which is also published in the downloads section or our sourceforge.net page.
+1
litos, #
Выпустили апдейт 0.8.6
официальная новость и патчи для других версий тут sourceforge.net/news/?group_id=139281&id=310497

(думаю автору хорошо было бы добавить к статье)
0
netguard, #
Пост обновил с актуальными ссылками
0
J_o_k_e_R, #
Спасибо! Обновляюсь до 0.8.6. Баг в гентушной багзилле: bugs.gentoo.org/show_bug.cgi?id=463554
0
Neuronix, #
Браво! Последнее время редко встречаю сообщения о таких дырках.
0
Theo_from_Sed, #
Блин, ну молодцы же! Раскопали, поделились…

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.