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.
的内容
我正在尝试以 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.
的内容