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

Tim*_*Tim 2 linux capabilities

来自 Linux 编程接口:

\n\n
\n

允许集是可以添加到有效和可继承集的功能的限制超集。

\n
\n\n

这是否意味着进程的允许集是进程的有效集和可继承集的超集?

\n\n
\n

内核使用以下规则计算进程的新能力:

\n\n

P\'(允许) = (P(可继承) & F(可继承)) | (F(允许) &\n cap_bset)

\n\n

P\'(有效)= F(有效)?P\'(允许):0

\n\n

P\'(可继承) = P(可继承)

\n\n

上述规则中,P表示 之前的能力集的值 exec(),P\xe2\x80\x99\n 表示 之后的能力集的值exec(),F表示文件能力集。标识符cap_bset表示能力边界集的值。

\n
\n\n

规则如何保证 P\'(允许)是 P\'(可继承)的超集?换句话说,P\'(允许)是否可以成为 P(可继承)的超集?

\n\n

“F(有效)?P\'(允许):0”是什么意思?

\n\n

P(xxx)andF(xxx) 集合还是位集合?如果是后者,对它们的操作是位操作吗?如果是前者,它们的运算是集合运算(并集和交集)吗?

\n

ctr*_*lor 5

\n

“F(有效)?P\'(允许):0”是什么意思?

\n
\n\n

这个表达方式predicate ? a : b,来自C相似的语言。这意味着\na if predicate else b或者如果谓词为真,则计算结果为 ,a否则计算结果为b

\n\n

因此P\'(effective) = F(effective) ? P\'(permitted) : 0,意味着如果设置了文件有效位,则将允许的集复制到进程有效集中,否则将有效集保留为空。

\n\n

对于不了解功能(可能是目前大多数)的遗留应用程序来说,这是必需的。功能感知应用程序将从没有有效功能的情况下开始,并在需要时将功能复制到有效集,并在完成后清除有效集(减少错误可能造成的危害)。

\n\n
\n

允许集是可添加到有效且可继承集的功能的限制超集。

\n
\n\n

您只能将功能添加到有效或继承集中(如果它们在允许范围内)。但是,要将功能添加到继承集中,它也必须位于边界集中。\xe2\x80\x94 这一段正在评论中讨论(可能会改变)。

\n\n
\n

P(xxx) 和 F(xxx) 是集合还是位集合?如果是后者,对它们的操作是位操作吗?如果是前者,它们的运算是集合运算(并集和交集)吗?

\n
\n\n

大多数是位组,但是F(effective)单个位。

\n\n

您还问:

\n\n
\n

规则如何保证 P\'(允许)是 P\'(可继承)的超集?换句话说,P\'(允许)是否可以成为 P(可继承)的超集?

\n
\n\n

事实并非如此,你的陈述是漏读。

\n\n
\n

[允许] 也是可添加到可继承集中的功能的限制超集。

\n
\n\n

因此,进程可以继承其继承集的能力,但这些能力不在允许的集中。但可能不会向继承集中添加功能,除非该功能已位于允许的集中。

\n