AユーザーにBユーザーとしていくつかの仕事をしてもらいたい。B が root であれば問題ありませんが、非 root ユーザーは失敗しました。基本的なコードは次のとおりです。
root.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid( 0 );
system( "/tmp/script_of_root.sh" );
return 0;
}
script_of_root.sh:
#!/bin/sh
echo $RANDOM >> /tmp/file_of_root
再生:
$ cd /tmp
$ cc root.c -o root
$ su -
# chown root.root /tmp/root
# chmod 4755 /tmp/root
# exit
$ ./root
「./root」を実行すると、ファイル「/tmp/file_of_root」が更新されます。しかし、root 以外のユーザーに同じことを適用すると、うまくいきません。コード:
foobar.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid( 1001 ); // uid of user "foobar"
system( "/tmp/script_of_foobar.sh" );
return 0;
}
script_of_foobar.sh:
#!/bin/sh
echo $RANDOM >> /tmp/file_of_foobar
再生:
$ cd /tmp
$ cc foobar.c -o foobar
$ su -
# chown foobar.users /tmp/foobar
# chmod 4755 /tmp/foobar
# exit
$ ./foobar
「./foobar」を他の通常のユーザー (「foobar」自体ではない) として実行すると、エラーになります。
/tmp/script_of_foobar.sh: line 2: file_of_foobar: Permission denied
私は完全に混乱しています。2 番目のシナリオが機能しないのはなぜですか?
よろしくお願いします。