Исходный код для эксплуатации весьма необычной уязвимости в ядре 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
Зеркало SecurityLab.ru
http://www.securitylab.ru/poc/382675.php |