APUEから
保存された設定されたユーザーIDは、その機能を介して
exec
有効なユーザーIDからコピーされます。ファイルの設定されたユーザーIDビットが設定されている場合は、このコピーを保存してください。後ろにexec
ファイルのユーザーIDに有効なユーザーIDを保存します。
それはどういう意味ですか?
まず、プロセスのEUIDがファイルのユーザーIDに変更され、
それでは、プロセスによって保存されたset-user-IDがプロセスのEUIDに変わりますか?
その後、プロセスのEUIDと保存されたset-user-IDはファイルのユーザーIDに変更されますか?
ベストアンサー1
これ文書:credentials(7)
これはLinuxシステムについて明確になりました。
ユーザーとグループの識別子
各プロセスには、さまざまな関連ユーザーとグループIDがあります。これらのIDは、それぞれ型と
uid_t
式gid_t
(で定義されている)を使用する整数です<sys/types.h>
。Linuxでは、各プロセスには次のユーザーとグループの識別子があります。
実際のユーザーIDと実際のグループID。これらのIDは、プロセスを所有している人を決定します。プロセスはを使用して実際のユーザー(グループ)IDを取得できます
getuid(2)
。有効ユーザーIDと有効グループID。カーネルはこれらのIDを使用して、メッセージキュー、共有メモリ、セマフォなどの共有リソースにアクセスするときにプロセスが持つ権限を決定します。ほとんどのUNIXシステムでは、これらのIDはファイルにアクセスするときの権限も決定します。ただし、Linuxは以下のファイルシステムIDを使用してこれを行います。プロセスはを使用して有効なユーザー(グループ)IDを取得できます
geteuid(2)
。保存された設定ユーザーIDと保存された設定グループID。これらのIDは、set-user-IDおよびset-group-IDプログラムでプログラムを実行すると、その有効なIDセットのコピーを保存するために使用されます(参考資料を参照
execve(2)
)。ユーザーID設定プログラムは、実際のユーザーIDと保存されたユーザーID設定値の間で有効なユーザーIDを切り替えることで、権限を取得または放棄できます。この切り替えはseteuid(2)
、またはを呼び出すことによってsetreuid(2)
行われますsetresuid(2)
。 set-group-IDプログラムを使用するか、setegid(2)
同様のsetregid(2)
操作を実行しますsetresgid(2)
。プロセスは、を使用して保存されたset-user-ID(set-group-ID)を取得できますgetresuid(2)
。[...]
私は何が起こるのかを調べるためにテストプログラムを書いています。
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
int getuids(uid_t *uids) {
if(getresuid(&uids[0], &uids[1], &uids[2]) == -1) {
perror("Unable to get UIDs\n");
return 0;
}
return 1;
}
int getgids(gid_t *gids) {
if(getresgid(&gids[0], &gids[1], &gids[2]) == -1) {
perror("Unable to get GIDs\n");
return 0;
}
return 1;
}
int main(void) {
uid_t uids[3];
gid_t gids[3];
if(getuids(uids) && getgids(gids)) {
printf("Real ID: user %d, group %d\n", (int)uids[0], (int)gids[0]);
printf("Effective ID: user %d, group %d\n", (int)uids[1], (int)gids[1]);
printf("Set-ID: user %d, group %d\n", (int)uids[2], (int)gids[2]);
seteuid(uids[0]);
getuids(uids);
getgids(gids);
printf("Effective ID: user %d, group %d\n", (int)uids[1], (int)gids[1]);
}
return 0;
}
ファイルは次のようになります。
server /home/erik # ls -l perms
-r-sr-sr-x 1 nobody nobody 8280 Apr 26 00:36 perms
次に実行するroot
:
server-calgary /home/erik # ./perms
Real ID: user 0, group 0
Effective ID: user 65534, group 65534
Set-ID: user 65534, group 65534
Effective ID: user 0, group 65534
次に実行するerik
:
erik@server ~ $ ./perms
Real ID: user 1000, group 1000
Effective ID: user 65534, group 65534
Set-ID: user 65534, group 65534
Effective ID: user 1000, group 65534
テストプログラムが示すように、ファイルがset-IDの場合、EUID / EGIDはファイル内の所有者/グループで始まります(set-UIDおよびset-UID + GID権限のみが機能します!)。プログラムが要求する場合、このIDと呼び出し元の実際のIDの間に作成されます。