Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > chroot выполнение от имени юзера


Автор: CPlusPlusFAN 21.8.2010, 09:35
Здравствуйте.

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

Заранее спасибо!

Автор: xvr 23.8.2010, 15:12
Цитата(CPlusPlusFAN @  21.8.2010,  09:35 Найти цитируемый пост)
Однако в ней требуется выполнить chroot в вызванном ей дочернем процессе.
А чем стандартная последовательность fork->chroot->exec не устраивает?


Автор: CPlusPlusFAN 23.8.2010, 18:13
Запускаю под юзером:

Код

#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <fstream>

int main(int, char **)
{
    int pid = fork();
    if (pid == 0)
    {
        chdir("testdir");
        chroot(".");

        std::ofstream os("../testfile.txt"); // пусть вместо exec будет создание файла

        exit(0);
    }

    int status;
    waitpid(pid, &status, 0);

    return 0;
}


testdir есть. testfile.txt в текущей директории создаётся. chroot не работает. От рута запускаю - файла нету. Но запускать от рута нет возможности.

Автор: JackYF 23.8.2010, 19:16
Цитата(CPlusPlusFAN @  23.8.2010,  17:13 Найти цитируемый пост)
chroot не работает

Системный вызов 'chroot' работает только от рута.

Соответственно, либо запускать от рута, либо использовать "*su*"-помощники (sudo, su etc.).

Автор: xvr 23.8.2010, 20:40
Цитата(CPlusPlusFAN @  23.8.2010,  18:13 Найти цитируемый пост)
Но запускать от рута нет возможности.
Поставь своему exeнику пользователя root и бит set user ID. И в самом exeнике не забыть вернуть UID перед exec'ом назад


Автор: CPlusPlusFAN 23.8.2010, 21:16
Это возможно сделать программно?

Автор: xvr 24.8.2010, 09:19
Цитата(CPlusPlusFAN @ 23.8.2010,  21:16)
Это возможно сделать программно?

Да. Но первую часть:
Цитата

оставь своему exeнику пользователя root и бит set user ID.
лучше сделать с командной строки  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)