2017-09-05 333 views
2

我從平二進制刪除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

回答

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 

一旦插座是開放的,沒有更多的權限才能寫入。