通过内核模块在 ARMv7 上进入虚拟机监控程序模式

Enter Hypervisor Mode on ARMv7 through Kernel Module

提问人:Coder 提问时间:8/2/2017 最后编辑:oxr463Coder 更新时间:11/14/2021 访问量:944

问:

我正在做一个项目,我有一个带有 ARMv7 处理器 (Cortex A15) 和 OpenWRT OS 的路由器。我在路由器上有一个 shell,可以使用 .insmod

我的目标是用 C 编写一个内核模块,该模块更改 HVBAR 寄存器,然后执行 hvc 指令以使处理器处于 hyp 模式。 这是一个科学项目,我想检查是否可以将自己的虚拟机管理程序放在正在运行的系统上。但是在我开始编写自己的虚拟机管理程序之前,我想检查一下是否可以以及如何将处理器带入 hyp 模式。

根据 armv7-a 手册 B.9.3.4 中的这张图片,系统必须处于不安全模式,而不是用户模式和 SCR。HCE 位必须设置为 1。

enter image description here

我的问题是我如何准备带有 C 内核模块和内联汇编的处理器,然后执行 hvc 指令。我想用内核模块来做到这一点,因为那时我从 PL1 开始。这个伪代码描述了我想要实现的目标:

  1. 调用 SMC // 进入监控模式
  2. 设置 SRC。HCE 到 1 // 启用 hvc 指令
  3. 设置 SRC。NS 设置为 1 // 将系统设置为不安全
  4. call hvc #0 // 调用 hvc 指令生成虚拟机管理程序异常
C ARM 虚拟化 OpenWRT 虚拟机管理程序

评论

0赞 0___________ 8/6/2017
目前尚不清楚您要存档的内容。你想编写自己的虚拟机管理程序并运行openwrt,还是想从openwrt进入hypersivor模式。如果后者IMO是不可能的,也是错误的。
1赞 Coder 8/7/2017
我已经更新了我的问题。我的目标是从 C 程序/内核模块调用 hvc 指令。但在执行此操作之前,我需要在系统中启用 hvc 指令。我的问题是,一个带有内联汇编的最小 C 内核模块看起来如何,首先启用 hvc 指令,然后执行它。
1赞 artless noise 8/11/2017
请参见:trust-zone。从安全变为正常时,90+% 的 CP15 寄存器未设置。设置 CP15 寄存器不是一个简单的副本。某些寄存器必须按顺序/顺序进行设置,应根据具体情况进行调查。首先从 NORMAL 模式启动 Linux 要好得多。请参阅:TZ 监控模式和 IFAR、IFSR... 了解“在线”汇编程序。考虑改变它脚下的 linux-mm(MMU、缓存等)。

答:

0赞 a3f 11/14/2021 #1

提升权限的最简单方法是从所需的权限模式开始:您有一个 root shell。启动链是否经过验证?你能替换引导加载程序或内核,这样你的代码就可以自然地在PL2(HYP)模式下运行吗?如果是这样,这可能是最简单的方法。

如果您无法替换引导链的相关部分,那么编写 rootkit 的细节很大程度上取决于遗漏的有关系统的信息: Linux 以哪种模式启动?KVM 支持是否已启用并处于活动状态?PL2 是否初始化?它被锁住了吗?是否有可以利用的“安全”固件?

目标始终是一样的:指向一些你可以控制的代码,然后做一个.根据您的环境,解决方案可能包括尽可能多地使用您的代码喷洒 RAM,并希望(也许在重新启动一段时间后)未初始化的 HVBAR 会指向您控制的指令,以及禁止 KVM 运行并访问早期的虚拟机管理程序存根以自行安装。HVBARhvc

列举此类漏洞有点超出了 StackOverflow 答案的范围;这是相当的论文材料。事实上,有一篇关于这个主题的博士论文:

使用基于虚拟机监控程序的安全机制增强 ARMv7 处理器架构上的系统安全性