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?

Était-ce utile?

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é

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top