Pull to refresh

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

Reading time 3 min
Views 36K
Есть много разного полезного софта, который присутствует на большинстве хостингов. Например, стандартом 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
Tags:
Hubs:
+63
Comments 26
Comments Comments 26

Articles