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 は「成功」しますが、新しいシェルが作成されるため、アクセス許可が維持されず、ユース ケースは失敗します。

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

4

1 に答える 1

0

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

getresuid()を呼び出して、保存されたuidをチェックすると思います。これはrootである必要があります。

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

于 2012-02-15T21:18:10.623 に答える