我正在阅读 ARM 中的 TEE。我正在寻找以下问题的指针:
TEE 如何安全地从操作系统加载代码并保证其不是恶意代码?
我猜代码已签名,TEE 可以验证签名。所以这就引出了其他问题——
谁在加载代码?操作系统中的加载程序还是 TEE 有自己的加载程序,允许它加载到操作系统的环境中?
如果操作系统加载程序正在加载它,如何在有根设备上信任它?
我觉得我在这里错过了一些东西。有人能指出我正确的文献可能是什么吗?
我正在阅读 ARM 中的 TEE。我正在寻找以下问题的指针:
TEE 如何安全地从操作系统加载代码并保证其不是恶意代码?
我猜代码已签名,TEE 可以验证签名。所以这就引出了其他问题——
谁在加载代码?操作系统中的加载程序还是 TEE 有自己的加载程序,允许它加载到操作系统的环境中?
如果操作系统加载程序正在加载它,如何在有根设备上信任它?
我觉得我在这里错过了一些东西。有人能指出我正确的文献可能是什么吗?
简而言之,TEE 确实有自己的引导加载程序。
基本思想是 CPU 从 ROM 启动。此 ROM 被编程为从持久存储中加载软件映像,验证它是否由存储在 ROM 中的公钥签名,并将执行转移到此软件映像。在具有 TrustZone 的 ARM 平台上,CPU 以安全模式启动,因此第一个软件(TEE)以安全模式执行。在某些时候,TEE 切换到非安全模式并加载另一个软件映像:“富操作系统”,即在平台上运行的主操作系统。
带有TrustZone的MMU将运行 TEE 的安全世界和运行富操作系统的非安全世界分开。非安全世界的特权低于安全世界,因此它无法访问安全世界的内存,就像用户态程序无法访问内核内存一样(尽管技术细节有些不同)。关于 TrustZone 和相关技术的公开文档并不多,但您可以在 ARM 的网站上找到一些文档。
由于现实生活从未如此简单,实际上发生的是一个链,其中 ROM 加载第一个引导加载程序,然后加载第二个引导加载程序,依此类推。只要每个阶段验证下一个阶段的代码映像的签名,只有经过身份验证的代码可以执行。其中之一加载了正常世界中的非安全、未经身份验证的引导加载程序,该引导加载程序又加载主操作系统(例如 U-Boot 和 Linux)。这是一个安全的启动链,类似于Microsoft 对 Windows 8 的要求。安全的引导链确保只有硬件制造商批准的代码才能运行。TEE 分离的想法是将安全引导应用于 TEE,但不一定应用于主操作系统。
请注意,安全启动所保证的是只有经过身份验证的代码才能运行。如果硬件制造商出于任何原因签署了恶意代码,它就可以运行。
我可以从 Qualcomm 和 Trustronic 的基于 TEE 的平台如何做到这一点来回答。
谁在加载代码?操作系统中的加载程序还是 TEE 有自己的加载程序,允许它加载到操作系统的环境中?
OS 或 TEE 中的加载器(如果有加载器)可以加载代码/数据,并通知 TEE 加载完成。通常是它的操作系统端加载器。然后代码/数据内存区域被 TEE 标记为安全内存,因此 Rich OS 不再可以访问。然后可以对其进行身份验证并根据结果投入使用。
如果操作系统加载程序正在加载它,如何在有根设备上信任它?
Rooting 只是意味着,用户具有 root 权限,因此您可以在系统或数据或任何分区中创建/修改文件,这些文件通常由 Android 中的普通用户保持不可修改。这仅影响富操作系统中的用户权限,因此仅影响非安全模式。TEE 和其他安全资产和资源位于安全内存中。即使在有根的安卓手机上也无法访问。
关于生根的更多信息:当您运行“fastboot oem unlock”命令时,简而言之,您只允许引导加载程序加载未签名的内核,因此最终是自定义 ROM。这在引导链的第四阶段可能已经很晚了。Trustzone 配置发生在第一阶段或第二阶段的早期。平台仍然是安全的。如果以正确的方式配置/使用安全资产,生根不会让黑客完全控制。不用担心。