有效或真实 uid 为 root 的进程在访问文件时是否仍受文件权限位的约束?

有效或真实 uid 为 root 的进程在访问文件时是否仍受文件权限位的约束?

来自 Didi Kohen 的回答 属于基于能力的安全吗sudosu

在 Unix 和 Linux 中,有两个级别的权限:标准用户和超级用户(通常称为 root)。

标准用户只能访问他有权通过所有权、组成员身份或权限访问的文件前交叉韧带

超级用户拥有一切权限(对于这个答案,我们将忽略 SELinux 之类的东西),没有限制在用户空间内。

当一个进程的有效或真实 uid 是 root 并尝试访问文件时,它是否仍然受文件的权限位约束?或者,就像引用所说的(如果我理解正确的话),拥有 euid root 将覆盖文件的权限位?

例如,

  • 当文件的所有者不是root且其组与进程的有效组或补充组不匹配时,文件的“其他”权限位是否适用于该进程?如果文件不允许其他人读写或执行,进程还能读写或执行吗?

  • 当文件的所有者是root,并且“用户”的文件权限位不允许读、写或执行时,进程是否还能读、写或执行该文件?

是否有可能使有效或真实 uid 为 root 的进程无法访问文件?例如,通过更改文件的权限位?

答案1

在传统的 Unix 中,root可以做任何事情。

然而,在现代 Linux(也许是其他 Unix)上,它现在具有了功能。这里讨论的功能是CAP_DAC_OVERRIDE,任何具有此功能的进程都将忽略文件权限(除了x,请参阅其他答案)。

大多数系统将设置为向后兼容模式,以便当进程更改其有效的用户ID为root,将获得所有能力,并且当有效的用户 ID 从 root 更改后会丢失功能。

有一些方法可以避免丢弃功能,这可以用于将某些功能传递给非根进程。还有一种无需成为 root 即可获得功能的方法,其工作原理与进程成为 root 的方式类似。

重要的是有效用户 ID,真实的和已保存的用户 ID 仅允许您将这些 ID 复制到其他 ID 之一(例如复制到有效用户 ID)。

SE_linux 和命名空间/cgroups,可以限制 root 可以执行的操作。

答案2

无论权限位如何,root 都可以访问所有内容。一个例外是,如果未设置任何执行位且 SELinux 设置限制,根进程将不会尝试执行文件。

然而,root 仍然能够设置所需的执行位并更改 SELinux 规则,因此您无法阻止 root 访问您的文件。

编辑

来自“人路径解析”

在传统的UNIX系统上,超级用户(root,用户ID 0)拥有一切权力,访问文件时可以绕过所有权限限制。

答案3

当一个进程有一个有效的或真实的uid 是 root 并尝试访问文件...

对于文件系统访问来说,只有有效的 UID 才重要,而不是真正的 UID。持有特权 UID 的进程可以打乱真实有效的 UID,以暂时放弃特权。

# perl -MEnglish -e '$EUID = 65534; system "id"; system "cat /etc/shadow"'
uid=0(root) gid=0(root) euid=65534(nobody) groups=0(root)
cat: /etc/shadow: Permission denied

但除此之外,你是对的,无论权限位如何,获得特权都可以访问文件。 (除此之外,除非设置了至少一个x位,否则执行文件不起作用,但这实际上只是一种方便。如果您有特权,通常可以将文件复制并运行它,或者更改首先是权限。)

请参阅 Linux 的最后部分手册页path_resolution(7)(“绕过权限检查:超级用户和功能”)或POSIX 中的文本(“4.5 文件访问权限”)。

就像后者的提示和前者的简单说明一样,对特权的实际检查可能不仅仅是 UID。在Linux上,它实际上是CAP_DAC_OVERRIDE能力(或CAP_DAC_READ_SEARCH在较小程度上)。我不知道其他系统的细节。

答案4

对于特权用户,仅x评估该位。

这意味着为了允许超级用户执行文件,x必须至少设置一位。

超级用户的所有其他权限都将被忽略。

相关内容