capabilities(7) - Linux manual pagehttps://man7.org/linux/man-pages/man7/capabilities.7.html1.1 Capabilities
为了执行权限检查,传统的UNIX实现将进程分为两类:特权 进程(其有效用户ID为0,称为超级用户或root),以及非特权进程(其有效UID为非零)。
特权进程绕过所有内核权限检查,而无特权的进程则根据进程的凭据(通常是:有效的UID,有效的GID和补充组列表)接受完全的权限检查。
从内核2.2开始,Linux将传统上与超级用户相关联的特权划分为不同的capability, 可以独立地启用和禁用这些功能。功能是每个线程的属性。
1.2 全面实施功能需要: (在内核2.6.24之前,仅满足前两个要求;从内核2.6.24开始,所有这三个要求都得到满足)
对于所有特权操作,内核必须检查线程在其有效集中是否具有所需的功能。
内核必须提供系统调用,以允许更改和检索线程的功能集。
文件系统必须支持将功能附加到可执行文件,以便进程在执行文件时获得那些功能。
1.3 Transformation of capabilities during execve()
Note: 属性ambient仅在kernel 4.3后支持。
P'(ambient) = (file is privileged (uid of P)) ? 0 : P(ambient)
//如果用户是 root 用户(uid of P),那么执行 execve() 后线程的 Ambient 集合是空集;如果是普通
用户,那么执行 execve() 后线程的 Ambient 集合将会继承执行 execve() 前线程的 Ambient 集合。
P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & P(bounding))) | P'(ambient)
P'(effective) = F(effective) ? P'(permitted) : P'(ambient) euid ???
P'(inheritable) = P(inheritable) [i.e., unchanged]
P'(bounding) = P(bounding) [i.e., unchanged]
Note: 属性ambient仅在kernel 4.3后支持。
1.4 Capability list
0:CAP_CHOWN:修改文件属主的权限
1:CAP_DAC_OVERRIDE:忽略文件的DAC访问限制
2:CAP_DAC_READ_SEARCH:忽略文件读及目录搜索的DAC访问限制
比如:普通用户shadow文件也能read3:CAP_FOWNER:忽略文件属主ID必须和进程用户ID相匹配的限制
(以最后操作的UID,覆盖文件的先前的UID)
4:CAP_FSETID:允许设置文件的setuid位
起因是当文件被修改后,会清除掉文件的setuid/setgid位,而设定CAP_FSETID后将保证setuid/setgid位不被清除.但这对chown函数无用5:CAP_KILL:允许对不属于自己的进程发送信号
6:CAP_SETGID:允许改变进程的组ID
(设定程序允许普通用户使用setgid函数,这与文件的setgid权限位无关)7:CAP_SETUID:允许改变进程的用户ID
(设定程序允许普通用户使用setuid函数,这也文件的setuid权限位无关)8:CAP_SETPCAP:允许向其他进程转移能力以及删除其他进程的能力
(允许向其它进程转移能力以及删除其它进程的任意能力)
事实上只有init进程可以设定其它进程的能力,而其它程序无权对进程授权,root用户也不能对其它进程的能力进行修改,只能对当前进程通过cap_set_proc等函数进行修改,而子进程也会继承这种能力.
所以即使使用了CAP_SETPCAP能力,也不会起到真正的作用.9:CAP_LINUX_IMMUTABLE:允许修改文件的IMMUTABLE和APPEND属性标志
注意,这里只能对自己的文件授权(immutable/append-only)权限,对于其它用户的权限LINUX_IMMUTABLE不起作用(root除外),如下:10:CAP_NET_BIND_SERVICE:允许绑定到小于1024的端口
11: CAP_NET_BROADCAST:允许网络广播和多播访问
事实上它并没有被应用,普通用户也可以使用ping -b 192.168.0.255也发送广播包
12: CAP_NET_ADMIN:允许执行网络管理任务:接口,防火墙和路由等
13: CAP_NET_RAW:允许使用原始套接字.socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) ping/tcpdump/iftop14:CAP_IPC_LOCK:允许锁定共享内存片段
15:CAP_IPC_OWNER:忽略IPC所有权检查16:CAP_SYS_MODULE:允许插入和删除内核模块
17:CAP_SYS_RAWIO:允许直接访问/devport,/dev/mem,/dev/kmem及原始块设备18:CAP_SYS_CHROOT:允许使用chroot()系统调用
19:CAP_SYS_PTRACE:允许跟踪任何进程 strace -p 1
CAP_SYS_PACCT:允许执行进程的BSD式审计21:CAP_SYS_ADMIN:允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等 mount swapon swapoff
22: CAP_SYS_BOOT:允许重新启动系统 (允许普通用使用reboot()函数)
这里我们无法用reboot命令来做测试,因为reboot命令做了判断,只允许root(UID=0)的用户可以使用.
23: CAP_SYS_NICE:允许提升优先级及设置其他进程的优先级
24: CAP_SYS_RESOURCE:忽略资源限制
普通用户不能用setrlimit()来突破ulimit的限制
25: CAP_SYS_TIME:允许改变系统时钟
26: CAP_SYS_TTY_CONFIG:允许配置TTY设备. 用vhangup()函数来挂起当前的tty
27: CAP_MKNOD:允许使用mknod()系统调用.普通用户不能用mknod()来创建设备文件
28: CAP_LEASE:允许修改文件锁的FL_LEASE标志
系统调用fcntl()可以用于租借锁,此时采用的函数原型如下
29: CAP_SETFCAP 31 (允许在指定的程序上授权能力给其它程序)



