【问题标题】:Is there a way to call user space function form linux kernel module?有没有办法从linux内核模块调用用户空间函数?
【发布时间】:2018-06-08 06:08:48
【问题描述】:

想象这样一种情况:我将从系统调用中获取一个位于用户空间的函数指针,然后内核模块回调该函数。 (此功能在用户空间中运行很重要) kenel 模块会看到与用户空间应用程序相同的内存地址(获取的函数指针)吗? (我的意思是用户的虚拟地址空间或线性地址空间)

【问题讨论】:

  • 有可能,神圣的安全漏洞,蝙蝠侠!
  • @user3344003 我认为不会,如果内核在调用用户空间函数之前更改了特权级别。
  • 那将是一个巨大的安全漏洞。
  • 这正是信号处理程序的操作方式,是的,这是可能的,尽管这是一项非常重要的任务。更常用的方法是通过 netlink 套接字与用户空间进行交互,这正是为此目的而存在的。

标签: linux-kernel operating-system system-calls kernel-module protected-mode


【解决方案1】:

首先,您试图做错事。如果您需要内核中的自定义代码,请将其作为内核模块提供。

链接副本 (Executing a user-space function from the kernel space) 中的答案在很大程度上是废话。只要不使用系统调用并且不使用 tls/其他任何东西,这将在某些架构上“工作”。事实上,大量的漏洞利用就是这样做的。

我将获取一个位于用户空间的函数指针,来自 一个系统调用,内核模块回调这个函数。

听起来你真的在尝试倒退。如果你需要一个用户空间组件,那就是应该有所有逻辑的东西。然后你调用内核告诉它该做什么。

(这个函数在用户空间运行很重要吗?)

你在问谁?我只能说调用用户空间植入的函数并不意味着它开始“在用户空间中运行”。切换到用户空间是很多工作,绝对不是通过调用函数来完成的。

kenel 模块会看到与用户空间应用程序相同的内存地址(获取的函数指针)吗?

取决于架构,通常会。但即便如此,使用此“功能”也有硬件保护措施,必须明确关闭。

但同样,你不想这样做。我强烈建议您说明实际问题。

【讨论】:

  • 信号处理程序呢?
猜你喜欢
  • 1970-01-01
  • 2017-12-10
  • 2012-06-04
  • 1970-01-01
  • 2010-10-01
  • 2011-02-11
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多