为什么CapEff在/ proc / $ PID / status中全为零

时间:2017-09-05 16:01:02

标签: linux ping linux-capabilities

我从ping二进制文件中删除了setuid位,并添加了cap_net_raw+p,如下所示:

$ chmod 755 /bin/ping
$ setcap cap_net_raw+p /bin/ping

然后我在一个终端中运行ping并检查正在运行的进程的/ proc / $ PID / status:

$ ps aux | grep ping                                                                   
  user     5468  0.0  0.0  14948  1792 pts/20   S+   11:14   0:00 ping www.google.com
  user     5471  0.0  0.0  14224   896 pts/2    S+   11:14   0:00 grep --color=auto ping
$ cat /proc/5468/status | grep Cap
  CapInh: 0000000000000000
  CapPrm: 0000000000002000
  CapEff: 0000000000000000
  CapBnd: 0000003fffffffff
  CapAmb: 0000000000000000

如果当前正在运行ping,为什么CapEff: 0000000000000000?那个cap_net_raw也不应该在有效集合中吗? / proc / $ PID / status是否不反映线程的当前状态?

1 个答案:

答案 0 :(得分:2)

OFTC(irc)#kernelnewbies的一位乐于助人的人非常友好地向我提供了答案。

ping在有效集中设置cap_net_raw,创建套接字,然后删除cap_net_raw,如strace所见:

$ strace -e socket,capset ping -c1 localhost
  capset({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_NET_RAW, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
  socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
  capset({_LINUX_CAPABILITY_VERSION_3, 0}, {0, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0

套接字打开后,无需再写入特权即可。