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

21

我正在一个项目上工作,其中我有一台装有ARMv7处理器(Cortex A15)和OpenWRT操作系统的路由器。我在路由器上有一个shell,并可以用insmod加载内核模块。

我的目标是编写一段C语言内核模块,更改HVBAR寄存器,然后执行hvc指令将处理器置于hyp模式。这是一个科学项目,我想检查是否可以在运行中的系统上放置自己的hypervisor。但在编写自己的hypervisor之前,我想检查是否以及如何将处理器置于hyp模式。

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

enter image description here

我的问题是如何用C内核模块和inline汇编准备处理器,然后执行hvc指令。我想使用内核模块来完成此操作,因为那样我就可以在PL1中启动。以下是我想要实现的伪代码:

  1. 调用smc // 进入monitor模式
  2. 将SRC.HCE设置为1 // 启用hvc指令
  3. 将SRC.NS设置为1 // 将系统设置为不安全模式
  4. 调用hvc #0 // 调用hvc指令以产生hypervisor异常

你想要实现什么目标并不是很清楚。你是想编写自己的虚拟机监控程序并运行openwrt,还是想从openwrt进入虚拟机监控程序模式?如果是后者,在我看来这是不可能且错误的。 - 0___________
1
我已经更新了我的问题。我的目标是从C程序/内核模块中调用hvc指令。但在此之前,我需要在系统中启用hvc指令。我的问题是如何编写一个最小的C内核模块,其中包含内联汇编,首先启用hvc指令,然后执行它。 - Coder
1
请参考:[标签:trust-zone]。从安全模式切换到普通模式时,90%以上的CP15寄存器都没有设置。设置CP15寄存器不是简单的复制。有些寄存器必须按照一定的顺序进行设置,这需要根据具体情况进行调查。最好一开始就从NORMAL模式启动Linux。请参考TZ监视器模式和IFAR、IFSR...,了解内联汇编的一些信息。考虑在其脚下更改linux-mm(MMU、缓存等)。 - artless noise
1个回答

0
最简单的提升特权的方法是在所需的特权模式下启动:您拥有根Shell。引导链是否已验证?您是否可以替换引导加载程序或内核,以便您的代码自然运行在PL2(HYP)模式下?如果是这样,那可能是最简单的方法。
如果无法替换引导链的相关部分,则编写rootkit的详细信息取决于遗漏的有关系统的信息:Linux以哪种模式启动?是否启用并激活了KVM支持?PL2是否初始化?它是否被锁定?是否存在可以利用的“安全”固件?
目标始终相同:使HVBAR指向您可以控制并执行hvc的某些代码。根据您的环境,解决方案可能从尽可能多地使用您的代码来喷洒RAM并希望(也许经过一些重新启动后)未初始化的HVBAR会指向您控制的指令,到阻止KVM运行和访问早期的hypervisor存根以代替自己。
枚举此类漏洞有点超出了StackOverflow答案的范围;这是更像是论文的材料。实际上,正好有一篇关于这个主题的博士论文。

利用基于虚拟化的安全机制加固ARMv7处理器架构的系统安全性


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接