SUID не работает со сценарием оболочки

Я создал небольшой сценарий оболочки со следующим содержимым:

cat /usr/bin/checksuid.sh

!/bin/bash
echo "Hello" > /etc/myfile.cnf

ls -l /usr/bin/checksuid.sh
-rwsr-xr-x 1 root root 56 Sep  9 12:56 /usr/bin/checksuid.sh

Я также создал файл /etc/myfile.cnf с учетной записью root и установил права доступа, как показано ниже:

-rw-r--r-- 1 root root 6 Sep  9 12:26 /etc/myfile.cnf

Когда я запускаю /usr/bin/checksuid.sh из учетной записи без полномочий root, я получаю следующую ошибку:

/usr/bin/checksuid.sh: line 3: /etc/myfile.cnf: Permission denied

Может ли кто-нибудь помочь вам, почему SUID не работает?


person Sachin Gupta    schedule 09.09.2013    source источник
comment
Это также должно быть #!/bin/bash как строка shebang для bash, но предпочтительно #!/bin/sh.   -  person Jite    schedule 09.09.2013


Ответы (2)


Сценарии оболочки не могут быть SUID. См. http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html

person Douglas Leeder    schedule 09.09.2013

Из http://www.tuxation.com/setuid-on-shell-scripts.html :

«на самом деле бит setuid отключен во многих реализациях * nix из-за огромных дыр в безопасности, которые он несет»

Альтернативный подход — обернуть скрипт во что-то, что может использовать setuid, как в этом примере программы c. Очевидно, что между простым вызовом вашего скрипта и использованием такой оболочки есть различия (например, игнорируемые коды выхода), но в любом случае это должно дать вам представление.

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

int main()
{
   setuid( 0 );
   system( "/path/to/script.sh" );

   return 0;
}
person Sk606    schedule 23.07.2014
comment
Вы должны стереть переменные среды до/при вызове скрипта, чтобы снизить риски безопасности. - person Meixner; 14.04.2015