2012-02-15 12 views
0

私のCコードはpopenのが失敗した(0)

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

を行い、それは私が(0)のseteuidを呼び出しても、失敗します。 (実行ファイルにはsetuidが設定されています)。

seteuidとpopenは一緒に動作しないようです。

popenのは、言い換えれば、それは標準エラー出力に出力し、次のMSG

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

と呼ばれる「成功」が、新しいシェルが作成されるため、権限が維持され、ユースケースが失敗していないはpopen。

どうすれば問題を解決できますか?

+1

エラーは何ですか?どのように失敗するのですか? –

+0

@BasileStarynkevitchが質問を編集しました。 – cateof

+1

seteuidの戻りコードはチェックしないので、** popen( "/ usr/bin/who am i"、 "r"); **あなたは? –

答えて

0

あなたはpopenを呼び出してsetuidスクリプトを呼び出しています。たとえば、Linuxの多くのディストリビューションでは、スクリプトがsetuidまたはseteuidで実行されないようにするためにシェルの呼び出しをチェックします。問題はpopenではなく、/ bin/shです。これは、デフォルトのシェルpopenの使用方法です。 Linuxでは/ bin/shは通常bashです。

私はそれがgetresuid()を呼び出し、保存されているuidをチェックすると考えています。これはrootでなければなりません。

これを回避するには、これらのチェックを実行しないシェルにexec関数を呼び出すか、すべてのコードをC(シェル呼び出しなし)で記述します。これはセキュリティチェックの真意です。

関連する問題