EUID を使用する意味は何ですか? プロセスの RUID と EUID が 1000、0 の場合、コマンドを実行すると、コマンドは 1000 特権レベルで実行されます。なぜですか?

EUID を使用する意味は何ですか? プロセスの RUID と EUID が 1000、0 の場合、コマンドを実行すると、コマンドは 1000 特権レベルで実行されます。なぜですか?

私の理解によれば、

  • ルイド: プロセスの呼び出し元の uid は実 uid と呼ばれます。
  • EUID: 有効な UID は、そのプロセスに許可された権限を意味します。
// setuid_file.c
#include<stdio.h>
int main(void)
{
        int uid;
        uid=getuid();
        printf("RUID : getuid() : %d\n",uid);
        uid=geteuid();
        printf("EUID : geteuid() : %d\n",uid);

        system("whoami");
        system("cat /etc/sudoers"); //only root user can access. here we can write any command which only root user can execute.
}
 
gcc setuid_file.c -o euid_zero
chmod ug+s euid_zero

そこで、ルート ターミナルで、euid_zero 実行可能ファイルの suid と guid を設定しました。次に、通常のユーザーを使用して実行可能ファイルを実行しようとすると、出力は以下のようになります。

ll euid_zero
-rwsr-sr-x 1 root root 16768 Dec 30 00:59 euid_zero

whoami
kali

id
uid=1000(kali) gid=1000(kali) groups=1000(kali)

./euid_zero

RUID : getuid() : 1000
EUID : geteuid() : 0
kali
cat: /etc/sudoers: Permission denied
                                      

したがって、ここで EUID がゼロの場合、ルート権限も取得できません。つまり、RUID に従ってアクセス権限があるということですが、EUID が使用されていない場合、EUID の意味は何でしょうか?

答え1

これにより、プロセスは一時的に必要に応じて権限を上げたり下げたりします。

たとえば、ファイル サーバー デーモン (smbd、ftpd) は root として起動しますが、その後ログイン ユーザーの EUID に seteuid() します。これで、ほとんどの時間、ログイン ユーザーの EUID で実行できるようになり、カーネルがファイル アクセス チェックを適用できるようになりますが、特定の操作では権限を EUID 0 に戻すことができます。

ただし、 を使用するとsystem()、 を通じてコマンドが呼び出されることに注意してください/bin/shそしてBashシェルは意図的に権限を放棄するUID/EUIDの不一致を検出するたびに、setuidプロセスが実行されます。できた実際には/etc/shadow問題なく開くことができます。開けないのは system() 経由で起動されたツールだけです。

すべての system() 呼び出しを fork+exec または単純な に置き換えるとopen("/etc/shadow", O_RDONLY)、RUID=1000 だが EUID=0 であればファイルにアクセスできることがわかります。(さらに、UID/GID の両方のセットが報告されることもわかりますid。)

答え2

一般的に EUID 自体は期待通りに動作しますが、ここでの「問題」は、system(3)と のsh使用方法にあります。マニュアルを参照してください (man 3 system):

system()実際、 は、バージョン 2/bin/shのシステム上の set-user-ID または set-group-ID 権限を持つプログラムからは正常に動作しませんbash。セキュリティ対策として、bash2 は起動時に権限を削除します。(Debian は別のシェル を使用しますがdash(1)、 として呼び出された場合はこれを行いませんsh。)

マニュアルが最新ではないことが判明しました。dashのように振る舞うbash正直に言うと、あなたのOSがどのシェルを使っているのか分かりませんsh、Ubuntu は を使用しますdash。ただし、kaliあなたの質問では Kali が示唆されているかもしれませんが、Kali が何を使用しているかはわかりません。 を確認してください。ls -l /bin/shおそらく ですdash。それが何であるかに関係なく、権限をドロップする可能性が高く、これが に気付いた理由ですPermission denied

たとえsh権限を落とさなかったとしても、system()それは良い考えではありません。すでにリンクされているマニュアルでは、明示的にそれを推奨していません。

一部の環境変数に異常な値が使用され、システムの整合性が損なわれる可能性があるため、特権プログラム (set-user-ID または set-group-ID プログラム、または機能を持つプログラム) からはsystem()使用しないでください。

関連情報