PDA

Просмотр полной версии : Повышение привилегий в ядре Linux



ALEX(XX)
17.07.2009, 19:53
17 июля, 2009

Программа: Linux kernel 2.6.30

Опасность: Низкая

Наличие эксплоита: Да

Описание:
Уязвимость позволяет локальному пользователю повысить свои привилегии на системе.
Уязвимость существует из-за ошибки разыменования нулевого указателя в функции tun_chr_pool() в файле drivers/net/tun.c. Локальный пользователь может выполнить произвольный код на целевой системе с привилегиями учетной записи root. Для успешной эксплуатации уязвимости ядро должно быть собрано с опцией GCC -fdelete-null-pointer-checks".

URL производителя: www.kernel.org (http://www.securitylab.ru/bitrix/exturl.php?goto=http%3A%2F%2Fwww.kernel.porg)

Решение: Установите исправление из GIT репозитория производителя

securitylab.ru (http://www.securitylab.ru/vulnerability/382676.php)

Уязвимость в ядре Linux позволяет получить повышенные привилегии


Исходный код для эксплуатации весьма необычной уязвимости в ядре Linux был опубликован сегодня Бредом Спенглером (Brad Spengler) – автором модуля grsecurity.
Что же необычного в уязвимости, позволяющей просто повысить привилегии? Дело в том, что при обычном анализе исходного кода эту уязвимость практически невозможно обнаружить. Технические подробности этой ошибки немного сложны, но можно просто объяснить, что именно происходит. Уязвимый код находится в реализации net/tun. Вот что здесь происходит: разработчик инициализирует переменную (sk в примере ниже), и устанавливает ее в значение, которое может быть равно нулю. Разработчик корректно проверяет значение переменной на несколько строк ниже и если переменная равно 0 (нулю), возвращается ошибка. Код выглядит следующим образом:
struct sock *sk = tun->sk; // initialize sk with tun->sk

if (!tun)
return POLLERR; // if tun is NULL return error
Код выглядит корректно с первого взгляда. Но это до того, как компилятор начнет работать с этим кодом. При оптимизации кода, компилятор увидит, что значение переменной уже присвоено и просто удалит блок IF. Другими словами, компилятор создаст уязвимость в бинарном коде, которой не существует в исходном. Нововведение, произведенное компилятором, позволит ядру прочитать и записать данные по адресу 0x00000000, который атакующий затем сможет перенаправить в пространство пользователя и получить привилегии root на системе.
Опубликованный эксплоит способен обойти защиту разыменования нулевого указателя в ядре, на системах с SELinux и без него, и отключить SELinux/AppArmor/LSM/auditing.
Описание уязвимости доступно по адресу:
http://www.securitylab.ru/vulnerability/382676.php
Скачать эксплоит можно по адресу:
http://grsecurity.net/~spender/cheddar_bay.tgz (http://www.securitylab.ru/bitrix/exturl.php?goto=http%3A%2F%2Fgrsecurity.net%2F%7Es pender%2Fcheddar_bay.tgz)
Зеркало SecurityLab.ru
http://www.securitylab.ru/poc/382675.php


Видео с демонстрацией эксплоита:
http://www.youtube.com/watch?v=UdkpJ13e6Z0&feature=player_embedded

Lexxus
18.07.2009, 11:53
Уязвимость позволяет локальному пользователю повысить свои привилегии на системе

Я, конечно, сильно извиняюсь, но...
зачем такие сложности?:) Разве su (sudo su, sudo bash... ) отменили? :L

P.S. "Сплойт" пофиксили еще 2 недели назад :)

ALEX(XX)
18.07.2009, 12:10
Я, конечно, сильно извиняюсь, но...
зачем такие сложности?:) Разве su (sudo su, sudo bash... ) отменили? :L

P.S. "Сплойт" пофиксили еще 2 недели назад :)
Ну да.. То есть пришёл левый юзер, набрал sudo и сразу получиль права рута? Сочувствую, если у кого-то в системе это так

arcman
20.07.2009, 10:59
Для успешной эксплуатации уязвимости ядро должно быть собрано с опцией GCC -fdelete-null-pointer-checks".


А зачем такую опасную оптимизацию включать?
Она ВСЕ проверки указателей на NULL поубивает.

http://gcc.gnu.org/ml/gcc-help/2002-11/msg00133.html