为什么我的 setuid root 的 bash 脚本无法正常工作?

7
我创建了这个简单的脚本,允许用户在不给予"su"权限的情况下删除他家目录中由Web服务器创建的文件。这两个脚本都设置为"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

2:

#!/bin/bash

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

chown -R user /home/user

exit 0

我会让它们更加先进并适用于多个用户,但现在我甚至无法让简单版本运行。当然,以root身份运行时它是可以工作的。过去,以'user'用户身份运行时它也能工作,但现在不行了。我得到了这个错误信息:

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 ...

并且

chown: changing ownership of ‘/home/user/test-dir’: Operation not permitted

可能的问题是什么?

-rwsr-x--- 1 root user 291 Nov  6 05:23 delete.sh
-rwsr-x--- 1 root user 177 Nov  6 05:45 perms.sh

检查SUID是否在脚本中生效:添加以下代码 echo whoami,输出是否为root? - Noproblem
1
作为一项安全措施,大多数系统不允许设置 shell 脚本的 setuid。虽然不确定为什么以前可以工作。 - chepner
奇怪的是,它在今天早些时候在同一台系统上运行正常。我不知道我改了什么或者发生了什么变化。我会试一下这个。 - Bob
你猜对了,但我该如何修复它?为什么之前它还能正常工作? - Bob
4
有什么方法可以阻止某人在“DIRECTORY”中输入“../../etc/passwd”以重置所有密码(包括root)? - 12431234123412341234123
1个回答

6
有一篇相当全面的回答,可在https://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts上找到。
总的来说,有两个主要方面不支持它:
  1. 内核打开文件以查找应该执行哪个解释器和解释器打开文件以读取脚本之间存在竞争条件。
  2. 执行许多外部程序但未进行适当检查的Shell脚本可能会被欺骗执行错误的程序(例如使用恶意路径),或以损坏的方式扩展变量(例如在变量值中有空格),通常无法控制其执行的外部程序如何处理输入。
从历史上看,在原始Bourne shell中曾经有一个著名的漏洞(至少在4.2BSD上是这样,那是我亲眼见过的),允许任何人通过创建名为-i的符号链接来获取交互式根shell。这可能是禁止此功能的最初触发器。
编辑:要回答“如何修复它” - 配置sudo仅允许用户作为用户root执行这些脚本,并可能使用诸如https://dev59.com/pW445IYBdhLWcg3w_PG3#4598126中的技巧来查找原始用户的名称并强制对其自己的主目录进行操作,而不是让他们传递任意输入(也就是说,在您所提供的脚本的当前状态下,没有任何内容可以防止user1执行脚本并将它们传递给user2的目录,或者任意目录)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接