赞
踩
对比一下国外可信计算的一些前沿技术。Intel, AMD, ARM都有自己的可信执行环境概念,但是他们的概念其实还是没有做思路上的彻底改变,所以有些问题解决的并不好,比如可信执行环境里该运行什么内容?可信执行环境与原始系统如何互动?如何避免侧信道攻击?这三个问题,归根结底还是体系架构的问题,国外也并没有给出具体的解决方法,而主动免疫架构针对这三个问题给出了具体的回答。
部分内容来自网络
现在还有一个很火的舶来概念“零信任架构”。零信任架构的核心概念包括统一于身份的授权管理,业务安全访问,持续信任评估,动态访问控制等,这些和可信3.0有相通的地方。但这些并不是零信任的原创,我国等级保护标准也可以直接间接地推出这些需求。并且,零信任也没有在我们第二节所述的三个基本问题上给出回答,这使得零信任中的“信任”这个概念也缺少一个坚实的基础。
可信3.0中的可信是从哪里来的呢?单从网络系统上看,似乎是从信任根开始。但其实质是现实世界中的信任在网络空间的映射,这个映射在网络空间有清晰和明确的对应关系。而零信任中的信任则是模糊化了,没有说清楚其来源,它只是在无法构造完整信任链条情况下的一种妥协措施,是可信3.0的子集。我们要看到零信任在计算理论、体系架构和计算模式上的缺失,不要迷信,尤其是不应该基于零信任来解读网络空间安全,这样既缺乏科学依据,也与我国等级保护制度不符。但零信任和可信3.0相通的地方我们也不妨学习吸收,比如对应用流程的梳理,控制机制的实现等等。“零信任架构”的思想与传统安全理念也存在一些冲突之处。我们可以预测零信任发展到后面,会遇到一些问题。比如:
① 零信任架构自身安全如何保证?因为零信任架构整体比较大,不符合安全里的“最小独立化”要求。
② 集中可信后,各部件如何可信?零信任架构的信任如何扩展到每一个节点上?
③ 零信任架构到处插访控,那用户怎么选择在适宜位置放置这些访控机制?零信任架构对应用开发习惯有多大冲击?这个在可信2.0TCG中是有教训的,TCG搞了一个特别复杂的TSS结构,现在打算全部推翻重来,那么零信任架构会不会再重蹈覆辙?
④ 零信任架构对系统性能是否会带来不可预测的影响?如什么都要回到中间去做判断,那什么时候去做,要花费多少时间,不是简单就能搞定的,要经过重重验证,这些验证对性能影响有多大?
SGX是在原有 Intel 架构上扩展了一组新的指令集和内存访问机制,这些扩展能够在计算平台上提供一个可信的隔离空间,允许应用程序使用安全区保障用户关键代码和数据的机密性和完整性,不受特殊权限恶意软件的破坏。
SGX 的核心概念就是 enclave,它是一个被保护的安全容器,用于存储应用程序的敏感数据和代码。Enclave 内除代码和数据以外,还包括元数据和 TCS(Thread Control Structure),TCS 用于保存进入或退出 enclave时恢复 enclave 线程的特殊信息。EPC 是 PRM(Processor Reserved Memory)的一部分,PRM 则是内存的一部分,BIOS 通过配置一组范围寄存器分配 PRM,系统软件或外围设备无法访问。
SGX用于增强软件的安全性。这种方式并不是识别和隔离平台上的所有恶意软件,而是将合法软件的安全操作封装在一个enclave中,保护其不受恶意软件的攻击,特权或者非特权的软件都无法访问enclave。Enclave的安全边界只包含CPU和它自身,这一设计避免了基于软件的TEE自身存在软件安全漏洞与威胁的缺陷, 极大地提升了系统安全保障。
也就是说,一旦软件和数据位于enclave中,即便操作系统或者和VMM(Hypervisor)也无法影响enclave里面的代码和数据。Enclave的安全边界只包含CPU和它自身。SGX创建的enclave也可以理解为一个可信执行环境TEE(Trusted Execution Environment)。
TrustZone是ARM针对消费电子设备设计的一种硬件架构,其目的是为消费电子产品构建一个安全框架来抵御各种可能的攻击。
ARM TrustZone 技术是所有Cortex-A 类处理器的基本功能,是通过 ARM 架构安全扩展引入的。这些扩展可在供应商、平台和应用程序中提供一致的程序模型,同时提供真实的硬件支持的安全环境。TrustZone技术可以在最近的绝大多数Arm处理器中使用,它允许在一个所谓的安全世界中执行代码。它有效地为敏感的数据和代码提供了处理器的硬件隔离区域,即一个可信的执行环境(TEE)。
如图所示,TrustZone在概念上将SoC的硬件和软件资源划分为安全(Secure World)和非安全(Normal World)两个世界,所有需要保密的操作在安全世界执行(如指纹识别、密码处理、数据加解密、安全认证等),其余操作在非安全世界执行(如用户操作系统、各种应用程序等),安全世界和非安全世界通过一个名为Monitor Mode的模式进行转换。
处理器架构上,TrustZone将每个物理核虚拟为两个核,一个非安全核(Non-secure Core, NS Core),运行非安全世界的代码;和另一个安全核(Secure Core),运行安全世界的代码。
两个虚拟的核以基于时间片的方式运行,根据需要实时占用物理核,并通过Monitor Mode在安全世界和非安全世界之间切换,类似同一CPU下的多应用程序环境,不同的是多应用程序环境下操作系统实现的是进程间切换,而Trustzone下的Monitor Mode实现了同一CPU上两个操作系统间的切换。
AMBA3 AXI(AMBA3Advanced eXtensible Interface)系统总线作为TrustZone的基础架构设施,提供了安全世界和非安全世界的隔离机制,确保非安全核只能访问非安全世界的系统资源,而安全核能访问所有资源,因此安全世界的资源不会被非安全世界(或普通世界)所访问。
设计上,TrustZone并不是采用一刀切的方式让每个芯片厂家都使用同样的实现。总体上以AMBA3 AXI总线为基础,针对不同的应用场景设计了各种安全组件,芯片厂商根据具体的安全需求,选择不同的安全组件来构建他们的TrustZone实现。
其中主要的组件有:
必选组件
AMBA3 AXI总线,安全机制的基础设施
虚拟化的ARM Core,虚拟安全和非安全核
TZPC (TrustZone Protection Controller),根据需要控制外设的安全特性
TZASC (TrustZone Address Space Controller),对内存进行安全和非安全区域划分和保护
可选组件
TZMA (TrustZone Memory Adapter),片上ROM或RAM安全区域和非安全区域的划分和保护
AXI-to-APB bridge,桥接APB总线,配合TZPC使APB总线外设支持TrustZone安全特性
除了以上列出的组件外,还有诸如 Level 2 Cache Controller, DMA Controller, Generic Interrupt Controller等。
1、安全世界、
2、非安全世界
3、用于二者切换的Monitor Mode。
协处理器CP15的寄存器SCR(Secure Configuration Register)有一个NS位用于指示当前处理器位于哪一个世界,该寄存器在非安全世界是不能访问的。
当CPU处于Monitor Mode时,无论NS位是0还是1,处理器都是在安全世界运行代码。因此Monitor Mode下总是安全世界,但如果此时NS为1,访问CP15的其它寄存器获取到的是其在非安全世界的值。
非安全世界到Monitor模式的切换
处理器从非安全世界进入Monitor Mode的操作由系统严格控制,而且所有这些操作在Monitor Mode看来都属于异常。
从非安全世界到Monitor Mode的操作可通过以下方式触发:
软件执行SMC (Secure Monitor Call)指令
硬件异常机制的一个子集(换而` 言之,并非所有硬件异常都可以触发进入Monitor Mode),包括:
IRQ
FIQ
external Data Abort
external Prefetch Abort
Monitor Mode
Monitor Mode内执行的代码依赖于具体的实现,其功能类似于进程切换,不同的是这里是不同模式间CPU状态切换。
软件在Monitor Mode下先保存当前世界的状态,然后恢复下一个世界的状态。操作完成后以从异常返回的方式开始运行下一个世界的代码。
为什么安全模式和非安全模式不能直接切换?
非安全世界无权访问CP15的SCR寄存器,所以无法通过设置NS来直接切换到安全世界,只能先转换到Monitor Mode,再到安全世界。
如果软件运行在安全世界(非Monitor Mode)下,通过将CP15的NS位置1,安全世界可以直接跳转到非安全世界,由于此时CPU的流水线和寄存器还遗留了安全世界的数据和设置,非安全模式下的应用可以获取到这些数据,会有极大的安全风险。因此,只建议在Monitor Mode下通过设置NS位来切换到非安全模式。
综上,安全世界和非安全世界不存在直接的切换,所有切换操作都通过Monitor Mode来执行。
SGX 与ARM TrustZone(TZ)还是有一点小区别的,TZ中通过CPU划分为两个隔离环境(安全世界和正常世界),两者之间通过SMC指令通信;而SGX中一个CPU可以运行多个安全enclaves,并发执行亦可。
Trustzone默认相信SecureOS,安全世界。SGX仅相信CPU core,通过SGX指令构建enclave容器。简单比喻,TEE是个公用大保险柜,什么东西都装进去,有漏洞的app可能也进去了,而且保险柜钥匙在管理员手上,必须相信管理员。SGX每个app有自己的保险柜,钥匙在自己手上。
Trustzone需要安全OS支持。SGX不改变现有WIN开发生态,将需要保护的代码写到dll中,接口使用edl描述一下,剩下的交给intel工具。dll运行的环境也是硬件级的保护。
TrustZone被设计为在系统加电后优先获得控制权,并且拥有比主机更高的访问和控制权限,因此TrustZone比SGX更贴合可信计算3.0“主动防御体系”。
TrustZone具有对非安全世界进行监视的系统,且监控系统拥有高权限。
智能手机等移动设备包含大量个人数据。如果设备丢失或被盗,用户会关心该数据的机密性。这就是为什么最近的设备支持文件系统加密。TrustZone 可用作保护此数据的解决方案的一部分。
TPM 是焊接在主板上的分立器件。它是一种廉价(制造成本不到 1 美元)的低端设备,可通过慢速、低带宽通道 与主 CPU 进行通信。
TPM 是一种被动设备:它不监视系统,也不能停止 CPU 执行。为了让它工作,它必须被输入数据。
TPM对运行时状态和持久数据的存储有限:其非易失性存储大小约为 64KB。TPM 只能同时容纳有限数量的对象。出于这个原因,主机上的专用软件层(资源管理器)在运行时加载和卸载会话对象。
TPM 命令执行是单线程的:它一次执行一个命令。命令不能一起排队或批处理 - 每个命令必须等待当前运行的命令完成。请注意,可以取消命令执行
安全密钥生成
TPM 是一种加密设备。它可以安全地生成新的加密密钥:这些密钥仅对 TPM 可用——私钥材料永远不会以明文形式离开设备。
TPM 可以进行加密操作,例如加密和签名。TPM 可以验证新密钥,因此 TPM 在某种程度上充当证书颁发机构 (CA)。对这些密钥的信任植根于制造商或 TPM 所有者提供的主密钥。
远程系统证明
TPM 可以捕获主机系统状态:这是通过将一系列测量值存储在一组称为平台配置寄存器 (PCR) 的特殊寄存器中来完成的。TPM 可以稍后将其 PCR 值报告给远程方。它以安全的方式完成,以便远程证明者可以验证报告是新鲜的、真实的并且没有被篡改。
加密密钥
TPM 生成强大、安全的加密密钥。在密钥源自真正的随机源和大密钥空间的意义上说是强大的。在 3DES 的情况下,TPM 还会检查密钥是否为已知的弱密钥。从私钥材料永远不会以明文形式离开 TPM 安全边界的意义上说是安全的。当密钥离开 TPM 时——以便稍后加载和使用——它被 其父密钥 包装(加密)**。**
因此,密钥形成一棵树:每个密钥都由其父项包裹,一直到树的根部,其中主密钥来自固定种子. 种子存储在 TPM 的 NVDATA 中,位于保留索引下,无法从外部读取。
密钥层次Key Hierarchies
TPM 将密钥存储在四个层次结构之一中:
\1. 背书层次结构。Endorsement hierarchy.
\2. 平台层次结构Platform hierarchy.
\3. 所有者层次结构,也称为存储层次结构Owner hierarchy, also known as storage hierarchy.
\4. 空层次结构Null hierarchy.
层次结构是实体的逻辑集合:密钥和 nv 数据块。每个层次结构都有不同的种子和不同的授权策略。层次结构的不同之处在于它们的种子创建时间和谁证明了它们的主密钥。
一般来说,背书层次结构是为 TPM 制造商创建和认证的对象保留的。背书种子(eseed)是在制造时随机生成的,在设备的生命周期内永远不会改变。主背书密钥是由 TPM 制造商认证的,因为它的种子永远不会改变,它可以用来识别设备。由于每台机器只有一个 TPM 设备,因此主背书密钥也可以用作机器的身份。
平台层次结构是为构建主机平台的 OEM 创建和认证的对象保留的。平台种子 (pseed) 是在制造时随机生成的,但可以由 OEM 通过调用来更改TPM2_CC_ChangePPS
。
所有者层次结构(存储层次结构)是为我们保留的——TPM 的主要用户。当用户取得所有权时,例如,当 IT部门在网络上配置新主机时,所有者层次结构将被重置。这是通过调用来完成的 TPM2_CC_Clear
。在这个关密钥的设置步骤中,所有者应提供两个用户密钥并对其进行认证:它们构成了所有者层次结构上生成的所有密钥的信任根。
空层次结构是为临时密钥保留的。每次主机重新启动时都会重新生成空种子。
主密钥 Primary Keys
如前所述,主密钥是使用确定性密钥派生函数 (KDF) 从主种子派生的。更准确地说,KDF 将固定种子和描述其属性的密钥模板作为输入。
如果种子或模板发生变化,则会创建一个完全不同的主密钥.
模板在TPM2B_PUBLIC结构中定义。重要字段包括type* :描述这是对称密钥还是非对称密钥的类型;**objectAttributes** :描述密钥是用于加密还是签名的、**parameters** :描述密钥大小的参数;以及**unique*** 用作熵值(entropy value)。
通过更改熵字段,TPM 可以生成无限数量的给定类型的主密钥(例如 RSA-2048)。
使用该TPM2_CC_CreatePrimary命令创建主密钥。让我们在 OWNER 层次结构上创建一个 RSA-2048 密钥:
app.CreatePrimary(TPM2_RH_OWNER, TPM2_ALG_RSA,/restricted=/1, /decrypt=/1, /sign=/0, /unique=/'hello');
TPM2_CC_CreatePrimary 创建并加载TPM 的密钥:注意如何返回对象的句柄。TPM 一次只能容纳有限数量 (3) 个对象。用于TPM2_CC_FlushContext卸载对象。
主机重启后所有者的种子不会改变,因此重启后主密钥不会改变。
对象属性
对象属性位图字段(Object attributes bitmap field)是TPM2B_PUBLIC的一部分。对于我们的实验,了解以下属性很重要:
l 解密Decrypt (TPMA_OBJECT_DECRYPT)。指定加密密钥。
l 签名Sign ( TPMA_OBJECT_SIGN_ENCRYPT )。指定签名密钥。
l 受限Restricted ( TPMA_OBJECT_RESTRICTED )。将密钥限制为仅对内部 TPM 数据进行签名/加密。
层次结构(hierarchy)可以被认为具有父密钥和子密钥。父密钥保护其子密钥,当子密钥存储在 TPM 之外时提供保密性和完整性。包装其他密钥的密钥也称为存储密钥。存储密钥是受限制的加密密钥。它们不能用于一般解密,这可能会泄露孩子的秘密。
层次结构(hierarchy)顶部的最终父级是主密钥。孩子可以是存储钥匙,在这种情况下,他们也可以是父母。孩子也可以是非存储密钥,在这种情况下,它们是叶密钥:孩子但不是父母。
子密钥 Child Keys
TPM2_CC_Create使用该命令 创建非主密钥。该命令将父密钥的句柄和密钥的 TPM2B_PUBLIC 模板作为输入。
EK 保护背书层次结构上的密钥。由于其证书,它受到信任。但是,所有者层次结构中的密钥不能被信任,因为它们不受 EK 保护。
所有者有责任在所有者层次结构上提供和验证主加密密钥(这里,“所有者”是指 TPM 的最终用户 - 我们)。
Storage Rook Key (SRK) 是所有者层次结构上的主要受限加密密钥 ,从 oseed 派生。SRK 保护所有者层次结构上的密钥。它是受信任的,因为所有者在所有权时验证了密钥。
正如我们稍后将看到的,拥有一个受信任的、受限制的签名密钥对于远程系统证明很有用。因此,建议在配置期间创建和验证受限签名密钥。此受信任的签名密钥也称为证明身份密钥 (AIK)。
最好在干净的环境中执行此设置步骤 (操作系统从 CD 启动,主机未连接到网络)。
该过程包括以下步骤:
\1. 阅读并验证EK 证书。只有在您信任供应商的情况下才能继续。
\2. 使用 清除所有者层次结构TPM2_CC_Clear。
\3. TPM2_CC_CreatePrimary在所有者层次结构 ( ) 上创建一个主要的受限非对称加密密钥 。称之为*SRK*。
\4. 使用您的企业 CA 认证 SRK:使用 SRKpub 创建证书签名请求 (CSR),并要求您的内部可信 CA 对其进行签名。将证书存储在 NV 数据 ( TPM2_CC_NV_DefineSpace, TPM2_CC_NV_Write) 中。 或者,您可以将 SRK 公钥存储在远程数据库中。将来使用这个数据库来验证 SRK 的真实性。
\5. 通过将 SRK 驱逐到 NVDATA ( TPM2_CC_EvitControl) 来使 SRK 持久化。
\6. 在 *SRK* ( TPM2_CC_Create, TPM2_CC_Load) 下创建一个受限的非对称签名密钥。称之为AIK。
\7. 使用您的企业 CA 认证 AIK:使用 AIKpub 创建证书签名请求 (CSR),并要求您的内部可信 CA 对其进行签名。将证书存储在 NV 数据 ( TPM2_CC_NV_DefineSpace, TPM2_CC_NV_Write) 中。
或者,您可以将 AIK 公钥存储在远程数据库中。将来使用此数据库来验证 AIK 的真实性。
可以使用 SRK-cert 作为 AIK 的信任根,但是,拥有 AIKcert 可以简化一些工作流程。
\8. 通过将 AIK 逐出到 NVDATA ( TPM2_CC_EvitControl) 来使 AIK 持久化。
请注意,这些密钥应设置为固定(不可重复):在其模板的 objectAttributes 字段中使用 TPMA_OBJECT_FIXEDTPM和TPMA_OBJECT_FIXEDPARENT。
此时,我们有两个可以使用的可信密钥:一个用于存储(保护其他 TPM 密钥),另一个用于签署 TPM 语句。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。