来自 Linux 编程接口:
允许集是可添加到有效且可继承集的功能的限制超集。
这是否意味着进程的允许集是进程的有效集和可继承集的超集?
内核使用以下规则计算进程的新能力:
P'(允许) = (P(可继承) & F(可继承)) | (F(允许) & cap_bset)
P'(有效)= F(有效)? P'(允许):0
P'(可继承) = P(可继承)
上述规则中,P表示在之前的能力集值
exec()
,P'表示在之后的能力集值exec()
,F表示文件能力集。标识符cap_bset表示能力边界集的值。
规则如何保证 P'(允许)是 P'(可继承)的超集?换句话说,P'(允许)能否成为P(可继承)的超集?
“F(有效)?P'(允许):0”是什么意思?
是P(xxx)
andF(xxx)
集合还是位集合?如果是后者,对它们的操作是位操作吗?如果是前者,它们的运算是集合运算(并集和交集)吗?
答案1
“F(有效)?P'(允许):0”是什么意思?
这个表达方式predicate ? a : b
,来自C
相似的语言。这意味着
a if predicate else b
or 如果谓词为真,则计算结果为a
else b
。
因此,P'(effective) = F(effective) ? P'(permitted) : 0
意味着如果设置了文件有效位,则将允许的集复制到进程有效集中,否则将有效集保留为空。
对于不了解功能(可能是目前大多数)的遗留应用程序来说,这是必需的。功能感知应用程序将从没有有效功能的情况下开始,并在需要时将功能复制到有效集,并在完成后清除有效集(减少错误可能造成的危害)。
允许集是可添加到有效且可继承集的功能的限制超集。
您只能将功能添加到有效或继承集中(如果它们在允许范围内)。但是,要将功能添加到继承集中,它也必须位于边界集中。 — 这一段正在评论中讨论(可能会改变)。
P(xxx) 和 F(xxx) 是集合还是位集合?如果是后者,对它们的操作是位操作吗?如果是前者,它们的运算是集合运算(并集和交集)吗?
大多数是位组,但是F(effective)
单个位。
您还问:
规则如何保证 P'(允许)是 P'(可继承)的超集?换句话说,P'(允许)能否成为P(可继承)的超集?
事实并非如此,你的陈述是漏读。
[允许] 也是可能的功能的限制超集添加到可继承集。
因此,进程可以继承其继承集的能力,但这些能力不在允许的集中。但可能不会向继承集中添加功能,除非该功能已位于允许的集中。
答案2
允许集是可添加到有效且可继承集的功能的限制超集。
这是否意味着进程的允许集是进程的有效集和可继承集的超集?
不,该声明虽然简洁,但没有提出这样的主张(可以添加的事物的超集!=已经存在的事物的超集)。可继承集不必从空开始。
我系统上的功能(7)联机帮助页对此进行了更好的解释:
Permitted:
This is a limiting superset for the effective capabilities that
the thread may assume. It is also a limiting superset for the
capabilities that may be added to the inheritable set by a
thread that does not have the CAP_SETPCAP capability in its
effective set.
规则如何保证 P'(允许)是 P'(可继承)的超集?换句话说,P'(允许)能否成为P(可继承)的超集?
它不保证这样的事情。例如,当线程执行文件扩展属性中没有“security.capability”的程序(即具有空的F(可继承)时,P'(允许)将成为空集(即不是P(可继承)的超集)和F(允许))。
“P'(有效)= F(有效)?P'(允许):0”是什么意思?
如果F(有效)不为空,则将P'(有效)设置为P'(允许),即让所有允许的能力从一开始就有效。由于只有 F(有效)的空/非空状态很重要,因此它是通过文件的“security.capability”扩展属性中的一个位/标志来实现的。
P(xxx) 和 F(xxx) 是集合还是位集合?
它们是位组。
注意:那东西有点过时了;现在还有一个周围的计算有效集时考虑的能力集。检查任何较新系统上的功能(7)联机帮助页。