7

task_struct *呼び出すことで得たものがありfind_task_by_vpid(get_pid())ます。作成しているシステムコールで権限チェックを実行できるように、そのプロセスを所有しているユーザーを把握したいのですが、task_structソースコードを調べてもあまり役に立ちませんでした。役に立ったと思われるのは、だけですが、loginuid次のようにアクセスしようとすると、何らかの理由でカーネルがコンパイルされませんmy_task_struct->loginuid。プロセスを呼び出したユーザーをから取得する別の方法はありtask_structますか?

4

2 に答える 2

7

残念ながら、ユーザー/グループIDはタスク構造体に保存されなくなりましたが、代わりに、同じIDを持つすべてのタスク間で動的に割り当てられ共有される個別の特権構造に保存されます。setuidこれにより、リソースの枯渇が原因で失敗する可能性のある状況が発生し、setuid特権の付与に失敗すると、悪名高い脆弱性の原因になります...

とにかく、それはこれらのメンバーにありますtask_struct

    const struct cred __rcu *real_cred; /* objective and real subjective task
                                     * credentials (COW) */
    const struct cred __rcu *cred;  /* effective (overridable) subjective task
                                     * credentials (COW) */
于 2012-10-27T23:22:36.183 に答える
0

カーネル空間内のユーザーID(UID)にアクセスするには、次のように実行できます(Linux 4.9.13以降)。

struct task_struct *task;
for_each_process(task) {
    uid_t uid = __kuid_val(task_uid(task));
}

task_uidと呼ばれる構造体を返し、kuid_t実際の値にアクセスするには、呼び出す__kuid_valか、直接アクセスする必要があります(task_uid(task).val)。

または、を使用することもできますfrom_kuid(&init_user_ns, task_uid(task))

于 2017-08-21T13:41:22.273 に答える