2

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 以外のユーザーに同じことを適用すると、うまくいきません。コード:

foob​​ar.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 番目のシナリオが機能しないのはなぜですか?

よろしくお願いします。

4

2 に答える 2

1

foob​​ar.c の setuid 呼び出しは、root であるか、有効な UID が 1001 である場合にのみ成功します。

そう。root でない場合、setuid(1001) は失敗し、"foobar" が所有するファイルを上書きするために必要な権限がありません。

于 2012-05-16T23:09:46.417 に答える
0

出力から、root 以外のユーザーは script_of_foobar.sh を実行できますが、/tmp/file_of_foobar に書き込むことができないようです。/tmp の権限がオフになっている可能性はありますか? 1777に設定する必要があると思います。

于 2012-05-16T23:14:30.050 に答える