【问题标题】:Kprobe/Jprobe in the middle of a function函数中间的 Kprobe/Jprobe
【发布时间】:2023-03-29 21:59:01
【问题描述】:

我想拦截fs/binfmt_elf.c文件中的load_elf_binary函数,从通过参数传递给它的文件中读取一些自定义节标题,并在从返回之前设置一些寄存器(eax,ebx,ecx,edx)函数。

现在我读到 Jprobes 是访问目标函数参数的好方法,但问题是一旦控件从 Jprobes 函数返回,寄存器和堆栈值就会按照它的规范恢复,所以我正在研究绕过它并可能在函数的中间插入一个探针(最好是在最后)将是一个好主意。如果我错了,请纠正我并帮助解决这个问题。

【问题讨论】:

  • 你为什么要在这里更改寄存器?
  • 我不会说完全改变,我需要执行以下代码__asm__ __volatile__ (".byte 0xf1" : : "a"(eax), "b"(ebx), "c"(ecx), "d"(edx), "D"(edi), "S"(esi)); 让 CPU 知道某些 ELF 文件必须被视为我的安全功能的特殊文件正在努力。
  • 据我所知,在返回时更改寄存器只会更改函数的返回值。这只会将东西放在错误路径上(或者当它应该在错误路径上时无法将东西放在错误路径上)。鉴于您已经专注于一种非常复杂且脆弱的方法来做您正在做的任何事情,因此很难建议要做的事情。您为什么不告诉我们您真正想要做什么,以便我们可以建议一种更简单的方法?
  • 哦,0xf1 似乎不是 x86 上定义的操作码(c.f. ref.x86asm.net/coder32.html#xF1
  • 是的,这是自定义指令

标签: linux linux-kernel kernel elf kprobe


【解决方案1】:

那么,让我看看我是否理解你的正确做法。

您已经修改了 CPU(在模拟器中运行?),以便指令 0xF1 执行某种加密操作。您希望安排 load_elf_binary 在返回时调用该指令,并为该指令正确设置寄存器以发挥其魔力。不知何故涉及自定义部分。

按照您所说的方式,这将很难做到。有几个主要问题:

  1. 我不确定你的威胁模型是什么,但是如果你的魔术 CPU 指令只是直接解密映射的数据,你将修改 linux 页面缓存中的页面,并且解密的代码或数据将对其他进程可见映射这些页面。
  2. 此外,如果内核稍后释放页面,加密数据将重新加载到内存中,导致在不可预知的时间崩溃。
  3. 如果某些进程使这些页面变脏,解密的数据将被刷新回磁盘,在磁盘上留下混合的解密和加密数据。
  4. 如果您使用 JProbe,您的回调会在进入该函数时被调用,无论如何这还为时过早。

总而言之,这不会像你所说的那样奏效。

更好的方法可能是定义自己的 binfmt(或替换 elf_format 中的 load_binary 回调)。然后您的 binfmt 可以以任何需要的方式加载二进制文件。如果你想利用现有的 ELF 加载器,你可以委托给 load_elf_binary,然后在返回时做任何你需要的操作来操作加载的进程,而不需要任何 JProbe 的东西。

在任何一种情况下,请务必将您正在加密/解密的所有页面重新映射为MAP_PRIVATE,并在更改其内容之前将它们标记为脏页。

【讨论】:

  • 这是一个研究项目的一部分,提出了一个新的架构作为现有 x86 架构的扩展,你提到的所有页面处理问题都已经解决了,实际上修改逻辑在fs/binfmt_elf.c 中实现时,ELF 加载本身也可以工作,只是因为内核中只有大约 300 行代码更改,所以我正在考虑将它作为内核模块来实现,这样用户就不需要重新编译整个内核进行如此小的更改。底线是尽可能保持内核不变。
  • @bawejakunal 老实说,当您谈论引入像这样的新架构原语时,您可能应该考虑内核补丁而不是像这样的猴子补丁内核代码:/ 但在这种情况下,请考虑注册一个新的二进制文件格式化为模块
  • 你在这方面做得太深了,但你的努力真的很可观,是的,就像你建议的那样,我们最初只是为了内核补丁(最低限度地修改 load_elf_binary)但是在我们得到的一篇论文评论中一条评论说仅仅为几百行代码重新编译整个内核太费力了:|无论如何,我有点迷路了,我昨天使用 kprobes 的入口和返回处理程序实现了这个东西。
  • 我猜这个故事的寓意是学术界的需求与生产代码的需求不同:)
猜你喜欢
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2023-04-06
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多