通过内核模块在 ARMv7 上进入 Hypervisor 模式

Posted

技术标签:

【中文标题】通过内核模块在 ARMv7 上进入 Hypervisor 模式【英文标题】:Enter Hypervisor Mode on ARMv7 through Kernel Module 【发布时间】:2018-01-09 14:59:50 【问题描述】:

我正在开发一个带有 ARMv7 处理器 (Cortex A15) 和 OpenWRT OS 的路由器的项目。我在路由器上有一个外壳,可以使用insmod 加载内核模块。

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

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

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

    调用 smc // 进入监控模式 将 SRC.HCE 设置为 1 // 以启用 hvc 指令 将 SRC.NS 设置为 1 // 将系统设置为不安全 call hvc #0 // 调用 hvc 指令以产生管理程序异常

【问题讨论】:

您要归档的内容非常不清楚。您是想编写自己的管理程序并运行 openwrt 还是想从 openwrt 进入 hypersivor 模式。如果后者 IMO 是不可能的和错误的。 我已经更新了我的问题。我的目标是从 C 程序/内核模块调用 hvc 指令。但在我能做到这一点之前,我需要在系统中启用 hvc 指令。我的问题是具有内联汇编的最小 C 内核模块看起来如何,首先启用 hvc 指令然后执行它。 见:trust-zone。从安全更改为正常时,90+% 的 CP15 寄存器未设置。设置 CP15 寄存器不是简单的副本。一些寄存器必须按顺序/顺序设置,应根据具体情况进行调查。首先从正常模式启动 Linux 要好得多。请参阅:TZ monitor mode and IFAR, IFSR... 了解您的“在线”汇编程序。考虑在其脚下更改 linux-mm(MMU、缓存等)。 【参考方案1】:

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

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

目标始终相同:让HVBAR 指向您可以控制的一些代码并执行hvc。根据您的环境,解决方案的范围可能包括使用您的代码喷射尽可能多的 RAM,并希望(可能在一些重新启动之后)未初始化的 HVBAR 将指向您控制的指令,以禁止 KVM 运行和访问早期的管理程序存根以安装自己而是。

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

Strengthening system security on the ARMv7 processor architecture with hypervisor-based security mechanisms

【讨论】:

以上是关于通过内核模块在 ARMv7 上进入 Hypervisor 模式的主要内容,如果未能解决你的问题,请参考以下文章

启用 ARMv7 VMSA 内存管理单元?

找不到目标'x86_64-apple-ios-simulator'的模块'MyCustomFramework';找到:arm64,armv7-apple-ios,arm

内核引导程序---head

Linux驱动基础开发

linux安装内核模块问题

Ubuntu 在登陆界面usb的键盘和鼠标上无法输入和移动(注明:与内核驱动有关系)