В списке рассылки oss-security опубликован (http://www.openwall.com/lists/oss-security/2013/03/13/8) концептуальный прототип эксплоита (http://stealth.openwall.net/xSports/clown-newuser.c), демонстрирующего новую уязвимость в ядре Linux, позволяющую непривилегированному пользователю, имеющему привилегированный доступ в изолированном контейнере, получить права root во внешней системе. Проблема проявляется только в ядре 3.8 (http://www.opennet.me/opennews/art.shtml?num=36153), в котором появилась возможность применения пространств имён для непривилегированных пользователей. Исправление пока доступно в виде патча (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux....). Проблема не проявляется при использовании sysctl fs.protected_hardlinks=1.
Уязвимость вызвана недопустимостью комбинации флагов CLONE_NEWUSER и CLONE_FS при клонировании процесса, что позволяет нескольким процессам, работающим в разных пространствах имён, совместно использовать одну корневую директорию после манипуляций с созданием chroot и корректировки данных в /proc/pid/uid_map.
URL: http://www.openwall.com/lists/oss-security/2013/03/13/8
Новость: http://www.opennet.me/opennews/art.shtml?num=36391
Опять массовая? Только в этом случае пострадавших уже четверо, а не как в прошлый раз?
Она не может быть массовой. Так как 3.8 в продакшене на серверах используют только самые упоротые.
Да и даже в арчике то все еще 3.7 ядрышко. Так что как обычно, пока на него перейдет народ уже более менее все залатают.
3.8 следует пропустить, оно ваще поддерживаться не будет.
Идёт нескончаемая борьба пытливых умов с руками разработчиков.
И продолжается с переменным успехом :)
14:55|nrndda@nrndda-core ~ $ grep -i namespace /usr/src/linux/.config
CONFIG_NAMESPACES=y
14:55|nrndda@nrndda-core ~ $ cc -Wall clown-newuser.c -static
14:55|nrndda@nrndda-core ~ $ ./a.out
[**] clown-newuser -- CLONE_NEWUSER local root (C) 2013 Sebastian Krahmer[+] Found myself: '/home/nrndda/a.out'
[*] Parent waiting for boomsh to appear ...
[*] Setting up chroot ...
[+] Done.
[*] Cloning evil child ...
[-] clone: Invalid argument^C
14:56|nrndda@nrndda-core ~ $ uname -a
Linux nrndda-core 3.8.2-gentoo #3 SMP PREEMPT Tue Mar 5 19:25:13 MSK 2013 x86_64 Intel(R) Core(TM)2 Duo CPU E4700 @ 2.60GHz GenuineIntel GNU/Linux
14:59|nrndda@nrndda-core ~ $ sudo sysctl -a | grep protected_hardlinks
fs.protected_hardlinks = 0Второй запуск приводит к:
15:00|nrndda@nrndda-core ~ $ ./a.out
[**] clown-newuser -- CLONE_NEWUSER local root (C) 2013 Sebastian Krahmer[+] Found myself: '/home/nrndda/a.out'
[*] Parent waiting for boomsh to appear ...
[*] Setting up chroot ...
[-] link: File existsВ чём дело? Почему не работает...
Кстати, домашняя папка расположена не на отдельном разделе.
15:09|nrndda@nrndda-core ~ $ mount | grep -iE "home"
/dev/sdb3 on /home/nrndda/temp type ext4 (rw,relatime,commit=60,data=ordered)
/dev/sdb3 on /home/nrndda/git type ext4 (rw,relatime,commit=60,data=ordered)
/dev/sdb3 on /home/nrndda/Progs type ext4 (rw,relatime,commit=60,data=ordered)
/dev/sdb3 on /home/nrndda/Games type ext4 (rw,relatime,commit=60,data=ordered)
/dev/sdb3 on /home/ni4ei type ext4 (rw,relatime,commit=60,data=ordered)
/dev/sdb3 on /home/portage type ext4 (rw,relatime,commit=60,data=ordered)
10.0.0.2:/ on /home/FTP type nfs4 (rw,nosuid,nodev,relatime,vers=4.0,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=30,retrans=2,sec=sys,clientaddr=10.0.0.3,local_lock=none,addr=10.0.0.2)P.S. Такие странные mount из-за ssd. На hdd сбрасываются срезы(rsync) с ssd каждый час и некоторые папки находятся только на нём.
Останавливается тут:
pid = clone(child, child_stack + sizeof(child_stack),
CLONE_NEWUSER|CLONE_FS|SIGCHLD, NULL);
if (pid == -1)
die("[-] clone");
$ cat /usr/src/linux/.config | grep CONFIG_USER_NS ?
> $ cat /usr/src/linux/.config | grep CONFIG_USER_NS ?Нету его в .config. Тем более:
Depends on: NAMESPACES [=y] && EXPERIMENTAL [=y] && UIDGID_CONVERTED [=n]
Последнее так же непонятно где включается...В init/Kconfig стоит вот что:
config UIDGID_CONVERTED
# True if all of the selected software conmponents are known
# to have uid_t and gid_t converted to kuid_t and kgid_t
# where appropriate and are otherwise safe to use with
# the user namespace.
bool
default y# Networking
depends on NET_9P = n# Filesystems
depends on 9P_FS = n
depends on AFS_FS = n
depends on CEPH_FS = n
depends on CIFS = n
depends on CODA_FS = n
depends on GFS2_FS = n
depends on NCP_FS = n
depends on NFSD = n
depends on NFS_FS = n
depends on OCFS2_FS = n
depends on XFS_FS = n
> Последнее так же непонятно где включается..."В Linux даже под эксплойты надо ядро перекомпилировать" (с) :)
Вот эти все выключи:
# Networking
depends on NET_9P = n# Filesystems
depends on 9P_FS = n
depends on AFS_FS = n
depends on CEPH_FS = n
depends on CIFS = n
depends on CODA_FS = n
depends on GFS2_FS = n
depends on NCP_FS = n
depends on NFSD = n
depends on NFS_FS = n
depends on OCFS2_FS = n
depends on XFS_FS = n # я не могу, у меня XFS везде, пичалька :(---
Собственно из этого мини-анализа можно сделать вывод:Пользователям файловых систем: Plan9, AFS, CEPH, CIFS, CODA, GFS2, NCP, NFS, OCFS2 и XFS
этот эксплойт и дыра НЕ ОПАСНЫ и бесполезны.
Да, без NFS и CIFS можно включить CONFIG_USER_NS.
Но без первого я уже не могу обойтись. Сервак с файлохранилищем там у меня..Паника отменяется:)
> P.S. Такие странные mount из-за ssd.Гм, а не лучше ли тогда min_batch_time в несколько тысяч выставить?
Для ssd стоит. Для hdd поставил, гляну на результат.
> Для ssd стоит.В #21 только commit просто был.
> Для hdd поставил, гляну на результат.
Там-то зачем...
ssd у меня - /dev/sda. Там стоит в опциях следующее: noatime, nodiratime, min_batch_time=20000, max_batch_time=40000,commit=60,discard,errors=remount-rohdd монтируется в /mnt/hdd1 (root) и /mnt/hdd2 (home), а потом с помощью bind монтируются некоторые каталоги поверх корня под ssd.
В кроне стоят правила синхронизации sdd и hdd.
0 */2 * * * ${RSYNC} --delete -a --exclude={/dev/*,/home/*,/media/*,/mnt/*,/proc/*,/run/*,/sys/*,/tmp/*,/var/log/*,/usr/portage/distfiles/*,/lost+found/*} / /mnt/hdd1/
5 */2 * * * ${RSYNC} --delete -a --exclude={/FTP/*,/portage/*,/ni4ei/*,/nrndda/Music/*,/nrndda/Games/*,/nrndda/Progs/*,/nrndda/git*,/nrndda/temp/*,/lost+found/*} /home/ /mnt/hdd2/В результате получаем надёжную систему вне зависимости от выхода из строя ssd. Так как это был мой первый опыт с ssd, то я посчитал достаточным такой подход.
За 4-е месяца:
9 Power_On_Hours_and_Msec 0x0032 099 099 000 Old_age Always - 1682h+47m+22.820s
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 162
230 Life_Curve_Status 0x0013 100 100 000 Pre-fail Always - 100
231 SSD_Life_Left 0x0013 100 100 010 Pre-fail Always - 0
241 Lifetime_Writes_GiB 0x0032 000 000 000 Old_age Always - 636
242 Lifetime_Reads_GiB 0x0032 000 000 000 Old_age Always - 1386P.S. Выставление min_batch_time и max_batch_time для hdd снизило подтормаживания при синхронизации каталогов rsync'ом. Теперь полностью доволен;)
> Так как это был мой первый опыт с ssd, то я посчитал достаточным такой подход.Один работает уже три года без trim (старое ядро), второй такой же -- два+ года с trim и довольно активно, третий -- два+ месяца тоже с trim. Живы пока все три.
У меня ваще жопа!$ gcc -Wall clown-newuser.c -static
/usr/lib64/gcc/x86_64-suse-linux/4.7/../../../../x86_64-suse-linux/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
юзай ldconfig для перестройки кеша
man ldconfig
man gcc на предмет -static
статически собранное? не, не слышал
> Проблема проявляется только в ядре 3.8,проблема есть в SLES10, потом не подвержены, потом начиная с ~3.6.
commit 5eaf563e53294d6696e651466697eb9d491f3946
Author: Eric W. Biederman <ebiederm@xmission.com>
Date: Mon Nov 21 17:22:31 2011 -0800userns: Allow unprivileged users to create user namespaces.
...
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
$ ./clown-newuser
[**] clown-newuser -- CLONE_NEWUSER local root (C) 2013 Sebastian Krahmer[+] Found myself: '/home/exploit/clown-newuser'
[*] Parent waiting for boomsh to appear ...
[*] Setting up chroot ...
[+] Done.
[*] Cloning evil child ...
[-] clone: Operation not permittedИ так висит...
^C
> $ ./clown-newuser
> [**] clown-newuser -- CLONE_NEWUSER local root (C) 2013 Sebastian Krahmer
> [+] Found myself: '/home/exploit/clown-newuser'
> [*] Parent waiting for boomsh to appear ...
> [*] Setting up chroot ...
> [+] Done.
> [*] Cloning evil child ...
> [-] clone: Operation not permitted
> И так висит...
> ^C$ strace -p `pidof clown-newuser`;