在seteuid(0)之后调用popen失败

时间:2012-02-15 20:27:47

标签: c linux security setuid

我的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,因此不会维护权限并且用例失败。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

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

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