我正在为一个研究项目在运行 x86-64 的 Linux 上进行一些内核黑客攻击。我需要从内核例程跳转到用户模式代码页并立即返回内核代码。换句话说,我需要在内核中执行时对用户代码做一个蹦床。
我想知道这是否可能。如果可能的话,有人可以给出一些想法如何实现吗?
我正在为一个研究项目在运行 x86-64 的 Linux 上进行一些内核黑客攻击。我需要从内核例程跳转到用户模式代码页并立即返回内核代码。换句话说,我需要在内核中执行时对用户代码做一个蹦床。
我想知道这是否可能。如果可能的话,有人可以给出一些想法如何实现吗?
这不太可能“容易”。
在不了解您的应用程序并且不建议您重新考虑您的内核<->应用程序接口的情况下,您可能会这样工作:让应用程序通过仅传递该代码的地址向您的内核组件注册一段蹦床代码. 蹦床代码将执行您的“真实”用户模式函数,然后发出另一个系统调用或异常以返回内核。
虽然这不完全是一个用户模式子程序,但它相当接近:当您的应用程序调用任何需要执行回调的内核函数时,内核函数可以保存真正的返回地址,将其更改为注册的蹦床地址并返回用户模式。蹦床将调用该函数,它后面的系统调用/异常会将您踢回内核,您可以继续您在那里所做的任何事情。
无论如何,您可能不需要担心安全性,但是如果您这样做,您可能必须确保“从蹦床返回”系统调用仅从您仍然有开放蹦床黑客的进程中接受。
你也可以看看信号是如何工作的;它们是关于让内核中断应用程序并让应用程序调用信号处理程序;类似信号的实现甚至可以在您的应用程序没有进行活动系统调用的情况下工作(但它也将具有信号处理程序的所有限制)。
事实上,也许你可以只使用一个信号?再一次,看看信号在内核中是如何工作的,并且只是给你的用户代码发信号。在您的应用程序中安装适当的信号处理程序,并让信号处理程序调用“从用户空间蹦床返回”系统调用。
无论哪种方式,这听起来有点...... hackish。在没有做过任何内核工作的情况下,我会假设通过设备节点、套接字或类似机制与您的应用程序交互可能是一种更好的方式……或者只是让您的系统调用返回一个“待办事项”结果项应用程序告诉它调用 siome 用户空间代码并用另一个系统调用报告回来。