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

时间:2015-04-04 04:19:57

标签: linux-kernel system-calls

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

long getpeuid(pid_t pid, uid_t *uid)

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

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

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

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

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

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

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

    提前致谢!

    修改

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

    修改

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

1 个答案:

答案 0 :(得分:1)

(我是Linux内核开发的新手,请在必要时更正此答案!)

是的,copy_to_user进行所有必需的检查,以查看是否允许进程写入引用的内存空间。这是经常使用copy_to_user的一个主要原因。

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

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

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