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 ()

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

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

/thread

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

OzOx ()
Ответ на: Re: Интересная уязвимость в ядре Linux от sergeil

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

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

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

cruxish ★★★★ ()
Ответ на: Re: Интересная уязвимость в ядре Linux от cruxish

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

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

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

registrant ★★★★★ ()

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

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

dilmah ★★★★★ ()
Ответ на: Re: Интересная уязвимость в ядре Linux от renat_gar

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

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

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

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

opium_inside ()

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

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 ★★★ ()
Ответ на: Re: Интересная уязвимость в ядре Linux от dilmah

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

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

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

sv75 ★★★★★ ()
Ответ на: Re: Интересная уязвимость в ядре Linux от opium_inside

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

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

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

Deleted ()

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

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

LightDiver ★★★★★ ()
Ответ на: Re: Интересная уязвимость в ядре Linux от LightDiver

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

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

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

Capture ()

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

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

Sb0y ()

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

>struct sock *sk = tun->sk;

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

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

Qasta ()

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

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

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

fooser ()
Ответ на: Re: Интересная уязвимость в ядре Linux от pv4

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

>> 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 ()
Ответ на: Re: Интересная уязвимость в ядре Linux от mkfifo

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

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

> +1

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

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

tailgunner ★★★★★ ()
Ответ на: Re: Интересная уязвимость в ядре Linux от tailgunner

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

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

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

mkfifo ()
Ответ на: Re: Интересная уязвимость в ядре Linux от Lockal

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

> Для тех, кто не понял, почему 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 ()

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

>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 ()
Ответ на: Re: Интересная уязвимость в ядре Linux от cruxish

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

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

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

+100

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

GNUFun ()
Ответ на: Re: Интересная уязвимость в ядре Linux от GNUFun

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

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

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

valich ★★★ ()
Ответ на: Re: Интересная уязвимость в ядре Linux от Deleted

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

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

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

opium_inside ()

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

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

yantux ()
Ответ на: Re: Интересная уязвимость в ядре Linux от mkfifo

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

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

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

halyavin ()
Ответ на: Re: Интересная уязвимость в ядре Linux от halyavin

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

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

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

cruz7 ()
Ответ на: Re: Интересная уязвимость в ядре Linux от halyavin

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

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

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

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

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

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

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

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