我正在尝试在 Arch linux system 下编写自己的系统调用,以下是系统调用的格式:
long getpeuid(pid_t pid, uid_t *uid)
用于获取调用进程的父进程的euid。
我知道我必须先验证三件事:
检查指针是否指向用户空间。 可以通过access_ok()
完成。
检查指针是否指向调用进程的地址空间。
检查调用进程是否有权写入指针所指向的空间。
我发现系统调用copy_to_user()
可以将内核空间变量复制到用户空间,但我不确定系统调用是否先检查其他先决条件。
另外,我不知道如何才能获得调用进程的父进程euid。我知道getppid()
可以获取父进程ID,但我不知道如何继续进行。有人可以给我一些暗示吗?
提前致谢!
修改:
跟进问题,如果我想检查父进程的有效uid是否为root,我可以简单地看看euid是否等于0,是吗?
修改
另一个问题是,我们是否允许在系统调用中调用getppid()和其他系统调用?经过一些谷歌搜索,似乎每个人都试图避免这样做。
答案 0 :(得分:1)
(我是Linux内核开发的新手,请在必要时更正此答案!)
是的,copy_to_user
进行所有必需的检查,以查看是否允许进程写入引用的内存空间。这是经常使用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容器,那么它可以是 in 容器中的。