为什么 setuid 模式 S 似乎对脚本的非所有者有效?

为什么 setuid 模式 S 似乎对脚本的非所有者有效?

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,而不是Ssetuid但是现在假设我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 位仅在二进制可执行文件(以及目录)上有效,他们做了一些完全不同的事情)。

相关内容