我试图更具体地了解 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
我以为这种情况不会出现,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。