我试图了解 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
不过,我无法理解第 4 种情况。非特权文件启用了有效位。它没有能力(因为它没有特权),所以
- 非特权文件怎么可能启用有效位?
- 即使有效位不影响文件的特权状态,我们应该在没有允许或有效功能的情况下将其设置为启用吗?
所以,我的问题是,可能会出现什么具体情况导致第 4 种情况?
我认为不会出现这种情况,即如果没有允许或继承的能力,则无法设置有效位。
看到的行为
setcap
似乎证实了这一点:但是,正如您所发现的,即使没有存储任何功能,也可以设置有效位:
这些值表示结构
vfs_cap_data
,版本 2 (0x02000001)。在第一个 32 位值中设置的最后一位表示这些是有效的能力;但功能(继承和允许)都设置为 0。