在内核空间中执行用户空间代码

时间:2015-04-20 09:23:16

标签: linux linux-kernel

我注意到在内核模式下可以读取/写入某些应用程序内存(我在上下文中),但是无法执行用户空间代码。

我猜它与内核代码段(限制和粒度)有关。有没有办法执行用户空间地址? 我知道它破坏了Linux安全模型等,我只是想知道是否有可能欺骗Linux内核并使其执行用户空间代码。

2 个答案:

答案 0 :(得分:1)

用户空间程序具有其自己的虚拟地址空间(< 0xC0000000),并且不可能从内核空间(> 0xC0000000)执行这样的程序。您可能应该查看user-helper-api(Invoking user-space applications from the kernel)和linux进程间通信(IPC)内核套接字,共享内存和信号。网络工具使用IPC(内核套接字)进行通信。驱动程序使用user-helper-api通知用户空间有关某些事件。如果您对如何使用二进制用户空间程序感兴趣,可以查找UPROBE linux内核模块(uprobe可以解析用户空间二进制文件并编辑用户空间程序指令)。

答案 1 :(得分:0)

假设Linux在x86系统上,32位(因为OP没有提供该信息):

内核在任何进程中都是可见的,而在特定进程上下文中,内核可以读取和写入进程已映射到其内存映射的任何内存地址。这也意味着可以执行调用以执行一些位于0xc0000000标记以下的代码(对于32位Linux),前提是:

  • 代码不会发出系统调用。
  • 内核锁定了代码所在的内存及其使用的数据,因此在执行代码时不会出现页面错误。
  • 如果内核使用NX功能将页面标记为不可执行,则必须取消标记要执行的代码所在的页面。
  • 代码不会产生任何其他异常,例如除以零。