if (capget(cap_header, cap_data) < 0) {
perror("Failed capget");
exit(1);
}
printf("child Cap data permitted: 0x%x, effective: 0x%x, inheritable:0x%x\n", cap_data->permitted, cap_data->effective,cap_data->inheritable);
}
int main(void)
{
list_capability();
sleep(1000);
}
执行结果分析
linuxidc@linuxidc:~/code/capability$ gcc child.c -o child
linuxidc@linuxidc:~/code/capability$ gcc father.c -o father -lcap
linuxidc@linuxidc:~/code/capability$ sudo setcap cap_dac_override,cap_sys_time+ei child
linuxidc@linuxidc:~/code/capability$ sudo setcap cap_dac_override,cap_sys_time+ip father
/* 单独执行,child文件有E(effective)I(inheritable)的能力,执行child的终端没有任何能力, 套用公式(cap_bset默认全1)
* P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset) // P'(permitted) = (0x0 & 0x2000002) | (0x0 & 全1),结果为0
* P'(effective) = F(effective) ? P'(permitted) : 0 // P'(effective) = 1 ? P'(permitted) : 0, 结果为P'(permitted),即0
* P'(inheritable) = P(inheritable) // P'(inheritable) = 0
* 执行结果如下所示
*/
linuxidc@linuxidc:~/code/capability$ ./child
child Cap data permitted: 0x0, effective: 0x0, inheritable 0x0
/* 单独执行,child文件有E(effective)I(inheritable)的能力,执行child的father文件有E(inheritable)和P(permitted)能力, 套用公式
* P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset) // P'(permitted) = (0x2000002 & 0x2000002) | (0x2000002 & 全1),结果为0
* P'(effective) = F(effective) ? P'(permitted) : 0 // P'(effective) = 1 ? P'(permitted) : 0, 结果为P'(permitted),即0x2000002
* P'(inheritable) = P(inheritable) // P'(inheritable) = 0x2000002
* 执行结果如下所示
*/
linuxidc@linuxidc:~/code/capability$ ./father
father Cap data permitted: 0x2000002, effective: 0x0, inheritable: 0x2000002
child Cap data permitted: 0x2000002, effective: 0x2000002, inheritable 0x2000002
上述单独运行child可执行程序,其进程没有任何能力。但是有father进程来启动运行child可执行程序,其进程则有相应的能力。
上例中father和child的能力都设置的cap_dac_override和cap_sys_time两个能力。其实两个可执行程序设置的能力可以不同,各位读者可以自己修改其能力,套用公式进行计算。
4、以root用户身份执行程序
1、以root用户身份执行程序,则该进程所有能力的的P和I都置为1
2、以root用户身份执行程序,则该进程的E使能
/*由于执行child的终端进程没有I能力,所有child进程的inheritable也为0, 其他能力为全1*/
linuxidc@linuxidc:~/code/capability$ sudo ./child
child Cap data permitted: 0xffffffff, effective: 0xffffffff, inheritable 0x0
5、进程用户ID的变化对能力的影响
1、当一个进程的有效用户ID从0变化到非0, 那么所有的E能力清零
2、当一个进程的有效用户ID从非0变化到0,那么现有的P集合拷贝到E集合
3、如果一个进行原来的真实用户ID,有效用户ID,保存设置用户ID是0,由于某些操作这些ID都变成了非0,那么所有的的P和E能力全部清理