假设目录结构如下:
-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_root
和script
的权限位匹配。一定是我错过了什么/误解了什么。
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
就是。