2017-07-17 71 views
2

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

我已搜查四处寻找答案,发现一些有用的链接,但它并不能帮助:

如何正确地做到这一点?

+2

请加一个非常小的MCVE,让人们可以玩它 –

+0

你的意思是孩子在setuid电话后不再收到信号吗? – mbieren

回答

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); 
}