Linux 将 'ruid' 和 'euid' 放在哪里?

Where does Linux keep 'ruid' and 'euid'?

我想知道 Linux 内核在哪里保存 'ruid' 和 'euid'。

以下是我对他们的了解。

当一个用户运行s 一个文件并且该文件变成一个进程时,该进程将拥有 ruid 和 euid。

如果文件已经设置为使用setuid,则进程的euid会变为该文件所有者的用户id,否则euid不会改变,与ruid相同。

然后,Linux内核允许进程根据ruid和euid运行另一个进程或使用系统中的其他资源。

所以,我认为这意味着内核必须将每个进程的 ruid 和 euid 保存在 RAM 中的某个位置。

我以为 'somewhere' 在 PCB 中,但是 PCB 块没有 ruid 和 euid 字段。

我试图在 '/proc' 目录的进程文件中找到它们,但失败了。

Linux在哪里保存运行ning进程的ruid和euid?

这里解释了它在新内核中是如何工作的:

  • 从 user-space 的角度来看,可以使用 setreuid() 系统调用更改真实有效的用户 ID。有关使用详情,请参阅 man 2 setreuid

  • 内核正在使用 struct cred 存储 UID 和 EUID

  • 每个进程都有自己的struct cred;查看 struct task_struct

    中的 .cred 字段
  • RUID存储在struct cred.uid字段中;参见 setreuid() 系统调用代码:

      struct cred *new;
      kuid_t kruid, keuid;
      ...
      kruid = make_kuid(ns, ruid);
      keuid = make_kuid(ns, euid);
      ...
      new->uid = kruid;
      new->euid = keuid;
      ...
      return commit_creds(new);
    
  • commit_creds()函数实际上是设置当前进程的RUID和EUID

另请参阅此答案以获取有关旧内核的线索: