У меня тоже было такое же исключение. Я сделал следующие изменения в файле 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 решило проблему.
Поскольку бит suid
в исполняемых файлах только изменяет эффективный UID (EUID), исполняемый файл будет работать как, а не как реальный UID (RUID), который возвращает getuid()
, и в дополнение к ограничению на suid
интерпретируется сценарии (любой исполняемый файл, начинающийся с «#!
»), некоторые оболочки, например bash
, в качестве дополнительной меры безопасности вернут EUID обратно к RUID, в этом случае вам потребуется использовать вызов setuid(0)
в коде C перед выполнением сценария.
См. man
страницы setuid
, seteuid
, getuid
и geteuid
, чтобы узнать точную семантику действительных и эффективных UID.
( ПРЕДУПРЕЖДЕНИЕ ) Конечно, уместно упомянуть, что ограничение на скрипты suid
во многих системах Unix, оболочках и интерпретаторах существует по причине, которая заключается в том, что если Скрипт не очень осторожен в отношении очистки входных данных и состояния среды, когда он выполняется, они опасны и могут быть использованы для повышения безопасности. Так что будьте очень осторожны при этом. Установите доступ к вашему сценарию и оболочке как можно более строго, разрешите только этот очень специфический сценарий, который вы собираетесь выполнять, и очистите среду в вашей программе на C перед запуском сценария, установив переменные среды, такие как PATH
, чтобы они содержали именно то, что необходимо в правильном порядке и нет каталогов, которые могут быть записаны для других.
Другая вещь отметить вот состоит в том, что ограничение здесь от удара, а не *отклоняют саму систему. 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
Добавьте 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
$