# 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
该二进制文件从一开始就具有允许 (
p
) 和有效 (e
) 的所有功能。在能力的文本表示中,前导
=
等同于all=
. 从cap_to_text(3)
手册页:这样的二进制文件可以随心所欲,仅受能力边界集的限制,在典型的桌面系统上它包括所有内容(否则 setuid 二进制文件
su
将无法按预期工作)。请注意,这只是以下文本表示的“陷阱”
libcap
: 在将打印security.capability
的文件的扩展属性中,所有有意义的位都有效;对于空的, (后面没有任何东西)将被打印出来。getcap
/file/path =ep
security.capability
/file/path =
=
如果有人仍然不服气,这里有一个小实验:
请注意,空文件功能也与已删除功能 (
capset -r /file/path
) 不同,空文件功能将在文件执行时阻止 Ambient 集被继承。文件功能的一个微妙之处
=ep
在于,如果边界集不是完整的,那么内核将阻止其=ep
上的程序执行(如手册capabilities(7)
页的“安全检查功能哑二进制文件”部分所述)。这不是一种能力。
它意味着有效集和允许集。
这意味着能力将被放入允许集(
p
)中,并且所有允许的能力将被复制到有效集(e
)中。用于遗留程序(可能是当前
e
大多数程序),即不了解功能的程序,因此无法自行将功能从允许复制到有效。至于为什么会有看起来像和空集的东西(正如@mosvy 所指出的那样),图书馆的作者已经将所有与无混淆(无穷大和零是最容易混淆的两个数字)。