【问题标题】:Linux SUID permission bit behavior - what am I missing?Linux SUID 权限位行为 - 我错过了什么?
【发布时间】:2021-12-10 08:58:06
【问题描述】:

假设如下目录结构:

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

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

【问题讨论】:

    标签: linux permissions file-permissions chmod


    【解决方案1】:

    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 是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 2016-08-20
      • 2018-04-06
      • 2018-08-31
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多