В ядре FreeBSD 6.x — 7.x обнаружена критическая уязвимость
Как сообщает Przemyslaw Frasunek, известный специалист в сфере безопасности, в ядре FreeBSD 6.x обнаружена уязвимость, позволяющая получить права root любому непревлилгированному процесу.
Уязвимость была найдена в интерфейсе уведомлений о событиях kqueue, которая приводит к разыменованию null-указателя в в ядре. Рабочий эксплойт позволяет запускать любой процесс с привилегиями root, разместив его в странице памяти с указателем на этот адрес — 0×0.
Информация об уязвимости поступила в сообщество FreeBSD 29 Августа 2009 года, но была проигнорирована.
К сожалению неясно, в каких точно версиях имеется эта уязвимость. Изначально были затронуты версии 6.0-6.4, но мне удалось успешно запустить эксплоит на версии 7.2.
Учитывая, что в nginx недавно была обнаружена уязвимость, позволяющая удаленно выполнять запуск кода с правами nginx, комбинация этих двух уязвимостей может привести к тому, что на FreeBSD с работающим nginx будет скомпроментирован root.
P.S. По этическим причинам ссылка на рабочий эксплоит убрана с блога.
P.P.S. По просьбам посетителей опубликован патч ядра FreeBSD:
/*
Patch for this vulnerability, as in CVS:
--- src/sys/kern/kern_descrip.c 2006/09/04 10:30:09 1.279.2.8
+++ src/sys/kern/kern_descrip.c 2006/09/29 18:30:48 1.279.2.9
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/kern/kern_descrip.c,v 1.279.2.8 2006/09/04 10:30:09 pjd Exp $");
+__FBSDID("$FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/kern/kern_descrip.c,v 1.279.2.9 2006/09/29 18:30:48 jmg Exp $");
#include "opt_compat.h"
#include "opt_ddb.h"
@@ -2602,7 +2602,7 @@ static int
badfo_kqfilter(struct file *fp, struct knote *kn)
{
- return (0);
+ return (EBADF);
}
static int
*/


(15 голосов, средний: 3.80 из 5)

Сентябрь 17th, 2009 at 8:24
Посмотрел на нескольких машинах в исходниках разной старости. Везде EBADF возвращается. Отсюда мораль: либо это совсем свежая дыра, либо её никогда не было. Эксплойт не сработал.
Сентябрь 17th, 2009 at 9:28
> но мне удалось успешно запустить эксплоит на
> версии 7.2.
что тогда исправляет приведённый в вашем сообщении патч, если эти изменения были внесены ещё в 2006 году?
Сентябрь 17th, 2009 at 16:10
> uname -rs
FreeBSD 7.2-STABLE
> cat /usr/src/sys/kern/kern_descrip.c | grep FBSDID
__FBSDID («$FreeBSD: src/sys/kern/kern_descrip.c,v 1.313.2.19 2009/07/14 19:48:31 jhb Exp $»);
> less /usr/src/sys/kern/kern_descrip.c | /kqfilter
badfo_kqfilter (struct file *fp, struct knote *kn)
{
return (EBADF);
}
Поздравляем с удачной криоразморозкой.
Сентябрь 18th, 2009 at 11:09
укажите в таком случае больше информации о багрепорте и о номере уязвимости.
в исходниках версии 7.0 нет никакого return (0) в функции badfo_kqfilter в строке 2638, там как и в патче return (EBADF);
вероятно речь идет о очень старых версиях, старее чем @38
__FBSDID («$FreeBSD: src/sys/kern/kern_descrip.c,v 1.313.4.1 2008/02/14 11:45:41 simon Exp $»);
Сентябрь 18th, 2009 at 17:14
В новости сказано — «Versions 7.1 and and beyond are not vulnerable.», так что непонятно как у вас мог сработать эксплоит на 7.2.
kern_descrip.c в 7.1 имеет версию «$FreeBSD: src/sys/kern/kern_descrip.c,v 1.313.2.10.2.2 2008/12/06 20:36:46 peter Exp $», патч бесполезен — там и так «EBADREF» в возврате прописан.
Сентябрь 20th, 2009 at 14:56
Посмотрел исходники от FreeBSD 6.3...в файле kern_descrip.c везде стоит return (EBADF);
Новость попахивает бульварной прессой...
Октябрь 11th, 2009 at 16:46
Привет, что-то я иничего не понял. Как именно это действует