我在 /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
最后,要非常小心地选择允许谁写入由根用户。