2012-11-15 53 views
2

我正在寫一個套接字過濾器kext,我想忽略作爲根作出的任何連接。 OS X Lion中之前,下面的代碼工作得十分完美:如何確定進程在網絡內核擴展中是否具有root權限?

static boolean_t is_root() { 
    proc_t p = proc_self(); 
    boolean_t isRoot = proc_suser(p); 
    proc_rele(p); 
    return isRoot; 
} 

但是現在有了獅子和山獅子,is_root()函數總是返回true。在雪豹中,它的工作原理與我想象的一樣。

以下是我測試插座過濾器事件處理程序內的函數的例子:

int debugPid = proc_selfpid(); 
if (is_root()) { 
    printf("%u (root)\n", debugPid); 
} else { 
    printf("%u (user)\n", debugPid); 
} 

但產量總是說「根」,例如:

2012-11-15 3:48:00.000 PM kernel[0]: 29879 (root) 

當應用程序製作該連接是Twitter(通過PID確認)。 Twitter以普通用戶權限運行,而不是root用戶。

是否有更好/正確的方式來確定套接字連接後面的進程是否具有root權限?

回答

2

根據所述bsd/sys/proc.hlink):

/* this routine returns error if the process is not one with super user privileges */ 
int proc_suser(proc_t p); 

所以的0一個返回裝置的方法具有根特權或非否則爲0。

你想:

static boolean_t is_root() { 
    proc_t p = proc_self(); 
    int error = proc_suser(p); 
    proc_rele(p); 
    return error == 0; 
} 
+0

謝謝。不知道我如何誤讀。當我安裝Snow Leopard時,我也可以發誓說代碼能夠正常工作。 – jjs

+1

'proc_xxx()'funcs不一致,例如'proc_exiting()'返回布爾值(1/0)。 – trojanfoe

相關問題