我正在编写一个套接字过滤器 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 权限?