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

时间:2017-07-17 08:13:41

标签: c linux process fork setuid

我编写了调用fork()来创建子进程的C应用程序。应用程序以root身份运行。在父进程中,我使用wait()来等待已终止的子进程。在子进程中,我使用带有prctl()选项的PR_SET_PDEATHSIG来检测父进程的死亡。它工作正常。为了降低安全问题的风险,子进程调用setuid()来更改UID。问题是:子进程无法再检测到父进程的死亡。

我已经四处寻找答案并找到了一些有用的链接,但它没有帮助:

如何正确地做到这一点?

1 个答案:

答案 0 :(得分:0)

我偶然发现了同样的问题,内核重置了凭证更改的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);
}