ATF(TF-A)安全通告汇总
目录
一、ATF(TF-A)安全通告 TFV-7 (CVE-2018-3639)
二、静态缓解(Static mitigation)
三、动态缓解(Dynamic mitigation)
一、ATF(TF-A)安全通告 TFV-7 (CVE-2018-3639)
Title | TF-A披露基于cache前瞻执行漏洞变种4 |
CVE ID | CVE-2018-3639 |
Date | 21 May 2018 (Updated 7 June 2018) |
Versions Affected | All, up to and including v1.5 |
Configurations Affected | All |
Impact | 泄露安全世界的数据到非安全世界 |
Fix Version | Pull Request #1392, Pull Request #1397 |
Credit | |
本安全通告描述了当前对TF-A披露的基于cache前瞻执行漏洞变种4的理解,该漏洞是由Google Project Zero团队发现的。要了解Arm系统上这些漏洞的背景和更广泛的影响,请参阅Arm处理器安全更新(Arm Processor Security Update)。
在写这篇文章的时候,还没有发现TF-A项目中一个变体4的漏洞被用来攻击TF-A。针对TF-A的当前标准配置实现攻击可能非常困难,因为使用攻击者控制的输入进入安全世界的接口有限。然而,随着复杂的新固件接口的引入,这变得越来越难以保证,例如软件委托异常接口(Software Delegated Exception Interface (SDEI))。此外,TF-A项目并不具有对所有供应商提供的接口的可见性。因此,TF-A项目采取保守的方法,在安全世界执行期间尽可能缓解变体4。通过设置实现定义的控制位来防止store和load指令的re-order,从而启用缓解。
对于每种受影响的CPU类型,TF-A在Pull Request #1392和Pull Request #1397中实现了以下两种缓解方法。这两种方法都对系统性能有影响,这种影响因CPU类型和用例的不同而不同。缓解代码在默认情况下是启用的,但对于不受影响的平台或认为风险足够低的平台,可以在编译时禁用。
怎么禁用呢?
下面小节中未提到的Arm cpu不受影响。
二、静态缓解(Static mitigation)
对于受影响的cpu,这种方法允许在每次PE复位之后,EL3初始化期间使能缓解。没有提供在运行时禁用缓解的机制。
这种方法永久性地减轻了整个软件堆栈的负担,并且在其他软件组件中不需要额外的缓解代码。
TF-A为以下受影响的cpu实现了这种方法:
1)Cortex-A57和Cortex-A72,通过设置CPUACTLR_EL1 (S3_1_C15_C2_0)的第55位(禁用load pass store)。
2)Cortex-A73,通过设置S3_0_C15_C0_0的第3位(未在技术参考手册(TRM)中记录)。
3)Cortex-A75,通过设置CPUACTLR_EL1 (S3_0_C15_C1_0)的第35位(TRM中是reserved)。
三、动态缓解(Dynamic mitigation)
对于受影响的cpu,这种方法还允许在每次PE复位后,EL3初始化期间使能缓解。此外,该方法在Arm架构范围内实现了SMCCC_ARCH_WORKAROUND_2,以允许处于较低异常级别的调用者在其执行上下文中临时禁用缓解,因为在这种情况下,风险被认为足够低。此方法允许在进入EL3时进行缓解,并在退出EL3时恢复较低异常级别的缓解状态。有关此方法的更多信息,请参考Firmware interfaces for mitigating cache speculation vulnerabilities。
这种方法可以通过其他软件组件中的附加缓解代码加以补充,例如调用SMCCC_ARCH_WORKAROUND_2的代码。然而,即使在其他软件组件中没有任何缓解代码,这种方法也将有效地永久缓解整个软件堆栈,因为固件管理执行上下文的默认缓解状态是使能的。
由于这种方法的期望是在禁用缓解的情况下执行更多的软件,因此对于某些系统或用例来说,这可能会比静态方法产生更好的系统性能。但是,对于其他系统或用例,这种性能节省可能被SMCCC_ARCH_WORKAROUND_2调用和TF-A异常处理的额外开销所抵消。
TF-A为以下受影响的CPU实现了这种方法:
Cortex-A76,通过设置和清除CPUACTLR2_EL1 (S3_0_C15_C1_1)的第16位(TRM中是保留的)。
参考:
9.7. Advisory TFV-7 (CVE-2018-3639) — Trusted Firmware-A 2.9.0 documentation