我的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,因此不会维护权限并且用例失败。
我该如何解决这个问题?
答案 0 :(得分:0)
您正在通过调用popen来调用setuid脚本。例如,许多Linux的分布都会检查shell调用,以防止脚本开始运行setuid或seteuid。问题不是popen,是/ bin / sh,这是popen使用的默认shell。在Linux / bin / sh中通常是bash。
我相信它会调用getresuid()并检查已保存的uid,它必须是root。
您可以通过向不执行这些检查的shell调用exec函数,或者在C中编写所有代码(无shell调用)来解决此问题 - 这是安全检查的真正意图。