【问题标题】:How to determine if process has root privileges in a network kernel extension?如何确定进程是否在网络内核扩展中具有 root 权限?
【发布时间】:2012-11-04 03:14:19
【问题描述】:

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

【问题讨论】:

    标签: macos kernel-extension xnu


    【解决方案1】:

    根据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;
    }
    

    【讨论】:

    • 谢谢。不知道我怎么看错了。我也可以发誓,当我安装了 Snow Leopard 时,代码可以恢复。
    • proc_xxx() 函数不一致,例如proc_exiting() 返回布尔值 (1/0)。
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 2018-01-14
    • 2020-05-02
    • 2011-09-15
    • 2016-06-11
    • 2011-12-24
    • 2018-02-18
    • 2019-02-12
    相关资源
    最近更新 更多