gpt4 book ai didi

linux - 内核模块执行中的不同特权

转载 作者:IT王子 更新时间:2023-10-29 00:38:01 26 4
gpt4 key购买 nike

我在内核模块 (Linux 3.13) 中有两个位置:

  1. 一个是module_init
  2. 另一个是我挂接运行无效操作码的代码(通过破解中断描述表)。

我的代码是启用硬件性能计数器。当我将它放入 module_init 时,代码运行正常。但是当我把它放在第二位时(通过运行带有无效操作码的指令触发),代码得到一个permission denied错误(即错误号:-13)。

既然这两个地方都在同一个内核模块中,那么“即使在内核空间中,也有不同的权限吗?”

更新:值得一提的是,当我在用户空间以 root 身份运行无效操作码时,-13 错误号消失了;否则,它将保持...

我推测“指令执行的特权决定了它的中断处理程序的执行”。

最佳答案

因为 module_init 和你的钩子(Hook)代码运行在不同的进程中。并且不同进程之间有不同的权限。

一般情况下,代码必须运行在一个进程中。

module_init 总是运行在insmoding模块期间(见sys_init_module函数)。当你 insmod 一个内核模块时,你必须是 root。而且这个过程也是根。所以它运行良好。

但是当你把代码放在 IDT 中时,它可能会运行在用户进程中,因为用户进程会触发中断。所以它有一个 -EPERM。

您可以检查代码中的 euid、uid、pid 和 comm。像这样:

int hook_func()
{
printk(KERN_INFO"Code Called in hook_func. My pid: %d, comm: %s, uid: %d, euid: %d\n",
current->tgid, current->comm, current->cred->uid, current->cred->euid);
...
}

int my_init()
{
printk(KERN_INFO"Code Called in my_init. My pid: %d, comm: %s, uid: %d, euid: %d\n",
current->tgid, current->comm, current->cred->uid, current->cred->euid);
...
}

module_init(my_init);

关于linux - 内核模块执行中的不同特权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30700412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com