【发布时间】:2014-09-24 22:53:04
【问题描述】:
我有一件很奇怪的事情需要做:访问一些“安全”指令,以处理实际上不需要在安全上下文中完成的事情。简而言之:我需要进入安全模式,但不是因为我想要硬件 TPM 功能或任何东西。我只需要访问某些我不会有的说明。
我们正在 Gumstix Overo FireSTORM COM 上执行此操作。我的理解是这些安全启动,但是在某个地方(MLO?u-boot?)他们切换到非安全模式,但我可能是错的。关键是我们肯定是从 nonsecure(但特权,见下文)模式执行此操作。
(我撰写了这个问题,关于直接访问 A8 分支预测器的 GHB/BTB,如果您对我想要做什么感到好奇:Write directly to the global history buffer (GHB) or BTB in the branch predictor of a ARM Cortex A8?)
现在,所有这些都将通过 u-boot 完成(我们有 Overo FireSTORM COM),所以幸运的是我有“特权”执行。那里不用担心。而且我查看了其他 StackOverflow 问题,但似乎没有关于如何进入安全模式的任何内容。我真正想做的就是访问一些 CP15 寄存器,然后返回非安全模式(并可能重复该过程)。
我查看了 SMC 指令,但我找不到任何关于如何适当地捕获呼叫/呼叫去向/如何设置等的文档。
这些信息在任何地方吗?
回顾一下,这是我想做的事情:
FROM PRIVILEGED EXECUTION:
Do stuff
Tweak GHB // requires secure execution
Do more stuff
Tweak GHB
Do more stuff
...
...
...
Do stuff
任何帮助都将不胜感激!
感谢@artlessnoise,我在 u-boot 源中找到了这个文件:/u-boot/arch/arm/cpu/armv7/nonsec_virt.S。
它包含以下代码:
/*
* secure monitor handler
* U-boot calls this "software interrupt" in start.S
* This is executed on a "smc" instruction, we use a "smc #0" to switch
* to non-secure state.
* We use only r0 and r1 here, due to constraints in the caller.
*/
.align 5
_secure_monitor:
mrc p15, 0, r1, c1, c1, 0 @ read SCR
bic r1, r1, #0x4e @ clear IRQ, FIQ, EA, nET bits
orr r1, r1, #0x31 @ enable NS, AW, FW bits
#ifdef CONFIG_ARMV7_VIRT
mrc p15, 0, r0, c0, c1, 1 @ read ID_PFR1
and r0, r0, #CPUID_ARM_VIRT_MASK @ mask virtualization bits
cmp r0, #(1 << CPUID_ARM_VIRT_SHIFT)
orreq r1, r1, #0x100 @ allow HVC instruction
#endif
mcr p15, 0, r1, c1, c1, 0 @ write SCR (with NS bit set)
#ifdef CONFIG_ARMV7_VIRT
mrceq p15, 0, r0, c12, c0, 1 @ get MVBAR value
mcreq p15, 4, r0, c12, c0, 0 @ write HVBAR
#endif
movs pc, lr @ return to non-secure SVC
如果我修改了 mcr p15 指令的掩码,我可以简单地“关闭”移动到非安全模式。但是,这可能会杀死 u-boot。
那么问题是:如何设置适当的向量,以便在进行 SMC 调用时,我会跳回安全模式,并且能够进行 GHB/BTB 修补?
感谢任何其他帮助!
【问题讨论】:
-
您的代码是否曾经处于安全模式,或者ROM引导加载程序是否将您置于正常模式?您需要
mcr p15, 0, r0, c12, c0, 1来设置 监控向量表 以使用smc指令。 tweak GHB 可以在smc调用中完成。但是,您只能从安全模式访问 MVBAR。如果您从未处于 secure 中,那么您将永远无法到达那里。 -
感谢@artlessnoise 的回复!我用更多的背景编辑了这个问题。我们从非安全(但特权)模式开始。我知道 SMC 调用可用于访问安全模式(对吗?)。如果我正确阅读了您的回复,问题是我们永远无法设置 SMC 呼叫结束的位置 [除非我们将其设置为安全模式]。那是对的吗?所以我们没有办法从严格的 NS 模式做我们想做的事吗?
-
没错。您需要修改 u-boot 和/或 ROM 加载器 (MLO?) 代码或执行路径,以便在 特权安全世界 中获得一些代码;设置MVBAR的
mcr指令与其他GHB/BTB相同;它只能在安全的世界中访问。要从您当前的模式执行此操作,您要求在此平台上进行 TZ 漏洞利用。 TZ 的设计让您无法做到这一点。 -
感谢您的提示,@artlessnoise。在您的帮助下,我找到了——我认为——u-boot 在哪里跳转到 NS 模式。我已经更新了原始问题,因此后代可以受益。剩下的问题似乎是如何设置适当的向量,所以当我进行 SMC 调用时——在 u-boot 执行的很久以后——我 a)。跳回安全模式和 b)。可以对 GHB 进行修补。有什么想法吗?
-
我认为您的文件有误。那是针对 Cortex-A15 的。请参阅:include/configs/vexpress_ca15_tc2.h,我认为 Cortex-A8 不会以这种方式启动。
标签: security arm cortex-a8 trust-zone