如何使用TrustZone从安全的世界中反思正常世界?

时间:2016-03-29 15:19:04

标签: linux linux-kernel arm integrity trust-zone

我了解到安全世界可以保护关键数据不被正常世界访问,我不明白的是我如何从安全世界中衡量正常世界的完整性。

我在三星TZ-RKP和SierraTEE中找到了一些相关的工作,他们都在其中实现了一个可以衡量正常世界完整性的功能。但他们没有提供技术细节。我有两个问题,如果有人能给我一些线索,我会非常感激。

  1. 假设我想看看正常世界中正在运行的进程,我是否必须在正常的世界中使用内核模块来帮助我这样做?如果是这样,我如何确保它已将正确的结果传递给安全的世界?确切地说,我如何检查内核是否已被压缩?

  2. 假设我有一个RSA密钥对,并且我将私钥保存在安全的世界中。当一个进程请求解密某些数据时,安全世界如何知道该请求是否来自立法程序?白名单机制可能有所帮助,但如果正常世界中的内核遭到破坏并且对手假装立法会怎么样?安全的世界似乎对正常世界中发生的事情一无所知。

  3. 即使可以确定它是来自立法程序并且使用私钥解密数据,解密的数据仍将以某种方式返回到正常世界区域(即共享内存)和解密数据仍然可能被泄露。那么将私钥保存在安全的世界中有什么意义呢?

    顺便说一句,我正在使用armv8板。

    提前致谢。如果你能给我提供一些例子,那就太棒了。

1 个答案:

答案 0 :(得分:0)

Trust-zone本身不是一个安全系统。你必须设计那个。此外,还有许多不同类型的安全性。例如,您正在假设软件攻击但是对系统有许多物理攻击(就像我猜你描述的那样)。某些东西必须是可信计算基础(TCB);即,您认为的一些代码不能被破坏。普通的世界内核可能太大而不能成为TCB的一部分,但它可能是一个很好的第一道防线。对它的攻击只是从用户到主管的优先考虑。您的TrustZone API应该期望不受信任的数据(即正常的世界内核尝试缓冲区溢出和API误用等)。

这里的关键点是TZASC和其他总线外设可以为安全世界授予读/写正常世界内存的访问权限。对于像Linux这样的完整操作系统,你必须验证MMU表和其他数据结构。模块加载,进程运行等都需要验证。但是,如果您在普通世界中有一个更简单的系统,则可以对其进行验证。很可能你必须满足于它的一部分。 PC的随机抽样可能具有威慑作用;但除非正常的世界是携带代码的证明,否则没有什么是万无一失的。

  
      
  1. 假设我想看看正常世界中正在运行的进程,我是否必须在正常的世界中使用内核模块来帮助我这样做?如果是这样,我如何确保它已将正确的结果传递给安全的世界?确切地说,我如何检查内核是否已被编译?
  2.   

您的安全世界可以包含OS(或原始调度程序),它将定期检查正常的世界代码完整性。有像RTIC等硬件模块。您还可以使用TZASC将内核代码锁定为普通用户(无访问权限),将普通主管锁定为只读。 comprimised 是一个重载的单词。在某些时候你必须相信某些东西。如果正常超级受损,私钥是否可以被复制?您必须定义您的安全目标。在任何意义/含义中,当然正常的世界内核可能会受到损害。您没有完整的行为规范来验证安全世界。

  
      
  1. 假设我有一个RSA密钥对,我将私钥保存在安全的世界中。当一个进程请求解密某些数据时,安全世界如何知道该请求是否来自立法程序?白名单机制可能有所帮助,但如果正常世界中的内核遭到破坏并且对手假装立法会怎么样?安全的世界似乎对正常世界中发生的事情一无所知。
  2.   

您的安全世界可能必须与加密实体进行一些合作。例如,您可以限制解密量而不需要验证。似乎最有价值的是私有RSA密钥。如果您允许普通世界请求解密,那么这是您的问题而不是Trustzone的问题?您必须使用具有加密和未知/不可信主机的常规机制来处理此问题。 RSA密钥对是全局还是每个设备?你是否支持撤销等等。它在你的系统中,而TrustZone只是它的一部分。