Linux SUID权限位行为-我错过了什么?



假设目录结构如下:

-rwxr-xr-x 1 root   root       script
-rw-r--r-- 1 root   root       owned_by_root

假设script是一个简单的shell脚本,包含以下内容:

#!/usr/bin/bash
echo "Appending $2 to $1..."
echo -n "$2" >> $1

owned_by_root是一个空文件。


由于owned_by_root显然属于root用户,并且只为所属用户设置写标志,因此在非root帐户下执行以下操作显然会失败:

user@machine 
$ ./script ./owned_by_root "Hi"

现在,如果我设置script文件的SUID位,像这样:

sudo chmod u+s ./script

(导致script的权限位为-rwsr-xr-x),令我惊讶的是,

user@machine 
$ ./script ./owned_by_root "Hi"

仍然失败,使用./script: line 4: owned_by_root: Permission denied

在我的印象中,在脚本可执行文件中设置SUID位将导致任何第三方用户帐户能够附加到./owned_by_root

SUID通常由/etc/passwd//usr/bin/passwd动态解释,它们的权限位分别与owned_by_rootscript的权限位匹配。一定是我错过了什么/误解了什么。

Linux似乎忽略了shebang (#!)脚本上的SETUID位。这可以通过在脚本中添加sleep命令并同时检查进程表来确认:

$ ps aux | grep -i script
user   1271826  0.0  0.0  10084  2796 pts/4    S+   18:20   0:00 /usr/bin/bash ./script owned_by_root Hello

通过观察第一列,可以明显看出bash进程是在最初执行脚本的同一用户下运行的。

编译后的程序则不是这样,/usr/bin/passwd就是。

相关内容

最新更新