2

私はソケットフィルター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);
}

ただし、出力には常に「ルート」と表示されます。次に例を示します。

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

接続するアプリがTwitterである場合(PIDで確認)。Twitterは、rootではなく通常のユーザー権限で実行されます。

ソケット接続の背後にあるプロセスにroot権限があるかどうかを判断するためのより良い/正しい方法はありますか?

4

1 に答える 1

2

bsd/sys/proc.hリンク)によると:

/* 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;
}
于 2012-11-15T14:14:34.773 に答える