0

我的 C 代码做了一个

 seteuid (euid);
 popen("/root/bin/iptables ....", "r");

即使我用 seteuid(0) 调用它也会失败。(可执行文件已打开 setuid)。

似乎 seteuid 和 popen 不能一起工作。

当 popen 调用它时,它会在 stderr 中打印以下消息

iptables v1.4.6: can't initialize iptables table : Permission denied (you must be root)

换句话说,popen“成功”,但是因为创建了一个新的shell,所以没有维护权限并且用例失败了。

我该如何解决这个问题?

4

1 回答 1

0

您正在通过调用 popen 来调用 setuid 脚本。例如,Linux 的许多发行版都在 shell 调用中进行检查,以防止脚本开始运行 setuid 或 seteuid。问题不是popen,是/bin/sh,这是popen 使用的默认shell。在 Linux /bin/sh 通常是 bash。

我相信它会调用 getresuid() 并检查保存的 uid,它必须是 root。

您可以通过向不执行这些检查的 shell 调用 exec 函数来解决此问题,或者在 C 中编写所有代码(无 shell 调用)——这是安全检查的真正意图。

于 2012-02-15T21:18:10.623 回答