LINUX.ORG.RU

Интересная уязвимость в ядре Linux

 , ,


0

0

Автор проекта 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.

Более подробную информацию вы можете прочитать в комментариях к коду эксплойта.

Кстати, эту уязвимость уже активно обсуждает у нас в толксах.

>>> Эксплойт

★★★★

Проверено: boombick ()
Последнее исправление: Klymedy (всего исправлений: 1)
Ответ на: комментарий от nnz

>Автор сплойта просто пошутил, а я оценил его шутку.

Собственно, об авторе и речь ;)

Praporshik ★★
()
Ответ на: комментарий от Manhunt

> Мораль: любовь к низкоуровневым трюкам ни чем хорошим не заканчивается.

+ много-много

hobbit ★★★★★
()

в убунту студио патч уже пришел.

/thread

P.S. как всегда - все очень операивно в мире пингвина, форточкам и не снилось!

OzOx
()
Ответ на: комментарий от sergeil

> Очень криво написанный код. Должно быть:

Это понятно, как должно быть. Другой вопрос в том, что в ядре ещё довольно много подобного непонятного и страшного кода... :)

cruxish ★★★★
()
Ответ на: комментарий от cruxish

>ругой вопрос в том, что в ядре ещё довольно много подобного непонятного и страшного кода... :)

страшнее пенумбры?

registrant ★★★★★
()
Ответ на: комментарий от renat_gar

> Мандрива вот только что выпустила уже патчи: на все пульсы и на утилиты пульс аудио и билиотеки. Какие дистрибутивы тоже выпустили патчи?

Пока все красноглазят, те немногие, кто познал счастье мандирвы - сидят себе и работают, прикрутив dpkg и много_фич. Остальные спорят какой дистр лучше. Лучше тот про который нету холиваров. Mandriva & Arch rulez.

А по сабжу... Проясните про RHEL5_SUCKS в теле новости)))) Тонко, тонко...

opium_inside
()

cc -fPIC -fno-stack-protector -shared -o exploit.so exploit.c
exploit.c: Assembler messages:
exploit.c:455: Error: Incorrect register `%rax' used with `l' suffix

С -m64 таже фигня. Я как раз юзал 2.6.30 из sid, на всякий случай репортанул багца, а также скачал и установил пакет с сайта. У меня сид отключен конечно же, а старый пакет удолил так что х.з. тот же самый пакет или нет.

Debian stable и testing не подвержены угрозе как я понял.

yurikoles ★★★
()
Ответ на: комментарий от dilmah

> лялих, как обычно, поtunул в говнище..

Толстенный пятизвёздочный тролль, скорее ловите для кунст-камеры!

sv75 ★★★★★
()
Ответ на: комментарий от sv75

коллега, его не ловить, его ловить и пить надо!
представляете как выдержан тролль о пяти звездах?

ergil ★★★
()
Ответ на: комментарий от opium_inside

>Лучше тот про который нету холиваров

Вывод неверный. Нет холиваров про те дистрибы, которые наф никому не сдались. Mandriva & Arch глючное говно для школьников.

Deleted
()

А для чего вообще пульсаудио нужно? Оно мне постоянно вешало звук/видео, если два приложения со звуком одновременно открыть, я его и удалил... Проблемы исчезли, новых неудобств не появилось..

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

>Оно мне постоянно вешало звук/видео, если два приложения со звуком одновременно открыть, я его и удалил...

А у меня в mplayer пауза работала через раз :( Пока не удалил.

Capture
()

А если целиковая сборка? (без модулей)

Sb0y
()

>struct sock *sk = tun->sk;

>Этот код не вызывает ошибок даже если tun == NULL, и не является сам по себе уязвимостью.

А собственно почему? Кто-нить может объяснить? (раньше думал, что знаю С. видимо был не прав)

Qasta
()

>>-DRHEL5_SUCKS я пацтол)

интересно сколько еще людей поставит себе руткит под видом эксплойта? )

fooser
()
Ответ на: комментарий от pv4

>> struct sock *sk = tun->sk;
>> Этот код не вызывает ошибок даже если tun == NULL, и не является сам по себе уязвимостью.

>А кто-нибудь может объяснить, почему разыменование нулевого указателя больше не является ошибкой?

+1

тыкие высказывания (в новости) называются софизмом ( http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%84%D0%B8%D0%B7%D0%BC ) .

с такимже успехом (как и разыменование нулевого указателя это не ошибка) -- "все числа равны":

> Возьмём два разных числа, такие что:
>
>    a < b
>
> Тогда существует такое c > 0, что:
>
>    a + c = b
>
> Умножим обе части на (a − b), имеем:
>
>    (a + c)(a − b) = b(a − b)
>
> Раскрываем скобки, имеем:
>
>    a^2 + ca − ab − cb = ba − b^2
>
> cb переносим вправо, имеем:
>
>    a^2 + ca − ab = ba − b^2 + cb
>    a(a + c − b) = b(a − b + c)
>    a = b
>

эксплоит в исходном коде математики? :DDDD теперь осталось только новость запостить...

mkfifo
()
Ответ на: комментарий от mkfifo

>> А кто-нибудь может объяснить, почему разыменование нулевого указателя больше не является ошибкой?

> +1

