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

Автор модуля grsecurity продемонстрировал эксплуатацию ошибки разыменования нулевого указателя и получение привилегий root на системе.

Исходный код для эксплуатации весьма необычной уязвимости в ядре 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

Видео с демонстрацией эксплоита:


или введите имя

CAPTCHA
Страницы: 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  
96729
17-07-2009 14:48:45
Да это же просто праздник какой-то! (с) )))))) Щщас начнётся!
0 |
84763
17-07-2009 15:33:02
ой, что щас будет................... срача страниц на 10!!!!!!!!!!!!
0 |
asd
17-07-2009 15:41:18
Лuнуспокaпец++ капча: 93202
0 |
linux user
17-07-2009 15:47:15
Хм еще для успешного запуска эксплоита нужен PULSEAUDIO
0 |
хех
17-07-2009 16:19:10
это только пример, подвержено уязвимости сотни приложений которые юзают tun... ошибка то при компиляции кода
0 |
46632
17-07-2009 18:25:16
Судя по всему http://www.gentoo.org/security/en/glsa/glsa-200907-13.xml к ядру это не имеет никакого отношения
0 |
89557
17-07-2009 18:16:43
ага... особенно на сервере! кстати, судя по крипту этот PULSEAUDIO убивается в первую очередь. Может просто чтобы понять работать с SeLinux'ом или нет? --------------------------------------
0 |
88148
17-07-2009 15:43:55
да еще и в пятницу! просто манна небесная. срачу зеленый свет!!!!11111
0 |
95410
19-07-2009 02:10:44
Вы только обратите внимание, здесь выложено видео! да не просто видео, а работа в консоли!!! ну просто, порно для Линуксоида...
0 |
29-07-2009 13:15:13
Фап-фап-фап.
0 |
Антилинакс
17-07-2009 14:49:08
Вот и хвалёная безопасность вашего линакса и гцц. Надо было использовать компилер от интела и не парить мозг с изобретением своего велосипеда.
0 |
39411
17-07-2009 14:55:25
В винде раз в 100 больше подобных уязвимостей, и причем они еще не найдены.
0 |
Пришелец из будущего
17-07-2009 14:58:05
В винде раз в 100 больше подобных уязвимостей, и причем они еще не найденыПруфлинк?
0 |
18368
20-07-2009 05:22:27
В линаксе еще больше уязвимостей не найдено!!!
0 |
29-07-2009 13:15:46
Жгёшь.
0 |
23-07-2009 13:20:30
для справки бестолковым мастдайщикам - интел регулярно передает код для проектов xfree и gcc.так что их код там есть и немало очень...
0 |
73331
17-07-2009 14:59:48
уязвимости закрывают в линуксах моментально, в отличии от дырявой венды, годами с одими и теми же дырами
0 |
asd
17-07-2009 15:35:57
Да, да, да, ты еще расскажи, что есть исходный код, который можно поправить, я спрошу: лично ты это сможешь? Ты конечно же сядешь на жопу и начнешь нести левый бред...
0 |
anonymous
17-07-2009 15:47:01
Ниасиляторы Си детектед. // 08148
0 |
asd
17-07-2009 15:59:24
Я крнечно не гуру в С++, но этот код какой то безгмоздлый: struct sock *sk = tun->sk; // initialize sk with tun->sk … if (!tun) return POLLERR; // if tun is NULL return error Сперва переменной sk присваивается некое значение поля объекта tun, а затем проверяется не равен ли этот объект null? где логика? кто украл логику?
0 |
20645
17-07-2009 16:03:41
Тупейшая и детская ошибка в коде, разыменование указателя до его проверки на NULL. А компилятор удалил проверку, так как увидел, что указатель уже разыменовали и значит как будто это не NULL.
0 |
asd
17-07-2009 16:06:23
ну вот и я о том же, и это считается мега профессиональный код?
0 |
03449
17-07-2009 16:18:42
программ без ошибок не бывает в принципе, в том числе и такие тупые бывают ошибки
0 |
asd
17-07-2009 16:26:30
Да я С++ учил 2 года назад и то увидил этот косяк, а как же кодер который это писал, читал С++ для чайников и паралельно кодил?
0 |
wind0ze_uzer
17-07-2009 17:31:09
Не вижу ни одного разыменования указателя! В первой строчке всего лишь присваивание значения sk из структуры tun к только что объявленной переменной sk! Ни один компилятор не удалит проверку if (!pointer). Это фигня какая-то.
0 |
Alex
18-07-2009 16:31:57
Никакой тут фигни нет. Компилятор вполне обоснованно удалил проверку, так-как она никогда не сработает. Посмотрите на код ниже. Если tun будет равен нулю, то до if программа просто не дойдет, она сразу же, на стадии инициализации, вывалится в exception. ----------------------------------------- struct sock *sk = tun->sk; // initialize sk with tun->sk … if (!tun) return POLLERR; // if tun is NULL return error -----------------------------------------
0 |
KG
20-07-2009 14:51:51
Сходите по ссылкам и почитайте багрепорт на git.kernel.org Ошибка действительно детская: инициализация переменной без праверки валиности указателя. struct sock *sk = tun->sk; без проверки приводит к неправильным последствиям. Правда проверка не могла быть удалена ( если коомпилятор не на -O3 пускать ) потому что никто не гарантировал что tun не нулевой. А вот исправление ошибки с гита ( чтобы подумали ) --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -486,12 +486,14 @@ static unsigned int tun_chr_poll(struct file *file, poll_table * wait) {         struct tun_file *tfile = file->private_data;         struct tun_struct *tun = __tun_get(tfile); -       struct sock *sk = tun->sk; +       struct sock *sk;         unsigned int mask = 0;         if (!tun)                 return POLLERR; +       sk = tun->sk; +         DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name);         poll_wait(file, &tun->socket.wait, wait);
0 |
pascal
17-07-2009 18:36:50
а во всем виноват С++... без него небыло стольких проблем!!! -----------------------------
0 |
.NET - наше все
18-07-2009 07:22:55
а во всем виноват С++... без него небыло стольких проблем!!! я так тоже думаю!!!
0 |
neuron
19-07-2009 17:06:46
А каким боком тут C++ ?? Линус Торвальдс после таких заявлений точно не уснёт сегодня )))
0 |
Cраный Перец
27-07-2009 03:13:10
ха... видать ты не знаешь, благодаря чему существует большинство ошибок переполнения в программах... И благодаря кому процветает хакерство. благодаря С/С++, который ничего не проверяет, в отличие от того же Паскаль.
0 |
Линупс Торвальц
28-07-2009 17:17:02
Почитайте, что я думаю насчет С++ http://article.gmane.org/gmane.comp.version-control.git/57918
0 |
Линупс Торвальц
28-07-2009 17:18:56
Вот вам цитата из моих высказываний насчет С++ C++ is a horrible language. It's made more horrible by the fact that a lot of substandard programmers use it, to the point where it's much much easier to generate total and utter crap with it. Quite frankly, even if the choice of C were to do *nothing* but keep the C++ programmers out, that in itself would be a huge reason to use C.
0 |
Юрий
26-07-2009 13:20:25
Ну-ну... В Винде - в отличае от Люникса - вирусы вообще неживут, я зп роследние 1-ть лет ни одного невидел... а уж хакерам тем более непозубам - сверх-безопасность Windows... Чего только стоят: брандмауэр, Защита от переполнения буфера, Защитник Windows, Контроль учётных записей, Разграничние доступа файловой системы, Шифрование файлов файловой системы и т.д.... Люниксу, на мой взгляд, ещё в ближайшие лет 10 - даже не доплюнуть до безопасности Windows... Здесь даже и говорить неочем... Сравнивать Люникс с Windows - тоже самое, что: паровоз с метро...
0 |
30-07-2009 17:01:59
Жопе слова не давали! ------------------------------------------------
0 |
30506
17-07-2009 15:04:05
Ура! Наконец-то бравые ребята взялись за Linux.
0 |
someone
17-07-2009 15:04:39
У меня не заработал -(( [hikaru@ote cheddar_bay]$ ls -l total 40 -rwxr--r-- 1 hikaru hikaru 252 2009-07-14 01:02 cheddar_bay.sh -rw-r--r-- 1 hikaru hikaru 31337 2009-07-14 01:04 exploit.c -rw-r--r-- 1 hikaru hikaru 764 2009-07-11 21:15 pwnkernel.c [hikaru@ote cheddar_bay]$ ./cheddar_bay.sh pulseaudio: no process killed ./cheddar_bay.sh: line 11: ./pwnkernel: No such file or directory [hikaru@ote cheddar_bay]$
0 |
Чукча
17-07-2009 15:08:49
Буга га га , однако , пшел ф сад -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
0 |
sometwo
17-07-2009 15:20:43
Теперь проверь комп на руткты. И в следующий раз прежде чем компилить эксплойт просматривай исходник, а то "rm -rf /*" выполнишь сам не зная того.
0 |
111
18-07-2009 04:24:47
а виртуальные машины?)))))) ну и rm ) пофик. ведь есть копия чистенького образа.... п.с. вин проги тоже не мешает на них проверять
0 |
Вячеслав
17-07-2009 15:24:34
Для начала - откомпилить надо! 2) pulseaudio в примере.
0 |
ftp
18-07-2009 12:59:32
аналогично. дистриб - федора 8. pulseaudio: no process killed ./cheddar_bay.sh: line 11: ./pwnkernel: No such file or directory
0 |
Страницы: 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15