web-dev-qa-db-ja.com

なぜsetuidが機能しないのですか?

私のプログラムがroot特権を使用してユーザーxyzによってのみ実行できることを確認したいと思います。これを行うには、setuidビットを次のように設定します。

chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh

また、xyzグループにユーザーhouseを追加して、xyzとrootだけがprogram1.shを実行できるようにしました。

Program1.shには

id -u

有効なIDを表示できるようにします。

ランニング program1.sh rootとして、rootを表示します。しかし、xyzアカウントで実行すると、xyzと表示されます。 root権限で動作していないようです。ここで何が悪いのか分かりません。

15
Marcus Thornton

Setuidビットを持つシェルスクリプト(rwsr-xr-xのpermsなど)を実行する場合、スクリプトは、それらを所有するユーザーとしてではなく、それらを実行するユーザーとして実行されます。これは、実行するユーザーに関係なく、それらを所有するユーザーとして実行されるバイナリ(/ usr/bin/passwdなど)のsetuidの処理方法とは逆です。

このページを確認してください: https://access.redhat.com/site/solutions/12469

これは、オペレーティングシステムによって実行されるセキュリティ対策です。あなたはあなたのスクリプトを使うべきです 須藤 代わりに。

スクリプトで本当にsetuidを使用する必要がある場合は、作業を行うバイナリを作成できます。新しいファイル「program.c」を作成し、次のコードをコピーします。

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

   int main()
   {
   setuid(0);
   system("./program.sh");
   return 0;
   }

次のコマンドを使用してコードをコンパイルおよび実行します。

$ gcc program.c -o program
$ Sudo chown root.root program
$ Sudo chmod 4755 program
$ ./program

このように機能します.setuidはコンパイル済みファイルに対して機能し、このファイルは他のファイルをrootとして実行できます。

40
cioby23