我有点困惑。如果我将zsh复制到tmp并更改Set UID位chmod u+s
,请更改用户,然后运行复制的zsh。如果我运行whoami
,我会获得root。如果我对bash做同样的事情,在我运行bash之后,我会得到我之前登录的用户。他们的行为有什么不同的原因吗?
这是bash的一个有意特性;要禁用它,请使用-p
选项运行bash。
更详细地说:当您运行setuid二进制文件时,进程的有效uid(euid(被设置为二进制文件的有效uid,但其实际uid不会更改。bash检测到差异,并(如果没有传递-p
选项(将其euid重置为实际uid。
来自bash手册:
使用不相等的有效UID/GID调用
如果启动Bash时有效用户(组(id不等于实际用户(组的(id,并且未提供
-p
选项,则不会读取启动文件,外壳函数不会从环境中继承,SHELLOPTS
、BASHOPTS
、CDPATH
和GLOBIGNORE
变量(如果它们出现在环境中(将被忽略,并且有效用户id设置为实际用户id。如果在调用时提供-p
选项,则启动行为相同,但不会重置有效的用户id。