setuid (0) и система не работает - PullRequest
2 голосов
/ 07 июня 2011

У меня есть программа, работающая на C. Для этого необходимо выполнить команду "iptables" с помощью системы.

Я попытался

setuid(0); 
system("iptables .... ");

setuid и система не сосуществует.со страницы руководства системы

Не используйте system () из программы с привилегиями set-user-ID или set-group-ID, потому что странные значения для некоторых переменных среды могут использоваться для подрыва системыцелостность.Вместо этого используйте семейство функций exec (3), но не execlp (3) или execvp (3).На самом деле system () не будет работать должным образом из программ с привилегиями set-user-ID или set-group-ID в системах, в которых / bin / sh является bash версии 2, поскольку bash 2 удаляет привилегии при запуске.(Debian использует модифицированный bash, который не делает этого, когда вызывается как sh.)

как мне решить мою проблему?

Спасибо

Ответы [ 3 ]

4 голосов
/ 07 июня 2011

system () будет работать вместе с setuid (), но это проблема: серьезная угроза безопасности. Проблема в том, что system () запускает оболочку (bash, sh и т. Д.), Используя любую среду, и когда вы намереваетесь запустить «iptables», мой PATH может указывать на мою собственную версию iptables, которую я легко могу убедить вас бежать за мной, как root. Вы можете решить эту проблему, используя полный путь к iptables, но можно использовать другие переменные окружения (например, LD_PRELOAD_PATH), чтобы убедить инструменты загружать мошеннические разделяемые библиотеки - опять же, запускать вещи как root, которые не были предназначены.

Для того, что вам нужно сделать, безопасно, вы должны использовать одно из семейств exec (), и вы должны контролировать его операционную среду. Все остальное просит о нарушении безопасности. http://pubs.opengroup.org/onlinepubs/009695399/functions/environ.html - хорошее место, чтобы узнать больше.

2 голосов
/ 07 июня 2011

Зачем вам нужно использовать system()? Справочная страница говорит вам, что делать:

Вместо этого используйте семейство функций exec(3), но не execlp(3) или execvp(3).

Возможно, вас также заинтересуют системные вызовы fork(2) и wait(2).

1 голос
/ 07 июня 2011

Нечто подобное может помочь.Это не проверено, но должно работать.

    char * const argv[] = {"/sbin/iptables", "-L", NULL};

    pid = fork();
    switch (pid) {
            case -1:
                    /* handle error */
            case 0:
                    execv("/sbin/iptables", argv);
                    /* handle error if you get here */
            break;
            default:
                    waitpid(pid, &status, 0);
                    /* check waitpid return code */
            break;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...