内核模块执行中的不同权限

Ric*_*ard 5 linux privileges kernel kernel-module

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

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

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

由于这两个地方都在一个内核模块中,"即使在内核空间中,也有不同的权限?"

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

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

shu*_*fei 2

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

一般来说,代码必须在进程中运行。

module_init总是运行在insmoding模块期间(参见sys_init_module函数)。当您 insmod 内核模块时,您必须是 root。并且该进程也是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);
Run Code Online (Sandbox Code Playgroud)