Надо, полюбас надо. Делается быстро и несложно. Эксплойт тож очень простой. И очень стрёмный. Точняк, надо сюда добавить в качестве памятки.
Итак. 1-го декабря было опубликовано сообщение о критической локальной уязвимости FreeBSD. Почти сразу же вышел и эксплоит. Уязвимость невероятно дурацкая, так что эксплоит офигенно простой.
Копируем получившуюся библиотеку в темп - [code]cp w00t.so.1.0 /tmp/w00t.so.1.0[/code] После чего запускаем первый файл ./env
В случае, если фря дырявой версии, видим примерно следующее [code]%./env env.c: In function 'main': env.c:5: warning: incompatible implicit declaration of built-in function 'malloc' env.c:9: warning: incompatible implicit declaration of built-in function 'strcpy' env.c:11: warning: incompatible implicit declaration of built-in function 'execl' /libexec/ld-elf.so.1: environment corrupt; missing value for /libexec/ld-elf.so.1: environment corrupt; missing value for /libexec/ld-elf.so.1: environment corrupt; missing value for /libexec/ld-elf.so.1: environment corrupt; missing value for /libexec/ld-elf.so.1: environment corrupt; missing value for /libexec/ld-elf.so.1: environment corrupt; missing value for ALEX-ALEX #[/code] Приглашение командной строки стало # - мы под рутом. Привилегии проверяем #uname -a;id;
В выводе будет присутствовать euid=0(root). Короче, пипец. Кто бы никем тот стал всем :-) Уязвимые версии:
“
FreeBSD 8.0-RELEASE *** VULNERABLE (уязвима) FreeBSD 7.1-RELEASE *** VULNERABLE (уязвима) FreeBSD 6.3-RELEASE *** NOT VULN (нифига не уязвима) FreeBSD 4.9-RELEASE *** NOT VULN (нифига не уязвима)
”
Теперь как от этого безобразия защититься. Можно вот таким макаром: [code]% cd /usr/src/libexec/rtld-elf/ % fetch http://people.freebsd.org/~cperciva/rtld.patch % cat rtld.patch | patch -p1 % make && make install && make clean[/code]
У меня на 7.1 данный патч не сработал, пришлось руками. Описание есть на Хабре. Подходит для фри версий 7.1-7.2
Ищем файл rtld.c Он должен лежать в /usr/src/libexec/rtld-elf На всяк случай сохраняем его куда-нибудь. После чего ищем в rtld.c кусок кода [code] if (!trust) { unsetenv(LD_ "PRELOAD"); unsetenv(LD_ "LIBMAP"); unsetenv(LD_ "LIBRARY_PATH"); unsetenv(LD_ "LIBMAP_DISABLE"); unsetenv(LD_ "DEBUG"); } [/code] Меняем его на [code]if (!trust) { // unsetenv(LD_ "PRELOAD"); // unsetenv(LD_ "LIBMAP"); // unsetenv(LD_ "LIBRARY_PATH"); // unsetenv(LD_ "LIBMAP_DISABLE"); // unsetenv(LD_ "DEBUG"); if (unsetenv(LD_ "PRELOAD") || unsetenv(LD_ "LIBMAP")|| unsetenv (LD_ "LIBRARY_PATH") || unsetenv(LD_ "LIBMAP_DISABLE") ||unsetenv(LD_ "DEBUG") || unsetenv(LD_ "ELF_HINTS_PATH")) { _rtld_error("environment corrupt; aborting"); die(); } }[/code] После чего собираем и устанавливаем #make && make install
Если теперь попробовать запустить эксплоит то увидим [code]$ ./env /libexec/ld-elf.so.1: environment corrupt; missing value for /libexec/ld-elf.so.1: environment corrupt; aborting [/code] Вуаля, дырка закрыта.
SysCat Воскресенье, 6 Декабря, 2009 12:25 цитировать ссылка на коммент
SysCat Воскресенье, 6 Декабря, 2009 20:09 цитировать ссылка на коммент
cd /usr/src/libexec/rtld-elf/
fetch http://people.freebsd.org/~cperciva/rtld.patch
cat rtld.patch | patch -p1
make && make install && make clean
Gol Воскресенье, 6 Декабря, 2009 22:21 цитировать ссылка на коммент