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



我正试图在Arch-linux系统下编写自己的系统调用,以下是系统调用的格式:

long getpeuid(pid_t pid, uid_t *uid)

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

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

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

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

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

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

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

提前感谢!

编辑

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

编辑:

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

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

是的,copy_to_user进行所有需要的检查,以查看是否允许进程写入引用的内存空间。这是CCD_ 5被如此频繁地使用的一个主要原因。

一旦有了父进程的PID,就需要获得对其任务描述符的引用。我相信你可以打电话给find_task_by_vpid(pid_number)

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

如果euid为0,那么是的,则表示父进程以root身份运行。请注意,如果系统使用LXC容器,那么它可能是容器内的根

最新更新