4

現在、SUID ビットと対応する関数 seteuid および geteuid がどのように機能するかを理解しようとしています。だから私はこの小さなプログラムを書いた:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char **argv) {

    printf("oldid %d\n", geteuid());
    if(seteuid(0) == -1)
        perror("seteuid faied");
    printf("newid %d\n", geteuid());

    return 0;

}

それをコンパイルし、その所有者をルートに変更し、ファイルの所有者の s ビットを変更しました。

[chris@myhost Test]$ ls -l test
-rwsr-xr-x 1 root root 4830 Apr  5 07:56 test

しかし、生成された出力は次のようになります。

[chris@myhost Test]$ ./test
oldid 0
newid 0

そして、これは私が理解していないものです。geteuid の最初の呼び出しは、実際にはこのプログラムの呼び出し元のユーザー ID (つまり、chris - 私の ID は 1000 になります) を返すはずですが、プログラムは有効なユーザー ID として root を表示します。なぜこれが事実なのか、誰かが私に説明できますか?

4

1 に答える 1

7

geteuid()私のMac(OS X 10.6.7)のmanページから:

実ユーザー ID は、プログラムを起動したユーザーの ID です。有効なユーザー ID は、「set-user-ID」モードのプロセスの実行中にプロセスに追加のパーミッションを与えるため、getuid() を使用して、呼び出しプロセスの実ユーザー ID を決定します。

suid ビットを設定したので、プログラムの有効なユーザー ID は、実行開始時からのファイル所有者 (root) です。

于 2011-04-05T08:15:58.980 に答える