通过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 shell 层与basic 层相同。例如,您可以执行构建并且几乎可以正常做事。 (使用exit 离开enhanced shell。)
有一个pam_cap 模块还可以在登录等时向特定用户的所有shell 添加一个可继承位。