从 `setuid` 进程中检测父进程的死亡

3
我编写了一个C应用程序,调用fork()来创建子进程。该应用程序以root身份运行。在父进程中,我使用wait()等待终止的子进程。在子进程中,我使用prctl()PR_SET_PDEATHSIG选项来检测父进程的死亡。这很好用。为了减少安全问题的风险,子进程调用setuid()来更改UID。问题是:子进程无法再检测到父进程的死亡。 我搜索了一些有用的链接,但没有帮助: 如何正确地做到这一点?

2
请添加一个非常简洁的 MCVE,以便人们可以对其进行操作。 - Antti Haapala -- Слава Україні
你的意思是在 setuid 调用之后,子进程不再接收信号了吗? - mbieren
1个回答

1

我刚刚遇到了同样的问题,内核在凭证更改时重置PDEATH信号:

https://github.com/torvalds/linux/blob/master/kernel/cred.c#L450

这可以通过以下代码和strace -f进行验证:
#include <sys/prctl.h>
#include <unistd.h>
#include <signal.h>

int main(int argc, char *argv[])
{
        if (fork() == 0) {
                // This works as expected
                setgid(1000);                                                                                                                                                                                       
                setuid(1000);

                prctl(PR_SET_PDEATHSIG, SIGTERM);

                // This doesn't work since pdeath_signal will be reset
                // setgid(1000);
                // setuid(1000);

                pause();
        }
        sleep(1);
        kill(getpid(), SIGTERM);
        return (0);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接