超级用户进程是否可以更改进程的真实用户 ID 和组 ID,而不是密码文件中的那些?

Tim*_*Tim 11 linux users group

来自 APUE

进程的真实用户 ID 和真实组 ID 标识了我们的真实身份。这两个字段取自我们登录时密码文件中的条目。通常,这些值在登录会话期间不会更改,尽管超级用户进程可以通过多种方式 更改它们

超级用户进程是否可以更改进程的真实用户ID和真实组ID,从而使真实用户ID和真实组ID之间的关系与密码文件中的关系不匹配?例如,如果用户Tim不是ocean每个密码文件的组成员,超级用户进程是否可以将进程的真实用户 ID 和真实组 ID分别更改为Timocean

Ral*_*edl 15

是的,超级用户进程可以将其真实用户 ID 和真实组 ID 更改为它想要的任何值。中的数值/etc/passwd/etc/shadow是什么值应该设置的配置,但不是可能的值的限制。

编辑 #1

这意味着程序login会从文件中读取值,因此文件是配置文件或输入文件。它们不是对程序可以做什么的限制。超级用户进程可以向内核传递任何值,内核不会检查任何文件。

一个程序可以调用

setgid (54321);
setuid (12345);
Run Code Online (Sandbox Code Playgroud)

这会起作用,即使任何文件中都没有提到任何 id。


ctr*_*lor 9

密码文件和组文件不被读取,它们只被登录进程读取,以设置真实用户ID和真实组ID。

内核中没有提到这些文件。登录必须打开文件,处理它们并设置两个 ID。从其他地方获取这些 ID 可以用不同的方式编写。例如,来自网络数据库。

任何具有 CAP_SETUID 能力的进程都可以设置这些 ID,root 具有此能力。

Unix 中的安全模型部分在内核中实现,部分在以提升的能力(例如作为 root)运行的进程中实现。


请注意,/etc/passwd/etc/group也由lsps以及需要将用户/组名称转换为/从用户/组 ID 转换的任何其他程序读取。(他们可能通过图书馆来做到这一点,而不是知道存储这些细节的替代方法。)