2017-07-17 88 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); 
}