При назывании сценария от корня setuid C программой - сценарий не работает как корень

У меня тоже было такое же исключение. Я сделал следующие изменения в файле web.xml

<init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.moxy.json.MoxyFeature;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
        </init-param>

и изменил трикотаж с 2,7 до 2,9. Я не знаю, какое изменение этого 2 решило проблему.

25
задан 17 February 2009 в 10:18
поделиться

3 ответа

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

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

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

43
ответ дан Tom Alsberg 15 October 2019 в 15:50
поделиться

Другая вещь отметить вот состоит в том, что ограничение здесь от удара, а не *отклоняют саму систему. 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

С ударом:

$ 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

однако, ответ Tom обычно является способом пойти для того, чтобы сделать обертку для корневых программ SUID

7
ответ дан skinp 15 October 2019 в 15:50
поделиться

Добавьте 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 
$ 
3
ответ дан 28 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: