我试图从非根父进程启动一个子进程作为根进程。我正在考虑利用能力来实现这一目标。
到目前为止,我尝试的是,将父进程的文件上限permitted设置为cap_setgid,cap_setuid,capkill+p。然后,在同一个父进程上,在从父进程调用fork+exec之前,我正在编程地将相同的功能设置为进程的有效能力。
对于是否正常检查,我已经更改了我的子进程的chmod权限,将其作为根chmod 4755加载。因此,它将只作为根而不是其他任何东西执行。
我看到,通过这些设置,我根本无法加载子进程。有人能帮我理解吗,我在这里是什么意思?
发布于 2021-08-25 14:35:06
试试这个(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的内容。
https://stackoverflow.com/questions/68915365
复制相似问题