首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C++中的用户模式程序启动进程的Linux功能

从C++中的用户模式程序启动进程的Linux功能
EN

Stack Overflow用户
提问于 2021-08-25 00:12:38
回答 1查看 585关注 0票数 1

我试图从非根父进程启动一个子进程作为根进程。我正在考虑利用能力来实现这一目标。

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

对于是否正常检查,我已经更改了我的子进程的chmod权限,将其作为根chmod 4755加载。因此,它将只作为根而不是其他任何东西执行。

我看到,通过这些设置,我根本无法加载子进程。有人能帮我理解吗,我在这里是什么意思?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-25 14:35:06

试试这个(parent.cc):

代码语言:javascript
复制
#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):

代码语言:javascript
复制
#!/bin/bash
id -u

建立和设置事物:

代码语言:javascript
复制
$ chmod +x child.sh
$ g++ -o parent parent.cc -lcap
$ sudo setcap cap_setuid=p ./parent

如果您运行./parent,它应该是这样工作的:

代码语言:javascript
复制
$ ./parent 
0

这个例子是单线程的。如果您的应用程序是单线程,它应该是足够的。如果您的程序是多线程的,您可能需要探索类似于libpsx的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68915365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档