通过实现同样的事情libcap
实际上并没有那么多代码:
#include <stdio.h>
#include <sys/capability.h>
int main(int arc, char *argv[]) {
cap_t c = cap_from_text("cap_sys_rawio=ep");
int status = cap_set_file("./bench", c);
cap_free(c);
if (status)
perror("attempt failed");
return status != 0;
}
要编译它(在 debian 上,您需要sudo apt-get install libcap-dev
; 在 fedora 上,sudo dnf install libcap-devel
):
$ gcc -o mkcap mkcap.c -lcap
如果您只是按原样运行它,它将失败,因为程序需要具有足够的权限才能实际将功能添加到./bench
:
$ ./mkcap
attempt failed: Operation not permitted
因此,您需要使其本身具有足够的能力:
$ sudo /sbin/setcap cap_setfcap=ep ./mkcap
$ ./mkcap
$ echo $?
0
- 您可能需要考虑更明确地使用
"./bench"
二进制文件的路径,因为根据您的环境,您可能会担心有人会滥用mkcap
给cap_sys_rawio
其他程序。使用完整的路径名将不那么模棱两可。
- 您还
chmod go-x ./mkcap
可以限制谁可以运行它。
- 您还可以考虑对所有这些使用可继承的功能:
basic $ sudo setcap cap_setfcap=ei ./mkcap
basic $ ./mkcap
attempt failed: Operation not permitted
basic $ sudo capsh --inh=cap_setfcap --user=$(whoami) --
enhanced $ ./mkcap
enhanced $ echo $?
0
在enhanced
(capsh shell)层中,您可以在设置了文件可继承位的二进制文件上提高该功能。这样,默认basic
层 shell 无法从mkcap
. 在所有其他方面,enhanced
外壳层与层相同basic
。例如,您可以执行构建并且几乎可以正常做事。(exit
用于离开enhanced
外壳。)
有一个pam_cap
模块还可以在登录等时向特定用户的所有 shell 添加一个可继承位。