如何验证指针是否指向进程地址table

How to verify if the pointer is pointing to the process address table

我正在尝试在Archlinux系统下编写自己的系统调用,以下是系统调用的格式:

long getpeuid(pid_t pid, uid_t *uid)

用于获取调用进程父进程的euid

我知道我必须首先验证三件事:

  1. 检查指针是否指向用户 space。 这可以通过 access_ok() 来完成。

  2. 检查指针是否指向调用进程的地址space。

  3. 检查调用进程是否有权写入指针指向的 space。

我发现系统调用copy_to_user()可以将内核space变量复制给用户space,但我不确定系统调用是否先检查其他先决条件.

此外,我不确定如何获取调用进程的父进程euid。我知道 getppid() 可以获得父进程 ID,但我不确定如何进行。有人可以给我一些提示吗?

提前致谢!

编辑:

追问,如果我想查看父进程的有效uid是否为root,我可以简单地看euid是否等于0,对吗?

编辑:

另一个问题,我们是否允许在系统调用中调用 getppid() 和其他系统调用?经过一番谷歌搜索,似乎每个人都在努力避免这样做。

(我是 Linux 内核开发的新手,请根据需要更正此答案!)

是的,copy_to_user 进行所有必要的检查以查看是否允许进程写入引用的内存 space。这就是 copy_to_user 被如此频繁使用的主要原因。

获得父进程的 PID 后,您将需要获取对其任务描述符的引用。我相信你可以通过调用 find_task_by_vpid(pid_number).

来获得它

现在您有一个指向父进程的指针'task_struct。它有 2 个 struct cred * 成员:credreal_cred。 (我不确定你应该使用哪一个。)struct cred 有一个成员 euid.

如果 euid 是 0,那么是的,父进程是 运行 作为 root。请注意,如果系统使用 LXC 容器,那么它可能是 root inside 容器。