2017-07-17 4 views
2

J'écris une application C qui appelle fork() pour créer des processus fils. L'application s'exécute en tant que root. Dans le processus parent, j'utilise wait() pour attendre les processus fils terminés. Dans les processus enfants, j'utilise prctl() avec l'option PR_SET_PDEATHSIG pour détecter la mort du parent. Ça fonctionne bien. Pour réduire le risque de problèmes de sécurité, les processus enfants appellent setuid() pour modifier l'UID. Le problème est: les processus enfants ne peuvent plus détecter la mort du parent.Détection de la mort du processus parent à partir du processus `setuid`

J'ai cherché pour trouver la réponse et a trouvé quelques liens utiles, mais il ne permet pas:

Comment faire cela correctement?

+2

S'il vous plaît ajouter un MCVE très minime pour que les gens puissent jouer avec lui –

+0

voulez-vous dire que les enfants ne reçoivent plus le signal après l'appel setuid? – mbieren

Répondre

0

Je viens de tombé sur la même question, le noyau remet à zéro le signal PDEATH sur le changement des titres de compétences:

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

Cela peut être vérifié avec le code suivant et 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); 
}