在 /dev 文件上设置 root-only 权限并构建二进制文件

Bee*_*ope 4 linux bash x86 setuid msr

作为构建过程的一部分,我想运行以下两个命令:

sudo chmod a+r /dev/cpu/*/msr
sudo setcap cap_sys_rawio=ep ./bench
Run Code Online (Sandbox Code Playgroud)

这会将内核模块/dev/cpu/*/msr公开的文件设置msr为世界可读,并设置./bench实际读取这些文件所需的二进制文件(作为构建的一部分生成)的额外权限。

问题是这需要 root 权限,因此sudo.

我想要一个类似于 setuid root 脚本的东西来完成这两个特定的事情,但是在现代 Linux 上不推荐和禁用setuid root 脚本

对于一个简单的解决方案,我有哪些选择?

仅适用于第二行 (the setcap)的解决方案也很有趣,因为我需要这个来运行每个构建,而chmod每次启动只需要运行一次。

Tin*_*rer 5

通过实现同样的事情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;
}
Run Code Online (Sandbox Code Playgroud)

要编译它(在 debian 上,你需要sudo apt-get install libcap-dev; 在 fedora 上sudo dnf install libcap-devel):

$ gcc -o mkcap mkcap.c -lcap
Run Code Online (Sandbox Code Playgroud)

如果您按原样运行它,它将失败,因为该程序需要具有足够的权限才能实际将功能添加到./bench

$ ./mkcap
attempt failed: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

所以,你需要让它本身有足够的能力:

$ sudo /sbin/setcap cap_setfcap=ep ./mkcap
$ ./mkcap
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
  • 您可能需要考虑更明确地使用"./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
Run Code Online (Sandbox Code Playgroud)

enhanced(capsh shell) 层中,您可以在设置了文件可继承位的二进制文件上提高该功能。这样,默认basic层 shell 无法从mkcap. 在所有其他方面,enhanced壳层与层相同basic。例如,您可以执行构建,并且几乎可以照常执行。(exit用于离开enhanced外壳。)

有一个pam_cap模块还可以在登录等时向特定用户的所有 shell 添加一个可继承的位。