首页 > 解决方案 > 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"

现在,如果我设置文件的 SUID 位script,如下所示:

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 位会导致任何第 3 方用户帐户能够附加到./owned_by_root.

SUID 通常由/etc/passwd/ /usr/bin/passwddynamic 解释,其权限位分别与owned_by_root和的权限位匹配script。一定有我遗漏/误解的东西。

标签: linuxpermissionsfile-permissionschmod

解决方案


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


推荐阅读