2012-02-15 96 views
0

我的C代码做了POPEN失败个seteuid(0)

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

后,当调用,它失败,即使我有个seteuid拨打电话(0)。 (可执行文件有setuid)。

看来seteuid和popen不能一起工作。

当POPEN称它在标准错误打印以下味精

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

换句话说popen方法“成功”,但由于新的外壳创建权限不维护和使用的情况下失败。

我该如何解决问题?

+1

什么是错误?它如何失败? – 2012-02-15 20:29:24

+0

@BasileStarynkevitch编辑了这个问题。 – cateof 2012-02-15 20:38:48

+1

你不检查seteuid的返回码,所以给** popen(“/ usr/bin /我是谁”,“r”); **你? – 2012-02-15 20:42:08

回答

0

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

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

你可以通过调用一个exec函数到一个不执行这些检查的shell,或者用C编写所有的代码(没有shell调用) - 这是安全检查的真正意图。

相关问题