我在 /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
passwd
ruby 脚本 "script" 与命令具有相同的权限:
$ 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可写文件“file”吗?
您可以尝试改用访问控制列表 (ACL)。在下面的命令中,我 (dmo) 授予用户bob对名为test的文件的读/写访问权限:
现在在权限末尾
ls
显示一个标志,表明 ACL 对文件有效。+
要查看 ACL 允许使用的内容
getfacl
:如您所见,鲍勃现在拥有他需要的写访问权限。
如果要删除 ACL,可以使用
setfacl --remove-all
:有一些关于 ACL 的很好的教程,这是一个经常被忽视的功能:https ://linuxconfig.org/how-to-manage-acls-on-linux
最后,要非常小心您允许谁写入由root用户拥有/读取的文件。