2012-02-15 91 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調用) - 這是安全檢查的真正意圖。

相關問題