|
|
LOCAL ROOT на всех BSD системах
В январе 1997 года один из аналитиков по безопасности нашел уязвимость в *BSD's procfs коде, при использование которой вы могли получить права root практически на любой BSD системе. Эксплоит работал на интерфейсе /proc/pid/mem . С тех пор ядра BSD систем содержат простейший фикс, который должен закрывать эту дыру. К несчастью, и спустя 3-ти года возможно использовать /proc/pid/mem , чтобы получить права root'а, хотя это делается более сложным и грамотным способом.
Эта уязвимость присутствует практически во всех ядрах, на которых работают OpenBSD и FreeBSD. Так же, второе условие, чтобы эксплоит работал, нужно чтобы procfs было смонтировано. По умолчанию в FreeBSD 3.3 procfs смонтировано, а в OpenBSD 2.6 НЕТ! Но многие администраторы монтируют procfs, для нормальной работы сервера.
Эксплоит 1997 года для procfs был очень простой. Непривелигированный процесс А отключал процесс Б. А открывал /proc/pid/mem, а Б запускал setuid бинарик. Хотя теперь Б имеет другой euid, в отличии от А, А может контролировать память Б через /proc/pid-of-B/mem дискриптор. Следовательно, А можнет изменить Б'шный поток на исполнение в произвольную сторону.Чтобы остановить эксплоит, добавили дополнительную проверку к коду, ответственному за I/O в файловых дескрипторах, ссылающихся на procfs псевдофайлы. В miscfs/procfs/procfs.h мы видим:
/*
* Check to see whether access to target process is allowed
* Evaluates to 1 if access is allowed.
*/
#define CHECKIO(p1, p2) \
((((p1)->p_cred->pc_ucred->cr_uid == (p2)->p_cred->p_ruid) && \
((p1)->p_cred->p_ruid == (p2)->p_cred->p_ruid) && \
((p1)->p_cred->p_svuid == (p2)->p_cred->p_ruid) && \
((p2)->p_flag & P_SUGID) == 0) || \
(suser((p1)->p_cred->pc_ucred, &(p1)->p_acflag) == 0))
Как мы видим, процесс выполняющий I/O (p1) должен иметь такой же uid как и конечный процесс p2, если же p1 имеет рутовый права, то- Если же мы может обмануть setuid программу Х, чтобы она писала в файловый дискриптор F отсылаемый на procfs объект. Проверка, которую вы видите выше, не проверяет Х на вписывание... Как не сложно догадаться дальше, выходную часть программы мы тоже можем перехватить и, следовательно, отослать её какой то код.
Простой эксплоит, который вы увидите ниже, использует /bin/passwd, но может использоваться любая setuid программа. Эксплоит тестировался на FreeBSD 2.8/3.0/3.3 и OpenBSD 2.4/2.5/2.6
Вскоре после этого вышел и "офицальный фикс" для procfs самой BSD: его можно скачать с ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-00:02/procfs.patch http://www.openbsd.org/errata.html#procfs
Эксплоит берите тут:
http://www.void.ru/news/0001/procfs.c
Hell_man
Team Void
|
|