Вызов сценария из программы setuid root C - скрипт не запускается от имени root - PullRequest
25 голосов
/ 17 февраля 2009

Мне нужно запустить bash-скрипт от имени пользователя root (sudo или suless без пароля), и поскольку вы не можете установить скрипт в Linux, я подумал о том, чтобы вызвать его из исполняемого файла и сделать it setuid:

$ cat wrapper.c
int main(void)
{
        system("/bin/bash ./should_run_as_root.sh");
}
$ gcc -o wrapper wrapper.c
$ sudo chown root wrapper
$ sudo chmod ug+s wrapper
$ ll wrapper
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper
$

Это работает - как в сценарии запускается правильно - но сценарий выполняется как пользователь, который выполняет "./wrapper".

Почему? И как правильно это реализовать?

Спасибо!

Ответы [ 5 ]

43 голосов
/ 17 февраля 2009

Поскольку бит suid в исполняемых файлах только изменяет эффективный UID (EUID), исполняемый файл будет работать как, а не реальный UID (RUID), который возвращает getuid(), и в дополнение к интерпретируемому ограничению suid сценарии (любой исполняемый файл, начинающийся с "#!"), некоторые оболочки, например bash, в качестве дополнительной меры безопасности вернут EUID обратно к RUID, в этом случае вам нужно будет использовать вызов setuid(0) в коде C перед выполнением сценария.

См. man страницы setuid, seteuid, getuid и geteuid, чтобы узнать точную семантику действительных и эффективных UID.

( ПРЕДУПРЕЖДЕНИЕ ) Конечно, уместно упомянуть, что ограничение на скрипты suid во многих системах Unix, оболочках и интерпретаторах существует по причине, которая заключается в том, что если Скрипт не очень осторожен в отношении очистки входных данных и состояния среды, когда он выполняется, они опасны и могут быть использованы для повышения безопасности. Так что будьте очень осторожны при этом. Установите как можно более строгий доступ к вашему сценарию и оболочке, разрешите только этот весьма специфический сценарий, который вы собираетесь выполнять, и очистите среду в вашей программе на C перед запуском сценария, установив переменные среды, такие как PATH, для хранения именно то, что необходимо в правильном порядке и нет каталогов, которые могут быть записаны для других.

6 голосов
/ 17 февраля 2009

Еще одна вещь, на которую следует обратить внимание: это ограничение bash, а не самой системы * nix. Bash на самом деле выполняет проверки сценариев SUID, чтобы выполнять их только с корнем EUID. Если вы берете старые снаряды, вы часто получаете из коробки то, что хотели. Например, sh не делает такого рода проверки:

$ cat wrapper.c
int main(void)
{
            system("/bin/sh -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:15 wrapper
$ ./wrapper
root

С bash:

$ cat wrapper.c
int main(void)
{
            system("/bin/bash -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:18 wrapper
$ ./wrapper
skinp

Тем не менее, ответ Тома - это, как правило, способ создания оболочки для корневых программ SUID

3 голосов
/ 06 мая 2010

Добавьте setuid (0) в скрипт и завершите его. Это должно работать после этого.

$ cat wrapper.c 
int main(void) 
{ 
        setuid(0);
        system("/bin/bash ./should_run_as_root.sh"); 
} 
$ gcc -o wrapper wrapper.c 
$ sudo chown root wrapper 
$ sudo chmod ug+s wrapper 
$ ll wrapper 
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper 
$ 
1 голос
/ 03 января 2012

Примеры ужасно небезопасны и позволяют любому, обладающему двумя знаниями, запускать любую программу, которую он хочет, как пользователь setuid.

Никогда не проходите через оболочку, если вы сначала не очистите среду, большинство показанных здесь примеров уязвимы для установки IFS и PATH перед его запуском.

0 голосов
/ 04 ноября 2011

Почему sudo нежизнеспособен? Это позволяет избежать бешеных дыр в безопасности, таких как:

bash-3.2$ cat test
#!/bin/bash
echo ima shell script durp durp
bash-3.2$ chmod +x test
bash-3.2$ ./test
heh heh
bash-3.2$ 

Из-за неправильной очистки окружающей среды, например, в этом случае:

export echo='() { builtin echo heh heh; }'

sudo очищает этот случай и, возможно, другие крайние случаи и ошибки, которые не следует записывать в пользовательскую оболочку suid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...