为什么没有“设置有效补充 GID”系统调用?

为什么没有“设置有效补充 GID”系统调用?

进程的“有效用户/组 ID”是操作系统用来确定进程是否允许某个操作(例如打开文件)的内容。您可以使用以下命令设置当前进程的有效主GIDsetegid,它只能由超级用户(或者如果有能力的话)用来暂时降低权限。

补充 GID 是附加组,也用于检查进程是否允许某个操作。例如,如果文件位于目录结构下/A/B/C/file.txt,并且目录AB、 和分别C对其所有者锁定了读访问权groupAgroupBgroupC进程将需要其补充组或有效 GID 中的所有 3 个组。

有一个setgroupssyscall 类似于setgid,这意味着它永久地改变进程的环境。是否不需要补充组(即setegroups)的“有效”系统调用?

答案1

这样的系统调用不存在,因为补充组可以被认为是它们本身有效的组。

真实和有效的 UID 和 GID 之间的区别是为了允许进程放弃权限,但也允许用户提高调用某些进程的权限(通过 setuid/setgid 文件系统位)。在这两种情况下,我们都希望跟踪具有提升/降低权限的进程背后的用户的真实 UID 和 GID(有效 UID 和 GID)。

补充组不需要这种差异,因为它们可以轻松地从groups文件中恢复。

请注意,当加注或放弃特权,应用程序通常会调用initgroups重置组以匹配新用户的有效 uid 和 gid(从而失去对先前可能存在的任何其他补充组的访问权限)。

另一个来源:

“setgroups 的唯一用途通常来自 initgroups 函数,该函数使用 getgrent、setgrent 和 endgrent 函数读取整个组文件(我们之前描述过),并确定用户名的组成员身份。然后它调用 setgroups 来初始化补充组用户的 ID 列表。必须是超级用户才能调用 initgroups,因为它调用 setgroups。

相关内容