setuidが機能しないのはなぜですか? [コピー]

setuidが機能しないのはなぜですか? [コピー]

xyzroot権限を持つユーザーだけが自分のプログラムを実行できるようにしたいと思います。これを行うためにsetuidビットを設定しました。

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

さらに、rootのみがprogram1.shを実行できるように、ユーザーをグループxyzに追加しました。housexyz

program1.shに

id -u

これにより、有効なIDが表示されます。

ルートとして実行するとprogram1.sh表示されますが、rootそのxyzアカウントを実行すると表示されます。xyz。 root権限で実行されていないようです。ここで何が間違っているのかわかりません。

ベストアンサー1

setuidビット(rwsr-xr-x権限など)を使用してシェルスクリプトを実行すると、スクリプトはそれを所有しているユーザーではなく、スクリプトを実行しているユーザーとして実行されます。これは、setuidがバイナリ(たとえば/usr/bin/passwd)を処理する方法(たとえば/usr/bin/passwd)とは対照的です。このバイナリは、実行しているユーザーに関係なく、バイナリを所有するユーザーとして実行されます。

このページをチェックしてください:https://access.redhat.com/site/solutions/124693

これはオペレーティングシステムが取るセキュリティ対策です。スクリプトを使用する必要がありますSudo代わりに。

スクリプトでsetuidを必ず使用する必要がある場合は、そのタスクを実行するバイナリを作成できます。新しいファイル"program.c"を作成し、次のコードをコピーします。

   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/types.h>
   #include <unistd.h>
     
   int main()
   {
     setuid(0);
     system("./program.sh"); #This line is dangerous: It allows an attacker to execute arbitrary code on your machine (even by accident).
     return 0;
   }

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

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

それはすべてです。 setuidは、他のファイルをrootとして実行できるコンパイル済みファイルで機能します。

おすすめ記事