如何确定进程是否在网络内核扩展中具有root权限?

时间:2012-11-15 13:53:20

标签: macos kernel-extension xnu

我正在编写套接字过滤器kext,我想忽略以root身份建立的任何连接。在OS X Lion之前,以下代码完美运行:

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

但现在使用Lion和Mountain Lion,is_root()函数始终返回true。在Snow Leopard中,它按照我想象的那样工作。

以下是我在套接字过滤器事件处理程序中测试函数的示例:

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

但输出总是说“root”,例如:

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

进行连接的应用程序是Twitter(通过PID确认)。 Twitter使用常规用户权限运行,而不是root。

是否有更好/正确的方法来确定套接字连接后面的进程是否具有root权限?

1 个答案:

答案 0 :(得分: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表示进程具有root权限,否则为非零。

你想:

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