超级用户进程可以更改进程的真实用户ID和组ID,而不匹配密码文件中的用户ID和组ID吗?


11

从APUE

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

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


5
这里有一个重要的说明:以超级用户特权运行的进程具有更改自己的 UID和GID 的能力,而不是其他进程的能力。
filbranden


用户信息数据库纯粹是用户权限。内核仅关心UID和GID,而不关心用户或组数据库。
炸鱼薯条德里克18/12/22

Answers:


15

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

编辑#1

这意味着像这样的程序login将从文件中读取值,因此文件是配置文件或输入文件。它们不是程序可以做什么的约束。超级用户进程可以将任何值传递给内核,并且内核将不检查任何文件。

程序可以调用

setgid (54321);
setuid (12345);

即使在任何文件中都没有提到ID的情况下,这也将起作用。


9

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

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

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

Unix中的安全模型部分在内核中实现,部分在进程中以更高的功能(例如,以root用户身份)运行。


请注意,/etc/passwd/etc/group也被读取lsps以及任何其他程序需要从用户/组ID的用户名/组名翻译成/。(他们可能会通过库来执行此操作,而不是知道存储这些详细信息的替代方法。)


1
想要显示或处理用户名而不是内部数字ID(例如和)的进程也会读取它们(/etc/passwd/etc/groups)。psls
乔纳斯·谢弗(JonasSchäfer)'18

3

除其他事项外,的目的/etc/passwd是将用户转换为用户的UID。如果您不关心鲍勃的UID是什么,则不需要该文件。如果只想更改为任意UID / GID,请使用相关的syscall:

int setuid(uid_t uid);
int setgid(gid_t gid);

请注意,具有CAP_SETUIDCAP_SETGID 功能的特权进程(根进程通常具有该特权进程)只能更改其自己的UID和GID,而不能更改另一个正在运行的进程的UID和GID。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.