![setuidが機能しないのはなぜですか? [コピー]](https://linux33.com/image/36840/setuid%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
xyz
root権限を持つユーザーだけが自分のプログラムを実行できるようにしたいと思います。これを行うために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
に追加しました。house
xyz
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として実行できるコンパイル済みファイルで機能します。