如何验证指针是否指向进程地址table
How to verify if the pointer is pointing to the process address table
我正在尝试在Archlinux系统下编写自己的系统调用,以下是系统调用的格式:
long getpeuid(pid_t pid, uid_t *uid)
用于获取调用进程父进程的euid
我知道我必须首先验证三件事:
检查指针是否指向用户 space。 这可以通过 access_ok()
来完成。
检查指针是否指向调用进程的地址space。
检查调用进程是否有权写入指针指向的 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 *
成员:cred
和 real_cred
。 (我不确定你应该使用哪一个。)struct cred
有一个成员 euid
.
如果 euid
是 0,那么是的,父进程是 运行 作为 root。请注意,如果系统使用 LXC 容器,那么它可能是 root inside 容器。
我正在尝试在Archlinux系统下编写自己的系统调用,以下是系统调用的格式:
long getpeuid(pid_t pid, uid_t *uid)
用于获取调用进程父进程的euid
我知道我必须首先验证三件事:
检查指针是否指向用户 space。 这可以通过
access_ok()
来完成。检查指针是否指向调用进程的地址space。
检查调用进程是否有权写入指针指向的 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 *
成员:cred
和 real_cred
。 (我不确定你应该使用哪一个。)struct cred
有一个成员 euid
.
如果 euid
是 0,那么是的,父进程是 运行 作为 root。请注意,如果系统使用 LXC 容器,那么它可能是 root inside 容器。