后续问题https://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts。Gilles 给出了一个很好的答案。唉,我不明白。那里没有描述可执行文件和可解释文件之间本质上的区别。
脚本有一个竞争文件替换条件,但 Unix 锁定对于解决这个问题不是必需的。任何 C 可执行文件都首先被读取然后执行。这可以使用可解释代码和可执行代码轻松完成。大多数(shell)脚本也不比大多数 C 可执行文件长,因此两者都可以先加载。早期的实现首先读取一行,然后关闭文件,然后重新打开它(因此遭受这种竞争条件),这一事实并不是内在的。它只是碰巧是一种古老的实现。通过读取整个可解释脚本文件,这难道不能在所有 unix 实现中轻松普遍修复吗?
完成特定功能所需的运行时存在漏洞,但这适用于 C 代码和解释器。那么,shell 或 python 脚本是否添加/具有易受攻击的运行时?
任何(C)可执行文件都可以像解释语言一样调用其他 shell 程序。程序之间传递信息最初被认为是 Unix 方式,所以我们应该经常这样做。
Gilles 的回答中或多或少说明了所有这些,也许除了明确的“先读取全部,然后执行”。相反,它描述了 /dev/fd/ 等效实现。
所以我仍然想念它。有什么本质上的不同?(我能想到的唯一安全功能是通过禁止 suid 脚本,我们让新手更难编写任何setuid 脚本。
是否有一个委员会制定并解释了他们的决定,比如说,关于 ubuntu,我可以在哪里读到其动机?
/iaw
答案1
当然,可以改变实现方式以保证安全,但在实践中,这需要每个 Unix 供应商的合作,以及大量的用户再教育。如果您能够协调这样的努力,那么您将获得更大的权力。:) 替代方案(例如,坚持使用 setuid 包装程序)可能不方便,但并非无法容忍。
换句话说,我们仍然无法正确拼写是有充分理由的创造。解决这一问题需要付出的努力与得到的利益是不相称的。
答案2
修改 shell 脚本比修改二进制文件容易得多。除了编辑器和文件的写权限外,不需要其他特殊工具。即使 sed 也可以,但它仍然是流编辑器。
不过,从安全角度来看,这确实有意义。您可以通过 sudo 运行脚本,或通过 su 转为 root。您始终可以在脚本中运行 suid 程序……