我们如何理解 exec() 的能力规则?

我们如何理解 exec() 的能力规则?

来自 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 bor 如果谓词为真,则计算结果为aelse 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)联机帮助页。

相关内容