> тыкие высказывания (в новости) называются софизмом ( http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%84%D0%B8%D0%B7%D0%BC ) .

Найди в Википедии разницу между ошибкой и эксплойтом.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Найди в Википедии разницу между ошибкой и эксплойтом.

признаю-- про математику -- сказал чушь :DDD..
[под действием впечатленний говнокода, где сначало сделали действие а потом проверили можно было ли делать такие действия]

mkfifo
()
Ответ на: комментарий от Lockal

> Для тех, кто не понял, почему tun->sk всегда работает, см. http://alenacpp.blogspot.com/2009/05/delete-this.html

ну и почему?

вот тут есть например пример:


class CBase
{
  int m_i;
public:
  CBase() : m_i (0){}
  void printBase() { cout<<"CBase"<<endl; }
};

int main()
{
  CBase* b = NULL;
  b->printBase();
  return 0;
}


где 

b->printBase(); -- это _вызов_функции_ а не обращение к _данным_

однако в 
struct sock *sk = tun->sk;
sk - это явно обычные данные (указатель на структуру)


почемуэто tun->sk работает всегда ? %) %) %) %)

mkfifo
()

>nnz (*) (17.07.2009 16:43:34)
>Проверено: boombick (*) 17.07.2009 19:19:06
>.....Таким образом, ничто не мешает злоумышленнику заставить ядро обращаться по нулевому адресу. Имеем классическую null pointer dereference vulnerability.....


http://www.linux.org.ru/jump-message.jsp?msgid=3871010&cid=3878442

.....ядро Линукса пока надо патчить чтобы оно сегодня знало что такое:
.....
* Защита против эксплуатации всех пустых указателей ptr выявляющая ошибки.
.....

А Brad Spengler +1000000000000000000000 за то что показывает это вам на реальных примерах. Линус Торвальдс не желает интегрировать патчи укрепляющие безопасность Линукс в ядрро так как развитие корректно написанного, безопасного ядра будет более сложным, и вызовет дополнительные замедления в гонки с дырявым мастдаем... Тоже относится к ГНУ и их gcc, glibc и binutils.

Холивары по поводу какой дистр лучший сводятся к ответу на вопрос: "Сколько ВЫ знаете дистров сегодня заботящихся о безопасности в свете этих недавних уязвимостей с переполнением буфера в разных приложениях и багах ядра "null pointer dereference vulnerability" и многих других?

Дебиан Адамантикс - в анабиозе Остался только один дистр ГНУ/Линукса и OpenBSD...

GNUFun
()
Ответ на: комментарий от cruxish

>> Очень криво написанный код. Должно быть:

>Это понятно, как должно быть. Другой вопрос в том, что в ядре ещё довольно много подобного непонятного и страшного кода... :)

+100

"Другой вопрос" единственный в этом треде вопрос, который уважаемый Автор проекта grsecurity, Brad Spengler хотел чтобы ВЫ себе задали публикуя даную уязвимость и эксплоит к ней!!!!!

GNUFun
()
Ответ на: комментарий от GNUFun

Настало время, когда утверждение - "под Linux (пока) нет вирусов, а силу его низкой популярности", приобретает зловещий смысл

А кто виноват?

valich ★★★
()
Ответ на: комментарий от Deleted

>Вывод неверный. Нет холиваров про те дистрибы, которые наф никому не сдались. Mandriva & Arch глючное говно для школьников.

О повелитель локалхоста. Склоняюсь пред твоим могуществом. Арч говно для школьников. Аминь. Да будет так вовеки. Вы случайно не гентушник?

opium_inside
()
Ответ на: комментарий от Deleted

> Mandriva & Arch

Ставить Mandriva и Arch в один ряд - это круто. Это как сравнение Boeing 747 и B2 Spirit.

cruxish ★★★★
()
Ответ на: комментарий от ChALkeR

Хотя где-то и так, как у меня было, пишут.

ChALkeR ★★★★★
()

Не долго парясь можно сразу ставить под сомнение правильность оптимизации компилятором, базовые проблемы монолитных ядер.

yantux
()
Ответ на: комментарий от mkfifo

>почемуэто tun->sk работает всегда ? %) %) %) %)

Вполне возможно, что нулевой адрес доступен в режиме ядра и в переменную просто запишется мусор по маленькому адресу.

halyavin
()
Ответ на: комментарий от halyavin

> Вполне возможно, что нулевой адрес доступен в режиме ядра и в переменную просто запишется мусор по маленькому адресу

но тем не менее lint ругается на вышеозначенный код.

cruz7 ★★
()
Ответ на: комментарий от halyavin

я просто вот-что думаю.

[..если не прав -- поправети меня(?)..]

вот если "в режиме ядра" можно вытворять "неправильные" манипуляции, то нада осознавать что эти манипуляции являются _ХАКОМ_ .

компилятор (как сказано в новости) отсеивал последущую проверку tun==NULL , так как определял выше-стоящую инициализацию (которая была ХАКОМ)..

..таким образом -- итог:
автор "говнокода" использовал хак , но хак не сработал..

так в чём тогда была ошибка автора "говнокода"(?).
...в том что ненадо-было использовать хаки(?).
...или в том что если использовать хаки то нада использоваться их в тех условиях в которых они работают (режим без оптимизации в данном случае) (?).

mkfifo
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.