该setuid
位意味着如果有人执行该文件,它将以该文件的所有者身份运行。
但是假设我(所有者)启用了 setuid 位但禁用了我自己执行权限:
theowner@hostname:~$ echo "echo \"Running as user $(whoami)\"" > script.sh
theowner@hostname:~$ sudo chmod u=rs,go+x script.sh
该文件的权限现在是-r-Srwxr-x
,对于我自己,请参见大写字母S
,但x
对于组和其他人,请参见大写字母。
如果我尝试运行该脚本,则会得到预期的结果:
bash: ./script.sh: Permission denied
因为我没有执行权限。如果我有,我的权限位将是s
,而不是S
。setuid
但是现在假设我su
进入另一个用户帐户,someperson
并尝试立即运行它。
Running as user theowner
为什么当被禁止执行脚本时theowner
,仍然允许其他用户执行该脚本?theowner
答案1
setuid 位对 Linux 系统中的脚本没有任何影响像 Ubuntu。您观察到的情况是您在创建脚本时犯的引用错误的结果。您的脚本实际上并未检查谁在运行它。它已theowner
硬编码到其中,并且Running as user theowner
无论以哪个用户身份运行,它都会始终报告。要确认这一点,只需检查脚本的内容即可。
我的用户名是ek
。当我编写您的脚本并检查其内容时,我看到:
$ echo "echo \"Running as user $(whoami)\"" > script.sh
$ cat script.sh
echo "Running as user ek"
第三行显示了脚本的内容。脚本不是ek
通过运行以编程方式确定的。我还没有运行它!文本ek
出现在脚本本身中,就像文本theowner
出现在您的脚本中一样。
我没有更改脚本的权限。以下是当我将其设为可执行文件,然后以我自己的身份运行它 ( ek
),然后以单独的用户身份运行它 ( ek2
) 时发生的情况。请注意,即使我没有设置 setuid 位,也会发生这种情况(并且 的输出ls -l
显示它未设置)。
$ chmod +x script.sh
$ ls -l script.sh
-rwxrwxr-x 1 ek ek 26 Oct 4 18:29 script.sh
$ ./script.sh
Running as user ek
$ su ek2 -c './script.sh'
Password:
Running as user ek
为什么被$(whoami)
评估而不是被保留并直接写入脚本?这是因为命令替换, 喜欢参数扩展以及由触发的其他扩展$
,即使在内部,也由您的 shell 执行双引号字符串。
您可以使用单引号而不是阻止这种情况发生。然后你得到:
$ echo 'echo "Running as user $(whoami)"' > script2.sh
$ cat script2.sh
echo "Running as user $(whoami)"
$ chmod +x script2.sh
$ ls -l script2.sh
-rwxrwxr-x 1 ek ek 33 Oct 4 18:39 script2.sh
$ ./script2.sh
Running as user ek
$ su ek2 -c './script2.sh'
Password:
Running as user ek2
$ chmod u=rs,go+x script2.sh
$ ls -l script2.sh
-r-Srwxr-x 1 ek ek 33 Oct 4 18:39 script2.sh
$ ./script2.sh
-bash: ./script2.sh: Permission denied
$ su ek2 --c './script2.sh'
Password:
Running as user ek2
请注意,脚本仍按原样运行,ek2
因为操作系统忽略了 setuid 位,就像所有脚本一样。setuid 和 setgid 位仅在二进制可执行文件(以及目录)上有效,他们做了一些完全不同的事情)。