为什么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: 0000000000000000
? cap_net_raw
不应该在有效集合中吗?/proc/$ PID/status是否不能反映线程的当前的状态?
答
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
一旦插座是开放的,没有更多的权限才能写入。
好问题,很好的答案。做得好! – hek2mgl