Rtpproxy запускается с /var/run/ вместо /var/run/rtpproxy

Чтобы защититься от специфической chdir("..")техники побега, которую вы упомянули, вы можете просто отказаться от возможности снова выполнить chroot(2), как только вы перейдете к /var/mychrootсамостоятельно. Техника побега требует еще одного вызова chroot(), поэтому ее блокировки достаточно, чтобы она не работала.

Вы можете сделать это с помощью возможностей Linux, убрав CAP_SYS_CHROOT, который необходим для того, чтобы chroot(2)был доступен.

Например:

outside# chroot /var/mychroot
inside# capsh --drop=cap_sys_chroot --
inside#./escape_chroot
chroot(baz): Operation not permitted

(Второе приглашение внутри chroot исходит от оболочки, созданной из capsh. Вы можете заставить его запустить другую команду, например, capsh --drop=cap_sys_chroot -- -c 'exec./escape_chroot'.)


Но гораздо лучше просто использовать pivot_root, так как он защищает от многих других возможных эксплойтов, от которых chroot(2)не защитит.

Вы упомянули, что это работает, только если /var/mychrootявляется точкой монтирования, но вы можете сделать его точкой монтирования, просто привязав монтирование к себе.

Обратите внимание, что вам нужно создать пространство имен монтирования, чтобы использовать pivot_rootдля создания джейла, иначе он попытается изменить корень всех процессов в вашей файловой системе, что, скорее всего, не то, что вам здесь нужно...

Итак, вся последовательность:

outside# unshare -m
outside# mount --bind /var/mychroot /var/mychroot
outside# cd /var/mychroot
outside# mkdir old_root
outside# pivot_root. old_root
limbo# exec chroot.
inside# umount /old_root

(Опять же, многие из этих команд порождают новые оболочки. unshareделает то же самое, что и сам chroot. Вы можете обойти это, передав команды в качестве дополнительных аргументов. В некоторых случаях вы можете захотеть передать sh -c '...'для полного скрипта.)

На данный момент вы находитесь внутри тюрьмы pivot_rootв отдельном пространстве имен монтирования,и тот факт, что /var/mychrootявляется просто каталогом исходного корня (, а не монтированием отдельного устройства или петлевого устройства ), на самом деле не мешал этому работать благодаря привязке монтирования в себя.

Запустив escape-код, вы увидите, что тюрьма работает должным образом, (даже несмотря на то, что escape-код утверждает обратное):

inside# touch /inside_jail
inside#./escape_chroot
Exploit seems to work. =)
inside# ls -ld /inside_jail /old_root
-rw-r--r--.  1 0 0    0 Jan  5 23:45 /inside_jail
dr-xr-xr-x. 20 0 0 4096 Jul  5 23:45 /old_root

Как видите, все еще внутри тюрьмы... Код эксплойта немного наивен и предполагает, что пока операции (chroot,chdir)успешны, этого достаточно, чтобы сбежать из тюрьмы, которая на самом деле это не так...

Поэтому рассмотрите возможность использования этого метода для создания тюрьмы, которая превосходит chrootи не требует использования возможностей Linux для блокировки операций внутри нее (, таких как создание дополнительных chroots, которые могут быть полезны или необходимы. за то, что вы на самом деле пытаетесь запустить в тюрьму.)

0
04.03.2021, 09:49
0 ответов

Теги

Похожие вопросы