Tim*_*Tim 11 linux users group
来自 APUE
进程的真实用户 ID 和真实组 ID 标识了我们的真实身份。这两个字段取自我们登录时密码文件中的条目。通常,这些值在登录会话期间不会更改,尽管超级用户进程可以通过多种方式 更改它们
超级用户进程是否可以更改进程的真实用户ID和真实组ID,从而使真实用户ID和真实组ID之间的关系与密码文件中的关系不匹配?例如,如果用户Tim不是ocean每个密码文件的组成员,超级用户进程是否可以将进程的真实用户 ID 和真实组 ID分别更改为Tim和ocean?
Ral*_*edl 15
是的,超级用户进程可以将其真实用户 ID 和真实组 ID 更改为它想要的任何值。中的数值/etc/passwd和/etc/shadow是什么值应该设置的配置,但不是可能的值的限制。
这意味着程序login会从文件中读取值,因此文件是配置文件或输入文件。它们不是对程序可以做什么的限制。超级用户进程可以向内核传递任何值,内核不会检查任何文件。
一个程序可以调用
setgid (54321);
setuid (12345);
Run Code Online (Sandbox Code Playgroud)
这会起作用,即使任何文件中都没有提到任何 id。
密码文件和组文件不被读取,它们只被登录进程读取,以设置真实用户ID和真实组ID。
内核中没有提到这些文件。登录必须打开文件,处理它们并设置两个 ID。从其他地方获取这些 ID 可以用不同的方式编写。例如,来自网络数据库。
任何具有 CAP_SETUID 能力的进程都可以设置这些 ID,root 具有此能力。
Unix 中的安全模型部分在内核中实现,部分在以提升的能力(例如作为 root)运行的进程中实现。
请注意,/etc/passwd和/etc/group也由ls,ps以及需要将用户/组名称转换为/从用户/组 ID 转换的任何其他程序读取。(他们可能通过图书馆来做到这一点,而不是知道存储这些细节的替代方法。)