为什么CapEff在/ proc全零/ $ PID /状态

问题描述:

我从平二进制删除setuid位,并添加cap_net_raw+p改为如下:

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

然后我在一个终端跑ping和检查/从另一个正在运行的进程的PROC/$ PID /状态:

$ 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: 0000000000000000cap_net_raw不应该在有效集合中吗?/proc/$ PID/status是否不能反映线程的当前的状态?

+1

好问题,很好的答案。做得好! – hek2mgl

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 

一旦插座是开放的,没有更多的权限才能写入。