Answers:
实际上,对文件和目录的特权访问取决于功能,而不仅取决于是否root存在。在实践中,root通常具有所有可能的功能,但是在某些情况下,所有/很多功能可能会被删除,或者某些功能会分配给其他用户(他们的过程)。
简而言之,您已经描述了访问控制检查如何处理特权进程。这是不同功能实际上如何影响它的方式:
这里CAP_DAC_OVERRIDE的主要功能是,具有它的进程可以“绕过文件读取,写入和执行权限检查”。这包括读取和写入任何文件,以及读取,写入和访问目录。
它实际上不适用于执行未标记为可执行文件的文件。()中的注释在generic_permissionfs/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)手册页中似乎没有反映源文件注释-考虑提交错误报告!