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

5
我有两个位置在内核模块(Linux 3.13)中:
1.一个是module_init 2.另一个是我通过黑客攻击中断描述表而连接的代码。
我的代码是为了启用硬件性能计数器。当我将其放在module_init中时,代码可以正常工作。但是当我将其放到第二个位置(通过运行无效操作码触发)时,代码会出现permission denied错误(即errno:-13)。
由于这两个位置都在单个内核模块中,因此“即使在内核空间中,也存在不同的权限”是否正确?
更新:值得一提的是,当我以用户身份运行无效操作码时,-13 errno消失;否则,它仍然存在……
我推测“指令执行的特权决定了其中断处理程序的执行特权”。

在处理器上,您始终拥有操作系统特权。即使在内核模式下,也不是所有操作都被允许。否则,您可以轻易地接管控制权。 - Willem Van Onsem
@CommuSoftпјҡиҝҷи§ЈйҮҠдәҶд»–еңЁmodule_initдёӯзҡ„еҶ…ж ёд»Јз Ғе’Ңд»–з”ЁдәҺж“ҚдҪңз Ғйҷ·йҳұзҡ„еҶ…ж ёд»Јз Ғд№Ӣй—ҙзҡ„еҢәеҲ«еҗ—пјҹ - Nemo
2
我认为这里使用一个SSCCE会非常有帮助。 - Nemo
@CommuSoft你的意思是处理程序代码(OP中的情况2)在内核中运行,但特权不是ring 0吗? - Richard
2
一些内核函数有意检查当前用户的特权。要获得更详细的答案,请在您的帖子中更新一个名为“启用硬件计数器”的函数和一种“黑客中断描述表”的方式。 - Tsyvarev
1个回答

2
因为module_init和您的钩子代码运行在不同的进程中,而不同的进程之间有不同的权限。
通常情况下,代码必须在一个进程中运行。 module_init始终在插入模块时运行(请参见sys_init_module函数)。当您插入内核模块时,必须是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);

有没有办法通过再次黑掉IDT来改变这种行为(处理程序在触发进程的相同特权级别下运行)? - Richard
很抱歉,Richard。不行。 - shuofei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接