root@macine:~# getcap ./some_bin
./some_bin =ep
“ep”是什么意思?这个二进制文件有哪些功能?
答案1
# getcap ./some_bin ./some_bin =ep
该二进制文件从一开始就具有所有允许的 ( p
) 和有效的 ( )功能。e
在能力的文本表示中,前导=
相当于all=
。从cap_to_text(3)
联机帮助页:
在主导运算符为
=
且未提供功能列表的情况下,假定操作列表指的是全部能力。例如,以下三个子句彼此等效(并且指示完全空的能力集)all=
:=
;cap_chown,<every-other-capability>=
。
这样的二进制文件可以做任何它想做的事情,仅受功能边界集的限制,在典型的桌面系统上,它包括所有内容(否则 setuid 二进制文件将su
无法按预期工作)。
请注意,这只是使用的文本表示的“陷阱” libcap
:在将打印的security.capability
文件的扩展属性中,所有有意义的位都是有效的getcap
/file/path =ep
在;为空的 security.capability
, /file/path =
(后面=
不跟任何内容)将被打印。
如果有人仍然不相信,这里有一个小实验:
# cp /bin/ping /tmp/ping # will wipe setuid bits and extented attributes
# su user -c '/tmp/ping localhost'
ping: socket: Operation not permitted
# setcap =ep /tmp/ping
# su user -c '/tmp/ping localhost' # will work because of cap_net_raw
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.073 ms
^C
# setcap = /tmp/ping
# su user -c '/tmp/ping localhost'
ping: socket: Operation not permitted
请注意,空的文件功能也不同于已删除能力 ( capset -r /file/path
),空的文件功能将阻止文件执行时继承 Ambient 集。
文件能力的一个微妙之处=ep
在于,如果边界集不是完整的,那么内核将阻止=ep
其上的程序执行(如《能力哑二进制文件的安全检查》部分所述)capabilities(7)
联机帮助页)。
答案2
这不是一种能力。
它意味着有效集和允许集。
这意味着这些能力将被放入允许集(p
)中,并且所有允许的能力将被复制到有效集(e
)中。
用于e
遗留程序(可能是当前的大多数程序),即不了解功能的程序,因此不能自行将功能从允许复制到有效。
至于为什么会有看起来像和空集(正如 @mosvy 指出的那样),该库的作者将 all 与 none 混淆了(无穷大和零是两个最容易混淆的数字)。