启用粘滞位脚本无法写入根文件

启用粘滞位脚本无法写入根文件

我在 /tmp/ 中有 2 个文件。

  • 第一个是一个名为“file”的空文件,具有权限-rw-------和所有者root:root

  • 第二个文件名为“script”,是一个简单的 Ruby 脚本,具有权限-rwsr-xr-x和所有者root:root。脚本文件的内容如下:

#!/usr/bin/env ruby
$-v = true

IO.write( File.join(Dir.pwd, 'file'), 100.times.map { rand(97..122).chr }.join << ?\n )

文件“file”具有与以下/etc/shadow文件相同的权限:

# ls -l /etc/shadow
-rw------- 1 root root 1045 Sep 22 04:13 /etc/shadow

# ls -l file
-rw------- 1 root root 6 Nov 29 12:22 file

ruby 脚本“script”具有与以下命令相同的权限passwd

$ ls -l $(type -p passwd)
-rwsr-xr-x 1 root root 63624 Nov 13 22:28 /usr/bin/passwd

# ls -l script
-rwsr-xr-x 1 root root 78 Nov 29 12:22 script

我可以./script以 root 身份运行,用一些随机字符串替换文件“file”的内容。

但是当我./script以非 root 用户身份运行时,Ruby 会引发Errno::EACCES


我可以通过正确设置 SUID 权限以非 root 用户身份写入 root 可写文件“文件”吗?

答案1

您可以尝试使用访问控制列表 (ACL)。在下面的命令中,我 (dmo) 为用户提供鲍勃对名为的文件进行读/写访问测试

$ setfacl -m u:bob:rw test

现在在权限末尾ls显示一个符号,表明 ACL 对文件有效。+

$ ls -l
total 4
-rw-rw-r--+ 1 dmo dmo 0 Nov 29 07:22 test

要查看 ACL 允许使用的内容getfacl

$ getfacl test
# file: test
# owner: dmo
# group: dmo
user::rw-
user:bob:rw-
group::rw-
mask::rw-
other::r--

如你看到的鲍勃现在拥有他需要的写权限。

如果您想删除 ACL,您可以使用setfacl --remove-all

$ setfacl --remove-all test
$ ls -l
total 0
-rw-rw-r--. 1 dmo dmo 0 Nov 29 07:22 test

有一些关于 ACL 的很好的教程,这是一个经常被忽视的功能:https://linuxconfig.org/how-to-manage-acls-on-linux

最后,要非常小心地选择允许谁写入由用户。

相关内容