2011-06-07 162 views
1

我有一個程序運行在C.這需要執行一個「iptables」命令使用系統。setuid(0)和系統失敗

我試圖

setuid(0); 
system("iptables .... "); 

setuid和系統互不共存。從系統手冊頁

不要從一個程序 使用system()與設置用戶ID或設置組ID 特權,因爲對於一些 環境變量奇怪值 可以用來顛覆系統完整性。 使用exec(3)系列函數 而不是 而不是execlp(3)或execvp(3)。實際上,系統()不會正確地從 set-user-ID或set- 的程序中正確地工作 ,因爲/ bash/sh是bash 版本2的系統上的group-ID特權,因爲bash 2將 權限啓動。 (Debian使用改進的慶典時作爲 sh的時候它並沒有這樣做。)

我怎麼能解決我的問題?

感謝

回答

1

像這樣的東西可能會有所幫助。這是未經測試,但應該工作。

char * const argv[] = {"/sbin/iptables", "-L", NULL}; 

    pid = fork(); 
    switch (pid) { 
      case -1: 
        /* handle error */ 
      case 0: 
        execv("/sbin/iptables", argv); 
        /* handle error if you get here */ 
      break; 
      default: 
        waitpid(pid, &status, 0); 
        /* check waitpid return code */ 
      break; 
    } 
+0

@downvoter我會感謝一些反饋,這將有助於我改進這個答案:-) – cnicutar 2014-05-10 19:15:09

3

system()將與setuid()一起使用,但這是問題:主要的安全風險。問題是system()使用任何環境啓動一個shell(bash,sh等),並且當你打算運行「iptables」時,我的PATH可以指向我自己的iptables版本,我可以輕鬆地以root身份說服你爲我跑步。你似乎可以通過使用iptables的完整路徑來解決這個問題,但是也可以使用其他環境變量(例如LD_PRELOAD_PATH)來說服工具加載流氓共享庫 - 再次,以root身份運行非本意的東西。

爲了您需要做的事,安全地,您必須必須使用其中一個exec()系列,並且您必須控制其操作環境。其他任何事情都要求安全濫用。 http://pubs.opengroup.org/onlinepubs/009695399/functions/environ.html似乎是瞭解更多信息的好地方。

相關問題