我读过很多关于该setuid
钻头如何工作以及如何sudo
工作的问题和答案,我想我已经理解了这些内容。
但是,我无法找出通过 sudo 执行程序时会发生什么如果该程序本身已setuid
设置位。这个问题最好用一个例子来解释:
在相关系统上,有一个名为 的用户user1
。系统已sudo
正确安装和配置,以便root
用户可以以他想要的任何不同用户身份执行程序。此外,还有一个程序/usr/bin/exampleprog
拥有root:wheel
并设置了setuid
和setgid
位:
root@morn ~ # dir /usr/bin/exampleprog
-rwsr-sr-x 1 root wheel 92K 2017-11-16 23:42 /usr/bin/exampleprog
现在我登录作为根用户并执行以下命令:
root@morn ~ # sudo -u user1 /usr/bin/exampleprog
然后会发生什么?是以exampleprog
root 身份运行user1
(正如给定的选项所预期的那样sudo
),还是以 root 身份运行(因为可执行文件由 root 拥有并设置了其setuid
位)?
为了使事情变得更复杂,还有一个附加程序/usr/bin/wrapper
,也属于root:wheel
,但是没有和setuid
位setgid
:
root@morn ~ # dir /usr/bin/wrapper
-rwxr-xr-x 1 root wheel 15K 2017-11-16 23:42 /usr/bin/wrapper
程序wrapper
在执行时会在某个时刻执行(生成)/usr/bin/exampleprog
。
现在我执行:
root@morn ~ # sudo -u user1 /usr/bin/wrapper
当wrapper
生成时exampleprog
,后者会作为user1
还是作为运行root
?
答案1
id
您可以通过将程序复制到某处并更改其权限来进行试验。这将显示exampleprog
以 root 的有效 uid 和对应于 的真实 uid 运行user1
。
考虑一下如果您登录user1
并运行会发生什么exampleprog
:由于后者是 suid root,因此您希望它以 root 的有效 uid 运行。当您通过 运行程序时,这同样适用sudo
。