popen échoue lorsqu'il est appelé après seteuid (0)
Question
Code Mon C fait un
seteuid (euid);
popen("/root/bin/iptables ....", "r");
et il échoue même si je l'appelle avec seteuid (0). (Les exécutables setuid est activé).
Il semble que seteuid et popen ne fonctionnent pas ensemble.
Quand popen appelé il imprime dans stderr les éléments suivants msg
iptables v1.4.6: can't initialize iptables table : Permission denied (you must be root)
En d'autres termes popen « réussit », mais parce qu'un nouveau shell est créé les autorisations ne sont pas entretenus et le cas d'utilisation échoue.
Comment puis-je résoudre le problème?
La solution
Votre invoquez un script setuid en appelant popen. De nombreux distibutions de Linux, par exemple, procéder à des contrôles dans l'invocation shell pour empêcher un script setuid ou commencent seteuid. Le problème ne Popen, est / bin / sh, qui est l'utilisation du shell par défaut popen. Sous Linux / bin / sh est normalement bash.
Je crois qu'il appelle getresuid () et vérifie l'uid sauvé, qui doit être root.
Vous pouvez contourner ce problème en appelant une fonction exec à un shell qui ne fonctionne pas ces contrôles, ou d'écrire tout votre code en C (pas d'appels shell) -. Qui est l'intention réelle du contrôle de la sécurité