Тема: Уязвимость в Linux Kernel 2.6.28.3
$eq}I{iI{ [Off] [#] (20.07.2009 / 09:01) |
Brad Spengler, автор grsecurity, набора патчей к Linux ядру для увеличение безопасности, опубликовал эксплоит, использующий для повышения привилегий локального пользователя в системе (активность SELinux не влияет на работу эксплоита), неисправленную уязвимость в Linux ядре 2.6.30, вызванную судя по всему ошибкой в оптимизаторе компилятора GCC.
---
Автор проекта grsecurity, Brad Spengler, опубликовал эксплойт, использующий очень интересную уязвимость в ядре Linux (драйвер net/tun).Специфика этой уязвимости состоит в том, что уязвимость отсутствует в исходном коде, но присутствует в бинарном. Как такое возможно? Давайте рассмотрим это на примере. Все начинается с того, что происходит инициализация указателя sk:
Код
struct sock *sk = tun->sk;
Этот код не вызывает ошибок даже если tun == NULL, и не является сам по себе уязвимостью.Несколькими строками ниже происходит проверка инициализации указателя tun:
Код
if (!tun)
return POLLERR;
Казалось бы, теперь все правильно. Злодей не пройдет.Но! При сборке кода компилятор полагает, что указатель tun уже корректно инициализирован и, оптимизируя код, выкидывает проверку факта инициализации (приведенный выше оператор if). Таким образом, ничто не мешает злоумышленнику заставить ядро обращаться по нулевому адресу. Имеем классическую null pointer dereference vulnerability.
Обнаруженная уязвимость позволяет злоумышленнику обойти ограничения SELinux/AppArmor, вызвать крах ядра либо выполнить произвольный код с рутовыми привилегиями.
Представленный сплойт протестирован на ядрах версий 2.6.30 с SELinux и без, а также на 2.6.18 (RHEL5, собирать с опцией -DRHEL5_SUCKS). Для успешной работы данного сплойта необходимо наличие на машине PulseAudio и подгруженного модуля tun.