gpt4 book ai didi

linux - 当为可执行文件设置 set-user-ID 时, `exec` 如何以及何时更改有效用户 ID

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:05 26 4
gpt4 key购买 nike

我的问题来自阅读 APUE。

在Unix或Linux中,进程通过调用exec函数执行可执行文件时,如果为可执行文件设置了set-user-ID位,则exec 将有效用户 ID 更改为文件的所有者。

  1. exec 如何改变有效用户 ID?

    exec 是通过调用 setuid 还是通过其他函数进行更改?

  2. exec 何时更改有效用户 ID?

    exec 是否改变有效内核执行之前之后进程的用户ID进程是否允许执行的权限测试文件?

    等同于上面的问题,在内核执行权限测试之前允许进程执行文件,是文件的有效ID处理 beforeafter exec 更改有效文件所有者的用户 ID?

谢谢。

最佳答案

我会介绍 UNIX V7这里。 UNIX 有几十个版本,但它们对 exec 的实现非常相似。

有效uid是per-process user structure中的一个字段, 并与 process structure 中的类似字段保持同步.在 V7 中,更改有效 uid 是通过两个简单的赋值语句完成的:

/*
* set SUID/SGID protections, if no tracing
*/
if ((u.u_procp->p_flag&STRC)==0) {
if(ip->i_mode&ISUID)
if(u.u_uid != 0) {
u.u_uid = ip->i_uid;
u.u_procp->p_uid = ip->i_uid;
}
if(ip->i_mode&ISGID)
u.u_gid = ip->i_gid;
}

[练习:(u.u_uid != 0) 的检查结果是什么,为什么它在后续 UNIX 版本中从 exec 代码中删除?]

exec 做的第一件事是检查权限,通过调用 access,它使用进程的有效 uid 和 gid。它在甚至查看文件的 setuid 位之前很久就执行了此操作。

if ((ip = namei(uchar, 0)) == NULL)
return;
if(access(ip, IEXEC))
goto bad;

uid 更改是在所有权限和魔数(Magic Number)检查以及内存分配完成后完成的。正如代码在分配和 uid 设置之前不久所说的那样:

/*
* allocate and clear core
* at this point, committed
* to the new image
*/

关于linux - 当为可执行文件设置 set-user-ID 时, `exec` 如何以及何时更改有效用户 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41456225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com