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

标签 linux kernel kernel-module privileges

我在内核模块 (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/

相关文章:

linux - 比较输入和输出 - bash

linux - 如何在 LKM 中监控 syslog(printk)

c - 尽管出现警告消息 'not found",但已成功删除内核模块

linux - 无法为 CONFIG_UNWINDER_ORC=y 生成 ORC 元数据

c - 如何正确实现 kthreads 的完成?

c - 在 Linux 内核模块中读/写文件

linux - 创建带有子目录的符号链接(symbolic link)

linux - 根据名称删除文件夹

python - 在写入其标准输入后后台进程

c++ - 如何以编程方式使系统崩溃