【问题标题】:Why is CapEff all zeros in /proc/$PID/status为什么 CapEff 在 /proc/$PID/status 中全为零
【发布时间】:2018-02-13 23:57:42
【问题描述】:

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

【问题讨论】:

  • 好问题,好答案。干得好!

标签: linux ping linux-capabilities


【解决方案1】:

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

一旦套接字打开,就不再需要写入权限了。

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 2012-12-20
    • 1970-01-01
    • 2015-12-15
    • 2016-12-17
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多