为什么文件修改后suid位未被设置

为什么文件修改后suid位未被设置

我有一个全局可写的 (s|g)uid 文件:

ls -lh suid_bin.sh
-rwsr-srwx 1 root root 168 mai   23 16:46 suid_bin.sh

使用非 root 用户帐户登录。我使用 vi (或其他编辑器)修改“suid_bin.sh”。保存新内容后,(s|g)uid 位被取消设置:

ls -lh suid_bin.sh 
-rwxr-xrwx 1 root root 168 mai   23 16:46 suid_bin.sh

为什么?有没有办法在修改后保留 (s|g)uid 位?

答案1

如果有人意外地在 setuid 文件上设置组或世界可写位,Unix 权限允许写入文件,但不允许陌生人更改此类文件的所有者和组 ID。

因此,修改后内核会从文件中删除 setuid/setgid 位,以确保没有恶意代码写入文件。

root 用户当然可以恢复 setuid 位,但是普通用户如果由于某人的错误而获得了对特权可执行文件的写访问权限,则将无法利用它。

而且,了解该区域的内核部分,我不确定您是否可以在不编辑内核源代码并重新编译的情况下禁用它。

请注意,Linux 中的 setuid 脚本在执行后不会获得 setuid 状态,因为实际上内核启动脚本解释器,没有 setuid 状态,并将脚本的完整路径作为最后解析的参数,然后解释器将脚本作为普通文件读取。但这在其他 Unix 系统上可能会有所不同。

相关内容