为什么我的 setuid root bash shell 脚本不起作用?

Bob*_*Bob 7 permissions bash setuid chmod chown

我创建了这个简单的脚本,以允许用户删除 Web 服务器在其主目录中创建的文件,而无需给他“su”。两个脚本都设置为"chmod 4750"

最疯狂的是他们确实有效,现在却没有。这是脚本:

#!/bin/bash

# Ask for directory to delete
echo "Enter the file or directory you would like to delete, the assumed path is    /home/user"

read DIRECTORY

rm -rf /home/user/"$DIRECTORY"

echo "Deleting /home/user/$DIRECTORY ..."

exit 0
Run Code Online (Sandbox Code Playgroud)

2:

#!/bin/bash

# Reset permissions
echo "Resetting the ownership of the contents of /home/user to user."

chown -R user /home/user

exit 0
Run Code Online (Sandbox Code Playgroud)

我会让它们更高级一些并为多个用户工作,但现在我什至无法让简单的版本工作。当然,它在以 root 身份运行时有效。它曾经在以用户“用户”身份运行时可以工作,但现在不行了。我明白了:

user@dev:/home/user$ delete.sh
Enter the file or directory you would like to delete, the assumed path is /home/user/[your input]
test-dir
rm: cannot remove ‘/home/user/test-dir/test-file’: Permission denied
Deleting /home/user/test-dir ...
Run Code Online (Sandbox Code Playgroud)

chown: changing ownership of ‘/home/user/test-dir’: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?

-rwsr-x--- 1 root user 291 Nov  6 05:23 delete.sh
-rwsr-x--- 1 root user 177 Nov  6 05:45 perms.sh
Run Code Online (Sandbox Code Playgroud)

Amo*_*ira 6

https://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts有一个非常全面的答案

最重要的是,有两个要点反对它:

  1. 内核打开文件以查找应执行哪个解释器与解释器打开文件以读取脚本之间的竞争条件。
  2. 在没有适当检查的情况下执行许多外部程序的 Shell 脚本可能会被愚弄执行错误的程序(例如使用恶意的 PATH),或者以破坏的方式扩展变量(例如,变量值中有空格),并且通常它对如何执行的控制较少它执行的外部程序处理输入。

从历史上看,原始 Bourne shell 中有一个著名的错误(至少在 4.2BSD 上,这是我在那里看到的),它允许任何人通过创建一个调用-isuid shell 脚本的符号链接来获得交互式 root shell 。这可能是被禁止的最初触发因素。

编辑:回答“我如何修复它” - 配置sudo为仅允许用户以 user 身份执行这些脚本root,并且可能使用/sf/answers/321868851/ 中的技巧来查找原始用户名并在他们自己的主目录上强制操作,而不是让他们传入任何任意输入(即在当前状态下,您在问题中包含的脚本中的任何内容都不会阻止user1执行脚本并传递它们users2的目录或任何目录那件事)