В списке рассылки Full-Disclosure опубликован (http://seclists.org/fulldisclosure/2011/Nov/452) эксплоит, позволяющий удалённому злоумышленнику выполнить на сервере код с правами root, при условии если у атакующего имеется рабочий пользовательский аккаунт в системе, работа которого ограничена домашней директорией через помещение в chroot (во FreeBSD ftpd используется /etc/ftpchroot). Уязвимости также подвержены анонимные FTP-серверы, на которых пользователь имеет возможность записи в директорию /home или в /lib и /etc (например, системы анонимной загрузки файлов с доступным на запись корнем). Наличие уязвимости подтверждено в ftpd из состава FreeBSD 8.2 и в ProFTPD (http://www.proftpd.org/), включая последний выпуск 1.3.4a.
Уязвимость в ftpd вызвана (http://lists.freebsd.org/pipermail/freebsd-security/2011-Nov...) отсутствием проверки на сочетание uid=0 и euid!=0, что приводит к попыткам загрузки библиотеки /lib/nss_compat.so при выполнении /bin/ls после вызова коман...URL: http://seclists.org/fulldisclosure/2011/Nov/452
Новость: http://www.opennet.me/opennews/art.shtml?num=32450
уж сколько раз твердили миру...
уверен, что его использует больше половины пользователей этого ресурса(
Вроде все уже на vsftpd сидят. Не?
> Вроде все уже на vsftpd сидят. Не?Увы, иногда proftpd нужен из-за всяких свистелок и перделок вроде шейперов, аутентификации из базы, виртуальных юзеров, конвертеров кодировок... это как апач: тоже дофига функционала, тоже находят всякие дырки, но отказаться от него сложно.
Ну, положим, более часто используемые фичи из данного списка, такие как виртуальные юзеры и аутентификация через базу или что-то еще (через pam) в vsftpd есть..
> Ну, положим, более часто используемые фичи из данного списка, такие как виртуальные
> юзеры и аутентификация через базу или что-то еще (через pam) в
> vsftpd есть..ftpasswd есть ???
> Увы, иногда proftpd нужен из-за всяких свистелок и перделок вроде...наличия недокументированного режима ремотного администрирования, etc :))
> Разместив фиктивную библиотеку "~/lib/nss_compat.so.1"
> в домашней директории и создав "~/etc/nsswitch.conf"Ух ты, почти как в виновсе с подгрузкой dll из сетевых шар. А что, бсда грузит либы откуда попало, как винда? oO
Ух ты, почти как в любой вашей программе, в которой путь не забит жёстко в полную длинну. Пофиг, линуховая она или не очень.
Путь как раз забит жестко в полную длину, в том и цимес.
Вероятно по вашему ~/lib/nss_compat.so.1 это и есть "полная длинна" ?
> Вероятно по вашему ~/lib/nss_compat.so.1 это и есть "полная длинна" ?Вы даже текста новости не поняли. Используется /lib/nss_compat.so.1. Почему /, а не ~ - оставляю в качестве простенького самостоятельного задания.
Точно, совсем не понял, почему /, если в новости написано "Разместив фиктивную библиотеку "~/lib/nss_compat.so.1" в домашней директории". У вас /home симлинк на / ? Я вас поздравляю
"пользовательский аккаунт, работа которого ограничена домашней директорией через помещение в chroot" (с) новость
Вы знаете, что такое chroot? Если да, то вы новость читали?
> Я вас поздравляюА я вас поздравляю, вы спалились на том что по нулям в системных вопросах.
Попутно для исторической справедливости придется посыпать голову пеплом и отозвать наезд не по делу: действительно, при чруте ~/lib ... станет для того что в нем уже /lib/... и вот тогда уже все ок, т.е. загрузка либы из "правильной" локации. Так что сравнение с виндами которые по дурости своей грузят либы из текущей диры было все-таки некорректным.
> Ух ты, почти как в любой вашей программе, в которой путь не
> забит жёстко в полную длинну. Пофиг, линуховая она или не очень.К сожалению вы эпично спалились на готовности называть черное белым если это "выгодно". Нате вам заслуженный минус. Мне правда их тоже навесили и за дело - тупанул насчет chroot, прочитав сначала по диагонали и попав глазом на путь в хомяке.
> что ограничивает его работу директорией пользователя.Обойти чрут имеючи root - не больно какая наука.
Пример ? При условии, что файловые деcкрипторы, связанные с вне закрыты.
Методы подобные http://www.bpfh.net/simes/computing/chroot-break.html уже много лет не работают, так как по крайнеё мере в Linux и FreeBSD реализация chroot поправлена на предмет таких атак.
> Пример ? При условии, что файловые деcкрипторы, связанные с вне закрыты.Руту можно почти все. Все сисколы к его услугам. С таким же успехом можете пытаться удержать слона на поводке для моськи.
> Руту можно почти все. Все сисколы к его услугам. С таким же
> успехом можете пытаться удержать слона на поводке для моськи.Подробнее, подробнее. Общими фразами не отделайтесь. Какие системные вызовы позволят выйти за пределы chroot и как именно ? Повторяю, старые лазейки уже много лет в Linux и FreeBSD прикрыты, если вы знайте те, что не прикрыты, вы обладайте информацией о новой zero-day уязвимости.
> вы обладайте информацией о новой zero-day уязвимости.То что рут может админить систему и в хвост и в гриву - это уязвимость?!? Инихренасебе отжиг!
Вы что, издеваетесь?
Делаете mknod соответствующего блочного устройства. Читаете таблицу разделов, монтируете.. делаете что хотите.. Сколько раз делал это из чрута во время исправления систем и тому подобного.
> Вы что, издеваетесь?
> Делаете mknod соответствующего блочного устройства. Читаете таблицу разделов, монтируете..
> делаете что хотите.. Сколько раз делал это из чрута во время
> исправления систем и тому подобного.Так и запишем, голословные догадки.
PS. mknod при chroot не сработает.
> PS. mknod при chroot не сработает.Так и запишем, голословные догадки.
так и запишем - не компетентен.
- под freebsd - давно запрещено создавать device node на обычной файловой системе.
там есть devfs, который не осилили в linux - сделав костыль ввиде udev.
> там есть devfs, который не осилили в linux - сделав костыль ввиде udev.А нас - легион, ой, то-есть, рать! Так, на подумать, попробуйте от рута дернуть сисколы примерно так (воссоздадим ситуацию что мы в чруте и проверим, фигле):
main()
{
chroot(to_path_you_wish); // only root can chroot()
kill(pid_of_some_valuable_system_process, SIGKILL); // а пофиг что из chroot :P
}Чего-то оно работает. А то что доступа в / нет - может и черт с ним, да?
А можно и более интересные сисколы подергать. Ну а как насчет чего-нибудь пофункциональнее, например ptrace? Или в фре таки как-то законопатили сие начинание?
> - под freebsd - давно запрещено создавать device node на обычной
> файловой системе.Создавать-то можно, только работать оно не будет.
А вот смонтировать где угодно еще один экземпляр devfs - никаких проблем (там, конечно, есть примитивная защита, но она защищает только от случайных ошибок администратора и легко выносится).> там есть devfs, который не осилили в linux - сделав костыль ввиде udev.
LOL, devfs. От нее в линуксе отказались лет десять назад, перейдя на более прямое и удобное решение (udevd). Кстати, во фре сейчас используется костыль devd, который сильно отстает от udev по фичам.
В общем, так и запишем - не компетентен.
>[оверквотинг удален]
>> файловой системе.
> Создавать-то можно, только работать оно не будет.
> А вот смонтировать где угодно еще один экземпляр devfs - никаких проблем
> (там, конечно, есть примитивная защита, но она защищает только от случайных
> ошибок администратора и легко выносится).
>> там есть devfs, который не осилили в linux - сделав костыль ввиде udev.
> LOL, devfs. От нее в линуксе отказались лет десять назад, перейдя на
> более прямое и удобное решение (udevd). Кстати, во фре сейчас используется
> костыль devd, который сильно отстает от udev по фичам.
> В общем, так и запишем - не компетентен.Новый udev требует смонтированную devtmpfs:
udev on /dev type devtmpfs (rw,nosuid,...)Смонтировать его несколько раз - не проблема.
Как и /proc/ с его kmem.
> Повторяю, старые лазейки уже много лет в Linux и FreeBSD прикрыты, если вы знайте те, что не прикрыты, вы обладайте информацией о новой zero-day уязвимости.Очень смешно, ага.
Вы еще скажите, что там прикрыты старые лазейки для rm -rf / от рута.
> Вы еще скажите, что там прикрыты старые лазейки для rm -rf / от рута.А зачем? just for fun же.
> А зачем? just for fun же.Никто и не спорит. Просто не надо называть штатную возможность системы "уязвимостью нулевого дня".
Например ?
1) mknod
2) mount
3) ???
4) PROFIT !!!
Не взлетит.
man mknod
As of FreeBSD 6.0 device nodes may be created in regular file systems but such nodes cannot
be used to access devices.
> Не взлетит.
> man mknod
> As of FreeBSD 6.0 device nodes may be created in regular file
> systems but such nodes cannot
> be used to access devices.Взлетит, надо только правильно devfs смонтировать =)
> Взлетит, надо только правильно devfs смонтировать =)Это мне напомнило один баян про алгоритм выстрела себе в ногу на разных языках программирования.
И в общем-то мы с удовольствием посмотрим на ваше дополнение к статье с рабочим экземплом.
> Это мне напомнило один баян про алгоритм выстрела себе в ногу на
> разных языках программирования.А мне это напомнило очевидный тупняк. Чрут не защищает от рута. Он вообще не задумывался как средство безопасности, так что если вы очень уж хотите оным от чего-то защищаться, надо хотя-бы права рута сбросить, став из рута обычным юзером через setuid()/setgid() (без прав рута сискол chroot() вообще не срабатывает, btw).
А тут как раз хацкер с несброшенными правами рут, т.е. жесть как она есть. Никакой чрут от такого орла не защитит.
Есть один способ выхода за chroot, но для этого до входа в chroot должен быть открыт левый дескриптор. Т.е. атака актуальна, когда есть возможность контролировать этап перехода в chroot. Для ситуации с ftpd он не будет работать.Алгоритм примерно такой
root = open("/", O_RDONLY)
chroot(/chroot)
fchdir(root)
chdir("..")
chroot(".")
в итоге новый chroot теперь совпадает со старым корнем.
Что мешает руту создать ноду и смонтировать корень в папку внутри chroot jail? или загрузить модуль ядра свой?
Я не экспериментировал, т.к. на работе сейчас, но думаю что получится.
> Что мешает руту создать нодухотя бы то, что /dev недоступен из chroot
Если речь идёт именно о chroot (как в новости), а не jail. chroot != jail.
> хотя бы то, что /dev недоступен из chrootС рутовыми правами - это легко лечится.
Находясь в chroot или jail нельзя смонтировать devfs. Это надо делать _до_ chroot или jail
> Находясь в chroot или jail нельзя смонтировать devfs. Это надо делать _до_ chroot или jailС правами обычного пользователя - да.
>> Находясь в chroot или jail нельзя смонтировать devfs. Это надо делать _до_ chroot или jail
> С правами обычного пользователя - да.Впрочем, обычно флаг user для devfs не ставят. Так что обычный пользователь не может монтировать devfs нигде, а рут может, где хочет.
Хороший эксплоит. Я у себя потестил, и мог свободно просматривать /etc/master.passwd вне chroot.
Непонятно одно: а зачем ВООБЩЕ FreeBSD'шному FTPd программа /bin/ls? И вообще, любой исполняемый бинарь внутри FTP root'а?У меня там ничего исполняемого нет, и всё работает. ЧЯДНТ?
> Непонятно одно: а зачем ВООБЩЕ FreeBSD'шному FTPd программа /bin/ls? И вообще, любой исполняемый бинарь внутри FTP root'а?
> У меня там ничего исполняемого нет, и всё работает. ЧЯДНТ?А кто сказал, что /bin/ls берется из chroot?
А откуда он может браться после chroot?
Мне вот только одно непонятно: кому (т.е. какому процессу) требуется либа /lib/nss_compat.so.1 ? + само название либы странное (не /lib/libnss_compat.so), да и нету такого в 9.0РС2...
Читаем ман _внимательно_
Потом читаем ман внимательно в SunOS
никто не подскажет название музыки в ролике?
http://www.youtube.com/watch?v=ndFdy37DhRg
Спасибо.
> да и нету такого в 9.0РС2...Yjdость внимательно читаем - "Наличие уязвимости подтверждено в ftpd из состава FreeBSD 8.2"
8-ки у меня уже нету, но честно скажу, сомневаюсь чтобы во фряхе были вообще когда-либо в /lib/ либы, имена которых не lib*.so
У меня в 8.2 нет такого:
[gate:~]# ls -l /lib/
total 6662
drwxr-xr-x 2 root wheel 512 22 фев 2011 geom
-r--r--r-- 1 root wheel 41984 22 фев 2011 libalias.so.7
-r--r--r-- 1 root wheel 4820 22 фев 2011 libalias_cuseeme.so
-r--r--r-- 1 root wheel 4104 22 фев 2011 libalias_dummy.so
-r--r--r-- 1 root wheel 9312 22 фев 2011 libalias_ftp.so
-r--r--r-- 1 root wheel 6916 22 фев 2011 libalias_irc.so
-r--r--r-- 1 root wheel 6232 22 фев 2011 libalias_nbt.so
-r--r--r-- 1 root wheel 6564 22 фев 2011 libalias_pptp.so
-r--r--r-- 1 root wheel 4920 22 фев 2011 libalias_skinny.so
-r--r--r-- 1 root wheel 8184 22 фев 2011 libalias_smedia.so
-r--r--r-- 1 root wheel 6272 22 фев 2011 libavl.so.2
-r--r--r-- 1 root wheel 10484 22 фев 2011 libbegemot.so.4
-r--r--r-- 1 root wheel 123372 22 фев 2011 libbsdxml.so.4
-r--r--r-- 1 root wheel 53296 22 фев 2011 libbsnmp.so.5
-r--r--r-- 1 root wheel 1155172 22 фев 2011 libc.so.7
-r--r--r-- 1 root wheel 91060 22 фев 2011 libcam.so.5
-r--r--r-- 1 root wheel 32104 22 фев 2011 libcrypt.so.5
-r--r--r-- 1 root wheel 1432616 22 фев 2011 libcrypto.so.6
-r--r--r-- 1 root wheel 47900 22 фев 2011 libctf.so.2
-r--r--r-- 1 root wheel 18832 22 фев 2011 libdevstat.so.7
-r--r--r-- 1 root wheel 480368 22 фев 2011 libdtrace.so.2
-r--r--r-- 1 root wheel 88608 22 фев 2011 libedit.so.7
-r--r--r-- 1 root wheel 47172 22 фев 2011 libgcc_s.so.1
-r--r--r-- 1 root wheel 16820 22 фев 2011 libgeom.so.5
-r--r--r-- 1 root wheel 23436 22 фев 2011 libipsec.so.4
-r--r--r-- 1 root wheel 6540 22 фев 2011 libipx.so.5
-r--r--r-- 1 root wheel 18280 22 фев 2011 libjail.so.1
-r--r--r-- 1 root wheel 10172 22 фев 2011 libkiconv.so.4
-r--r--r-- 1 root wheel 32780 22 фев 2011 libkvm.so.5
-r--r--r-- 1 root wheel 121692 22 фев 2011 libm.so.5
-r--r--r-- 1 root wheel 61600 22 фев 2011 libmd.so.5
-r--r--r-- 1 root wheel 265624 22 фев 2011 libncurses.so.8
-r--r--r-- 1 root wheel 319888 22 фев 2011 libncursesw.so.8
-r--r--r-- 1 root wheel 32160 22 фев 2011 libnvpair.so.2
-r--r--r-- 1 root wheel 182668 22 фев 2011 libpcap.so.7
-r--r--r-- 1 root wheel 201708 22 фев 2011 libreadline.so.8
-r--r--r-- 1 root wheel 5956 22 фев 2011 libsbuf.so.5
-r--r--r-- 1 root wheel 7344 22 фев 2011 libssp.so.0
-r--r--r-- 1 root wheel 76668 22 фев 2011 libthr.so.3
-r--r--r-- 1 root wheel 10852 22 фев 2011 libufs.so.5
-r--r--r-- 1 root wheel 4672 22 фев 2011 libumem.so.2
-r--r--r-- 1 root wheel 56832 22 фев 2011 libutil.so.8
-r--r--r-- 1 root wheel 31176 22 фев 2011 libuutil.so.2
-r--r--r-- 1 root wheel 71148 22 фев 2011 libz.so.5
-r--r--r-- 1 root wheel 211800 22 фев 2011 libzfs.so.2
-r--r--r-- 1 root wheel 1114152 22 фев 2011 libzpool.so.2
тем ни менее эксплойт работает.
прикольно. включение chroot для фтп-юзеров приводит проблеме безопасности.
proftpd продолжает радовать =(
> proftpd продолжает радовать =(Да и FreeBSD не отстает. Совсем недавно же предыдущую дыру с сокетами нашли...
Угу - а скажи ко - за последние лет так 5 - был ли хоть один релиз ведра ляпикса в котором разрабы не рекомендовали под страхом смерти обновится из-за серьёзных проблем с безопасностью причём каких - не скажем? Так что не вам дудеть.
> Так что не вам дудеть.А вы чего раздуделись? Сентябрьской эскалации прав из грязи в князи вам было мало?
>> Так что не вам дудеть.
> А вы чего раздуделись? Сентябрьской эскалации прав из грязи в князи вам
> было мало?девочки не ссорьтесь.
> Угу - а скажи ко - за последние лет так 5 -
> был ли хоть один релиз ведра ляпикса в котором разрабы не
> рекомендовали под страхом смерти обновится из-за серьёзных проблем с безопасностью причём
> каких - не скажем?Ага, у некоего Грега эти слова вписаны в шаблон письма с сообщением о новом релизе. И с реальными проблемами безопасности это никак не коррелирует =)
Скорее, просто стимуляция хомячков на использование актуального софта, что, кстати, приводит к значительному уменьшению потока багрепортов.> Так что не вам дудеть.
Кстати, дос-дыру в бинде из базовой системы фри так и не закрыли?
Security officer все еще в запое? =)
> Кстати, дос-дыру в бинде из базовой системы фри так и не закрыли?
> Security officer все еще в запое? =)Ха Ха Ха
а две строчки прописать для обновления не судьба ?
cd /usr/ports/dns/bind98
make install clean
А уж как радует Linux :-) что не обновление ядра - так 2-4 дыры, что не версия glibc - так множественные дыры.
> А уж как радует Linux :-) что не обновление ядра - так 2-4 дыры, что не версия glibc - так множественные дыры.Ага, причем дыры из разряда "смотрировав специально сформированный образ ФС, пользователь может вызвать отказ в обслуживании" (ага, имея рутовые полномочия, чего б не обрушить).
А вот рутовые дыры в линyпсе встречаются гораааздо реже, чем во фре.
Я плохо смотрю или у фрюшников нет pr-а по это теме?
> Я плохо смотрю или у фрюшников нет pr-а по это теме?Нету. Фиксить некому - security officer в запое, а больше в security team и нет никого.
не совсем ясно, при каких условиях существует уязвимость. В man ftpd подробно описан процесс настройки службы (для записи и чтения). Если сделать так, как описано в инструкции, будет ли cуществовать уязвимость?
> не совсем ясно, при каких условиях существует уязвимость. В man ftpd подробно
> описан процесс настройки службы (для записи и чтения). Если сделать так,
> как описано в инструкции, будет ли cуществовать уязвимость?Работает только при включенной DefaultRoot
> Работает только при включенной DefaultRootЭто про proftpd, в ftpd - не разбирался.
Из ролика ясно, что должен быть шел-доступ для фтп-юзеров, чтобы что-то сделать. По идее фтп-юзеры должны иметь валидный шелл-акаунт. Но, не обязательно же их в шел пускать )) Чащще всего и не надо совсем.
.. по ssh.