Answers:
实际上,对文件和目录的特权访问取决于功能,而不仅取决于是否root
存在。在实践中,root
通常具有所有可能的功能,但是在某些情况下,所有/很多功能可能会被删除,或者某些功能会分配给其他用户(他们的过程)。
简而言之,您已经描述了访问控制检查如何处理特权进程。这是不同功能实际上如何影响它的方式:
这里CAP_DAC_OVERRIDE
的主要功能是,具有它的进程可以“绕过文件读取,写入和执行权限检查”。这包括读取和写入任何文件,以及读取,写入和访问目录。
它实际上不适用于执行未标记为可执行文件的文件。()中的注释在generic_permission
fs/namei.c
访问权限检查文件之前说:
读/写DAC始终是可重写的。当至少有一个执行位设置时,可执行的DAC是可重写的。
x
如果您要执行文件,代码会检查是否至少设置了一位。我怀疑这只是一个便利功能,可以防止意外运行随机数据文件并避免出现错误或奇怪的结果。
无论如何,如果您可以覆盖权限,则可以制作一个可执行副本并运行它。(尽管它在理论上可能有所不同,因为进程的setuid文件可以覆盖文件权限(CAP_DAC_OVERRIDE
),但没有其他相关功能(CAP_FSETID
/ CAP_FOWNER
/ CAP_SETUID
。)但是CAP_DAC_OVERRIDE
可以进行编辑/etc/shadow
和类似的操作,因此它大致相等只是拥有完整的root访问权限。)
还有一种CAP_DAC_READ_SEARCH
功能可以读取任何文件并访问任何目录,但不能执行或写入它们。并CAP_FOWNER
允许进程执行通常只保留给文件所有者的内容,例如更改权限位和文件组。
仅在下方提到了覆盖目录中的粘性位CAP_FOWNER
,因此似乎CAP_DAC_OVERRIDE
不足以忽略它。(这将为您提供写许可权,但通常在粘性目录中您仍然具有写许可权并对其进行+t
限制。)
(我认为特殊设备在这里算作“文件”。至少generic_permission()
仅对目录进行类型检查,但我没有对此进行检查。)
当然,在某些情况下,甚至功能也无法帮助您修改文件:
/proc
和/sys
,因为他们没有真正实际的文件chattr
不可变+i
并且仅+a
在ext2 / ext3 / ext4上附加标志,这两个标志甚至都停止root用户,并防止文件重命名等。root_squash
在NFS中将root映射为nobodyroot
都具有rw-
权限,并且要获得该x
权限,则x
必须在该文件的用户/组/其他权限上设置该位。但是目录如何,对任何目录都root
具有rwx
权限(即使目录根本没有权限(----------
))?
CAP_DAC_OVERRIDE
允许覆盖所有目录权限,因此您可以读取,写入和访问目录(即列出目录,创建和取消链接文件)。我引用的有关exec位的注释是在文件上下文中(仅)。
执行模式与其他模式略有不同。
读写权限用于实施安全策略。该root
用户是一般的安全限制(也有一些例外,比如不可变的文件,而像功能现代特色使这个更细粒度),这就是为什么这个帐户中的另一个名字是“超级用户”的免疫。
执行权限更是一个咨询模式,区分文件是否打算为可执行文件或仅仅是数据。因此,即使root用户也遵守它-执行数据文件毫无意义。如果未设置任何执行权限,则root无法执行该文件;如果设置了任何一个,他可以。当然,由于root也有权更改任何文件的权限,因此该帐户可以根据需要使文件可执行(除非文件系统是只读的)。
顺便说一句,脚本是一个有趣的例子。脚本是相关解释器的数据文件。如果脚本中有#!
一行,则可以将其作为程序执行-在shebang中命名的解释器以脚本文件名作为参数运行。但这仅在设置了执行许可时才能完成。另一方面,您可以直接运行解释器,例如/bin/bash scriptname
。口译员只关心是否可以读取文件,不检查执行权限。
capabilities(7)
手册页中似乎没有反映源文件注释-考虑提交错误报告!