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

0
2022.01.01

私の理解によると、

RUID:-プロセスの呼び出し元の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を設定しました。ここで、ff通常のユーザーを使用して実行可能ファイルを実行しようとすると、以下が出力になります。

 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がゼロであるため、root権限を取得することもできません。つまり、RUIDに応じたアクセス権があるということですが、EUIDを使用しない場合のEUIDの意味は何でしょうか。

回答
1
2022.01.01

あなたが期待するよう自身が働く一般EUIDでは、「問題は」ここにそれが使用するsystem(3)shです。マニュアル(man 3 system )を参照してください。

system()しません、実際には、/bin/shbashバージョン2でているシステム上のセットユーザIDまたはセットグループIDの特権を持つプログラムから適切な作業:セキュリティ対策として、bash 2が起動時に権限を削除します。 (Debianはshとして呼び出されたときにこれを実行しない別のシェル、dash(1)を使用します。)

マニュアルが最新ではないことが判明しました。今日でdashbashのように振る舞います。率直に言って、あなたのOSがshとしてどのシェルを使用しているかわかりませんにタグを付けました、Ubuntuはdashを使用しています;しかしあなたの質問のkaliはKaliを示唆しているかもしれません、Kaliが何を使用しているかわかりません)。 ls -l /bin/shで確認してください。おそらくdashです。それが何であるかに関係なく、それはおそらく特権を落とします、そしてこれはあなたが観察したPermission deniedの理由です。

あなたのshが特権を落としていなかった場合でも、system()は良いアイデアではないでしょう。すでにリンクされているマニュアルは、明示的にそれをお勧めしません:

いくつかの環境変数のための奇妙な値は、システムの完全性を破壊するために使用される可能性があるため、特権プログラム(セットユーザIDまたはグループID設定プログラム、または機能を持つプログラム)からsystem()を使用しないでください。

1
2022.01.01

これにより、プロセスは必要に応じて特権を一時的に上げたり下げたりすることができます。

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

しかし、あなたはsystem()を使用するときにノートでは、これは/bin/shを介してコマンドを呼び出していること、そしてそれがUID / EUIDの不一致を検出するたびバッシュシェルは、意図的な権限を削除します。独自のsetuidプロセスは、実際には/etc/shadowを問題なく開くことができます。system()を介して起動されるツールだけが開くことができません。

あなたはフォーク+ execを持つすべてのシステム()の呼び出し、あるいは簡単なopen("/etc/shadow", O_RDONLY)を交換する場合は、= 1000 RUIDを有するが、EUID = 0は、ファイルにアクセスすることができます。ことがわかります(さらに、idがUID / GIDの両方のセットを報告することも表示されます。)