私の理解によれば、
- ルイド: プロセスの呼び出し元の 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
。セキュリティ対策として、bash
2 は起動時に権限を削除します。(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()
使用しないでください。