Обнаружена уязвимость, позволяющая получить привилегии суперпользователя в связке FreeBSD и ftpd/proftpd

В публичном доступе появился рабочий эксплойт, позволяющи получить удаленно рута в FreeBSD, если там запущен ftpd или proftpd. Более подробная информация по ссылке http://lists.grok.org.uk/pipermail/full-disclosure/2011-November/084372.html

Для запуска требуется указать логин и пароль юзера, который имеет chroot в ftpd и которому разрешено создавать в этом корне файлы /etc/nsswitch.conf и /lib/nss_compat.so.1. Туда заливается код, заливает туда код, который, будучи запущенным от рута, через ptrace подключается к inetd/syslogd/cron вне chroot и внедряет в них код, который открывает TCP-коннект от рута обратно к машине атакующего на заранее указанный порт, который там должен слушать nc -l или аналог и даёт root shell уже вне chroot. Подгружает /lib/nss_compat.so.1 сама libc, в ней уязвимость.

Против взлома кроме фильтрации доступа к порту 21 или через /etc/hosts.allow, ещё помогает либо полностью запретить юзеру запись в свой домашний каталог (можно оставить право на запись в существующие подкаталоги), либо запретить создавать /etc/nsswitch.conf и /lib/nss_compat.so.1 в домашнем каталоге юзера: touch etc lib && chflags uchg etc lib

Для штатного ftpd и ftp-пользователей, не имеющих другого доступа на запись к своему домашнему каталогу (через samba/http/whatever) есть и другое временное решение, не требующее что-либо менять в домашних каталогах пользователей: патч на ftpd, позволяющий администратору задавать гибкие ограничения в зависимости от логина пользователя и IP-сети, из которой он подключился. Он доступен по ссылке ttp://www.grosbein.net/freebsd/patches/ftpd-restr-0.2.tbz

После приложения патча, для защиты от данной дырки:

В /etc/login.conf поменять для класса default строчку:
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\
на строчку:
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES,NOMKD=/etc=0.0.0.0/0;/lib=0.0.0.0/0:\
Перегенерировать /etc/login.db командой cap_mkdb /etc/login.conf
После этого через ftpd будет нельзя создавать каталоги /etc и /lib и как временное решение это позволит спокойно прожить до официального исправления.

Для массового хостинга будет полезен скрипт, который запрещает создавать директории в качестве временного решения:

awk -F: "{print $6}" /etc/passwd | sort -u | xargs -n 1 -I . sh -c "[ -d . ] && [ ! -O . ] && cd . && touch etc lib && chflags uchg etc lib"

Будьте бдительны!