Linux 以 root 身份从 C++ 用户模式程序启动进程的能力

Linux capabilities to launch process as root from a user mode program in C++

我正在尝试以 root 身份从非 root 父进程启动子进程。我正在考虑使用功能来完成这项工作。

到目前为止我已经尝试过的是,已将父进程的文件上限 permitted 设置为 cap_setgid,cap_setuid,capkill+p。然后在同一个父进程上,在从父进程调用 fork+exec 之前,我以编程方式将相同的功能设置为进程的有效功能。

为了完整性检查,我已经将我的子进程的 chmod 权限更改为仅以 root 身份加载 chmod 4755。因此,它只会以 root 用户身份执行。

我发现通过这些设置,我根本无法加载子进程。任何人都可以帮助我理解,我在这里错过了什么?

试试这个 (parent.cc):

#include <iostream>
#include <sys/capability.h>
#include <unistd.h>

int main() {
    cap_t caps = cap_get_proc();
    cap_value_t val = CAP_SETUID;
    cap_set_flag(caps, CAP_EFFECTIVE, 1, &val, CAP_SET);
    if (cap_set_proc(caps)) {
        perror("failed to raise cap_setuid");
        exit(1);
    }
    if (setuid(0)) {
        perror("unable to setuid");
        exit(1);
    }
    execl("./child.sh", "child.sh", NULL);
    std::cout << "didn't work, uid=" << getuid();
    exit(1);
}

有了这个 (child.sh):

#!/bin/bash
id -u

构建并设置:

$ chmod +x child.sh
$ g++ -o parent parent.cc -lcap
$ sudo setcap cap_setuid=p ./parent

如果你 运行 ./parent 它应该像这样工作:

$ ./parent 
0

这个例子是单线程的。如果您的应用程序是单线程的,那应该就足够了。如果您的程序是多线程的,您可能需要探索类似 libpsx.

的内容