非特权文件如何具有启用的有效位? (POSIX 功能)

非特权文件如何具有启用的有效位? (POSIX 功能)

我试图更具体地了解 POSIX 功能原则,以及它们在 execve() 期间的转换。我会引用一些来自文档在我提问时:

       P'(ambient)     = (file is privileged) ? 0 : P(ambient)

       P'(permitted)   = (P(inheritable) & F(inheritable)) |
                         (F(permitted) & P(bounding)) | P'(ambient)

       P'(effective)   = F(effective) ? P'(permitted) : P'(ambient)

       P'(inheritable) = P(inheritable)    [i.e., unchanged]

       P'(bounding)    = P(bounding)       [i.e., unchanged]

   where:

       P()   denotes the value of a thread capability set before the
             execve(2)

       P'()  denotes the value of a thread capability set after the
             execve(2)

       F()   denotes a file capability set

据此,我们首先检查可执行文件是否具有特权。特权文件被定义为具有功能或启用了 set-user-ID 或 set-group-ID 位的文件。

When determining the transformation of the ambient set during execve(2), 
a privileged file is one that has capabilities or 
has the set-user-ID or set-group-ID bit set.

然后我们检查文件的有效位是否启用。所以现在我们根据两次检查有 4 种情况:

  • 特权文件已启用有效位 -> 文件具有必须考虑的功能 -> 计算新功能
  • 非特权文件已禁用有效位 -> 文件没有功能 -> 使用线程的环境集
  • 特权文件已禁用有效位 -> 文件可能已启用 setuid/setguid 位。我认为,这意味着,根本不应该使用功能,不要混合使用两种不同的权限工具 -> 线程的有效集变为 0

但我无法理解第四种情况。非特权文件启用了有效位。它没有任何功能(因为它没有特权),所以

  1. 非特权文件怎么可能启用有效位?
  2. 即使有效位不影响文件的权限状态,我们为什么要在没有允许或有效能力的情况下将其设置为启用呢?

那么,我的问题是,什么具体情况可能会导致第四种情况?

答案1

我以为这种情况不会出现,IE如果没有允许或继承的能力,则无法设置有效位。

看到的行为setcap似乎证实了这一点:

$ sudo setcap cap_chown=ep mybinary
$ getcap mybinary
mybinary = cap_chown+ep
$ sudo setcap cap_chown=e mybinary
$ getcap mybinary
mybinary =

然而,正如您发现的那样,它即使没有存储任何功能,也可以设置有效位:

$ xattr -l mybinary
0000   01 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00    ................
0010   00 00 00 00                                        ....

这些值代表一个vfs_cap_data结构,版本 2 (0x02000001)。第一个 32 位值中的最后一位设置表示这些是有效功能;但能力(继承的和允许的)都设置为0。

相关内容