私はソケットフィルター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権限があるかどうかを判断するためのより良い/正しい方法はありますか?