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

以下是我对他们的了解。

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

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

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

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

我认为“某处”在 PCB 中,但 PCB 块没有 ruid 和 euid 字段。

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

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

最佳答案

以下是它在新内核中如何工作的解释:

  • 从用户空间的角度来看,可以使用 setreuid() 系统调用更改真实有效的用户 ID。使用细节见 man 2 setreuid
  • 内核使用 struct cred 来存储 UID 和 EUID
  • 每个进程都有自己的 struct cred ;查看 struct task_struct 中的 .cred 字段
  • RUID 存储在 .uidstruct cred 字段中;参见 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 设置为当前进程

  • 另请参阅此答案以获取有关旧内核的线索:How to get current process's UID and EUID in Linux Kernel 4.2?

    关于linux - Linux 在哪里保存 'ruid' 和 'euid' ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39873944/

    10-12 23:41