我想为我的文件的允许和继承集设置不同的功能。像这样的东西:
sudo setcap cap_fsetid=ei mybinary
sudo setcap cap_kill=ep mybinary
但是,后一个命令会覆盖前一个命令。甚至有可能以这种方式管理能力吗?
文档说功能是每个线程的属性。确实在任何
/proc/[PID]/task/[LWP]/status
我们可以找到与此线程相关的功能:
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
但与此同时,有关能力的类似信息位于
/proc/[PID]/status
所以进程,显然有它自己的能力。这让我感到困惑 - 是进程还是线程的功能属性?当执行一些需要能力的命令时,内核会检查什么集合?
我试图了解 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 种情况基于两个检查:
不过,我无法理解第 4 种情况。非特权文件启用了有效位。它没有能力(因为它没有特权),所以
所以,我的问题是,可能会出现什么具体情况导致第 4 种情况?