Bonjour,
Je développe actuellement un programme en C et je rencontre un problème concernant l'envoi d'un signal d'un processus à un autre.
Un premier programme (appelé host) tourne en tant que démon sous l'utilisateur nobody.
A un moment il fait un fork() puis un execve() vers un autre programme (appelé run_interface) dont le setuid bit est activé. Le propriétaire de run_interface n'est pas root mais un utilisateur normal (appelons le user).
Au lancement de run_interface, la situation est donc la suivante concernant les uid du processus run_interface:
uid réel = uid de nobody
uid effectif = uid de user
uid sauvé = uid de user
j'utilise ensuite la fonction setresuid() pour obtenir la configuration suivante:
uid réel = uid de user
uid effectif = uid de user
uid sauvé = uid de nobody
Le problème est que lorsque host envoie un signal avec la fonction kill() l'appel échoue avec l'erreur EPERM.
Pourtant la page man de kill précise:
For a process to have permission to send a signal it must either be privileged (under Linux: have the CAP_KILL capability), or the real or effective user ID of the sending process must equal the real or saved set-user-ID of the target process
Et je suis bien dans le cas ou l'uid réel du processus appellent est égal à l'uid sauvé du processus cible.
Je précise que si je laisse la configuration initiale (avant le setresuid()) l'envoi du signal fonctionne sans problème.
Est-ce que quelqu'un a déjà rencontré un problème similaire?
Merci
Distribution: Red Hat Entreprise Linux 5
Partager