set-user-ID ビットがオンの場合、プロセスの EUID と保存された set-user-ID の両方がファイルのユーザー ID に変更されますか?

set-user-ID ビットがオンの場合、プロセスの EUID と保存された set-user-ID の両方がファイルのユーザー ID に変更されますか?

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_tgid_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の間に作成されます。

おすすめ記事