39 Capabilities

简介

和进程凭证相似,Linux 的能力也有区分进程和文件的,它们都有许可集、有效集和继承集(内核 2.6.24 才实现了文件能力,老内核只有进程能力)。

进程能力集合:

  • 许可集(CapPrm): TODO
  • 有效集(CapEff): TODO
  • 继承集(CapInh, inheritable): TODO

可执行文件能力集合:

  • 许可集: TODO
  • 有效集: TODO
  • 继承集: TODO

此外,进程还有边界集 CapBnd 和 CapAmb(ambient),在 /proc/PID/status 中可以看到。CapAmb 约束了非特权程序调用 exec() 之后能继续保持的能力,在 Linux 4.3 引入,因此书上没有提及。

进程的能力集合实际上是线程的属性,而不是进程的。通过 cat /proc/PID/status | grep -i ^cap 中查看到的能力集是进程主线程的能力集,而通过 cat /proc/PID/task/TID/status | grep -i ^cap 看到的是具体线程的能力集。

例子:ping 命令缺少权限

ping 命令在安装后第一次使用时,可能会提示缺少权限,并提示:

ping: socktype: SOCK_RAW
ping: socket: Operation not permitted
ping: => missing cap_net_raw+p capability or setuid?

可以根据提示使用 setcap 命令给 ping 增加 cap_net_raw 到许可集中:

sudo setcap cap_net_raw+p /bin/ping

有些教程写的是使用 =pe 而不是 =p(这里 =+ 是一样的,因为初始状态下 ping 没有任何权限),是指同样开启有效集标志,这样进程在从可执行文件启动的时候就会将许可集拷贝到有效集,不需要进程自己去检查。但是 ping 是处理了 capabilities 的,所以不需要打开 e 位。

也可以给 ping 命令增加 set-user-ID 标志位,Debian 系统中 /usr/bin/ 下的可执行文件都是属于 root 的,但是刚安装的时候可能没有 set-user-ID 标志。