【问题标题】:Easiest way to access secure (TrustZone) instructions from privileged context on Cortex A8/DM3730从 Cortex A8/DM3730 上的特权上下文访问安全 (TrustZone) 指令的最简单方法
【发布时间】: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


【解决方案1】:

Gumstix 上的 DM3730 是 GP(通用)设备,这意味着它已禁用了 TrustZone。没有办法进入它。

https://stackoverflow.com/a/8028948/6839

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多