Setuid для скриптов с C-оболочкой

я просто хочу использовать php-скрипт с правами суперпользователя с оболочкой C, подобной этому учебнику.

ls -l :

-rwsr-xr-x. 1 root root 6466 Aug 15 03:07 createConfig
-rwxrwxrwx. 1 root root  102 Aug 15 04:23 test.php
-rw-r--r--. 1 root root  822 Aug 14 21:35 index.php

createConfig.c :

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(void) {
    system("/usr/bin/php /var/www/html/test.php");
    return 0;
}

test.php:

<?php
mkdir("/root/ourDir");
?>

index.php:

<?php
exec("/var/www/html/createConfig");
?>

но при запуске index.php в браузере я получил эту ошибку:

sh: /var/www/html/createConfig: Permission denied

Спасибо


person mahia MooshooL    schedule 25.10.2013    source источник
comment
Почему бы вам не выполнить execve(2) или execvp(3) ?   -  person Basile Starynkevitch    schedule 25.10.2013
comment
Василий, есть примеры? Я пробовал их, но не совсем работал. Параметры не были переданы правильно и другие проблемы .... это было давно, чтобы вспомнить   -  person Svetoslav Marinov    schedule 12.06.2016


Ответы (1)


Вы должны поставить setgid(getegid()); setuid(geteuid()) перед вызовом system().

В качестве примечания: то, как права доступа к файлам настроены в вашем примере, ваше «решение» совершенно небезопасно. Любой пользователь может изменить содержимое .php-скрипта, который будет запускаться этой программой setuid C, а затем использовать программу C для выполнения измененного содержимого как root.

person Laszlo Valko    schedule 25.10.2013