基于微内核的虚拟化系统的策略P隐式证明
摘要
我们提出了一种认证机制,使远程验证者能够通过策略隐式评估证明方系统的可信性。当证明方与证明方系统中的虚拟化硬件组件交互时,TPM 2.0 将验证并强制执行这些策略。例如,当验证者读取一个虚拟化传感器设备并请求完整性保护的传感器数据(如平均温度、心跳值或异常检测得分)时,作为信任锚点的证明者的 TPM 将检查并强制执行验证者指定的策略。反过来,证明者也能够定义策略,以限制对某些硬件组件的访问,这些策略同样由 TPM 强制执行。因此,双方必须协同合作才能完成成功的认证,从而通过主要使用对称加密操作(而非开销较大的非对称加密操作,如数字签名)隐式生成对证明者可信性的可验证证明。
关键词 :远程证明 · Trusted平台模块 · Policy · 数据完整性 · Microkernel
1 引言
借助基于硬件的虚拟化技术,例如英特尔VT [12]或ARM虚拟化扩展 [3,5],将诸如Linux之类的富操作系统相互之间以及与其他系统部分隔离开来,是确保整个系统安全的有效方法。如果以微内核(例如 L4/Fiasco.OC[11,18], )作为非特权虚拟机监视器的基础,则可以进一步提高这种级别的安全性。由于微内核将所有非关键系统组件实现为用户空间任务,并严格隔离这些任务,且代码量非常小,因此位于用户空间的基于微内核的虚拟机监视器显著减小了系统的攻击面。因此,这类基于微内核的虚拟化系统甚至适用于最高安全要求的应用场景,例如移动、工业、汽车或航空电子系统。然而,由于虚拟化的富操作系统通常仍需要一定程度地访问物理硬件,因此无法完全隔离,必须由虚拟机监视器(VMM)提供
c©施普林格国际出版瑞士公司2016年 M. Bishop 和 A.C.A. Nascimento (编): ISC 2016, LNCS 9866, 第305–322页,2016年。DOI: 10.1007/978‐3‐319‐45871‐7 19
本文档由 funstory.ai 的开源 PDF 翻译库 BabelDOC v0.5.10 (http://yadt.io) 翻译,本仓库正在积极的建设当中,欢迎 star 和关注。
306 S. 瓦格纳 和 C. 埃克特
机制来使选定的硬件组件可供虚拟化系统使用。
一种使虚拟化系统直接访问物理硬件组件(如显示器或摄像头)的机制,是将该组件的物理内存地址直接映射到虚拟化系统的地址空间,从而使该虚拟化系统能够独占使用此组件。然而,并非所有组件都可以直接分配给特定的虚拟化系统,因为某些硬件组件(如物理网络接口、移动宽带调制解调器或传感器)是共享的。此外,这种简单而原始的机制无法检查、动态限制和多路复用对组件的访问。因此,硬件组件通常需要被虚拟化,这意味着访问请求(即读写操作)必须通过虚拟机监控器和实现虚拟化的设备驱动程序。
另一方面,虚拟化硬件组件(例如传感器)也带来了许多挑战。例如,虚拟化系统无法确定对组件的访问是否按请求处理,因为它无法直接访问该组件并自行发出请求。通过设备仿真技术,虚拟机监视器可以模拟一个硬件组件,特别是传感器,并在将读取操作的结果返回给虚拟化系统之前对其进行修改。
因此,与虚拟化的富操作系统交互的(远程)用户或系统需要能够验证底层系统的完整性,才能信任来自硬件组件的数据。遗憾的是,大多数现有的(远程)系统完整性验证机制,例如IBM的完整性测量架构(IMA)[14]结合可信平台模块(TPM),无法对作为虚拟机监视器的微内核‐based系统进行证明。
为克服这些挑战,我们首先提出一种基于微内核的系统架构,该架构使用 ARM 虚拟化扩展来同时运行多个富操作系统和 ARM TrustZone,并结合 TPM 2.0[17]安全地处理关键操作并存储密钥等敏感信息。我们的主要贡献是一种安全协议,该协议利用我们的系统设计在保护数据完整性的同时隐式验证系统的可信性。所提出的协议采用高效的对称加密操作,例如哈希和基于哈希的消息认证码(HMAC),并且仅在设置阶段可选地使用非对称加密操作。我们的第三项贡献是基于微内核的系统架构以及所提认证协议的原型实现。然而,由于缺乏专用的硬件TPM 2.0,该实现包含一个完全可用的模拟器,该模拟器由我们从TPM库规范[17]的公开PDF版本中提取,并通过我们已开源的 Python脚本[19]实现。
本文的其余部分结构如下。在第2节中,我们讨论相关工作,重点关注现有的远程证明机制。第3节概述了我们的场景和攻击者模型,这是我们在第4节中描述的整体系统架构设计的基础。接着在第5节中,我们提出了主要贡献,即完整性保护和基于策略的证明协议,同时
基于策略的隐式证明用于基于微内核的虚拟化系统 307
将原型实现的详细信息留到第6节讨论。7节中讨论我们协议的安全性,并在第8节总结。
2 相关工作
远程证明是一种密码学过程,用于创建可验证证明,使远程验证者能够检测证明者系统的修改,从而使证明方能够确定证明者的可信性。
根据可信计算组(TCG)规定的基于哈希的远程证明,证明方的系统会为所有相关软件组件计算静态加载时完整性度量,这些度量安全地存储在TPM的所谓平台配置寄存器(PCR)中,并可用于向远程验证者证明系统的完整性。
更准确地说,在认证启动过程中,每个引导组件都会从不可变的度量核心信任根(CRTM)开始,对下一个软件组件进行哈希运算。引导过程完成后,操作系统通过完整性验证机制(如IMA)继续对软件二进制文件进行度量。对于基于哈希的远程证明,PCR中的完整性度量由TPM签名后发送给远程验证者。凭借相应的公钥和所谓的存储度量日志(SML),远程方能够验证签名,并在签名验证成功的基础上,将SML中的条目与预期的度量值进行比对。为解决与公钥相关的隐私问题,可信计算组织(TCG)还采用了另一种称为直接匿名证明(DAA)的远程证明原语,其目标是利用零知识证明来保护证明者的隐私。
然而,由于可信计算组(TCG)规定的两种基本机制——传统的远程证明和DAA——主要仅针对软件二进制文件进行基于哈希的加载时完整性测量,其他方案(如基于属性的[13],语义[8],基于组的[1],或逻辑证明[15],)已尝试扩展和泛化认证机制。例如,基于属性的证明的核心思想是证明某些安全特性与质量,而非验证特定软件组件的基于哈希的完整性。类似地,逻辑证明基于关于软件属性的可验证陈述,这些陈述用逻辑表达。而基于组的证明则使用变色龙签名[9]来增强隐私性以及管理软件完整性的能力。
不幸的是,这些特性、品质和逻辑属性并非由TPM强制执行,而是由操作系统强制执行。而我们的认证机制基于由TPM 2.0强制执行的哈希型密码学策略。此外,我们的方法无需依赖昂贵的密码学操作(如数字签名)来为证明方系统的完整性生成可验证证明。进一步地,我们设计的远程认证机制不仅适用于基于微内核的虚拟化系统,还使验证者能够在隐式验证证明方系统可信性的同时,保护数据(例如来自虚拟化设备的数据)的完整性。
308 S. 瓦格纳 和 C. 埃克特
3 场景与攻击者模型
在本节中,我们描述了该场景,概述了完整性保护和认证协议的设置。我们还指定了攻击者模型。
3.1 数据完整性保护与认证场景
对于我们的数据完整性保护,其能够检测未经授权的修改,并隐式地证明底层系统的完整性,我们定义了一个证明者(P)和一个验证者(V)。证明者是一个基于微内核的系统,例如工业控制系统、智能手机或车辆。P配备了TPM 2.0,并能够通过基于硬件的虚拟化技术(如ARM虚拟化扩展)来虚拟化富操作系统,例如Linux或Android。由于我们假设证明者还在原生微内核任务中执行安全或安全关键型应用,这些应用必须与富操作系统(有时甚至与虚拟机监控器)严格隔离,因此证明方的系统还提供了硬件强制分离机制,例如 ARM 安全扩展,也称为TrustZone。V则是一个远程验证者,在我们的安全协议上下文中被认为是诚实且可信的。与证明者类似,验证者 V也配备了TPM 2.0,用于存储加密密钥等敏感信息。
在不失一般性的前提下,我们假设证明者是一个工业控制系统,其至少包含一个富操作系统和一组传感器,用于监控其状态、环境条件以及固定数量的连接组件。在我们的场景中,验证者可以使用证明者管理员提供的凭据登录到富操作系统,从而能够与某些传感器进行交互。然而,由于富操作系统是虚拟化的,并且设备访问必须通过由证明者控制的虚拟机监视器,因此验证者只能以一种高度受控和受限的方式访问这些传感器。结果,验证者无法确定来自虚拟化设备的数据未被篡改。例如,心跳传感器的数据可能已被证明者修改,以反映系统持续无中断或异常地运行,而实际上该系统曾一度不可用。显然,我们还必须假设,在数据被发送到验证者系统进行进一步评估的情况下,攻击者可能会试图篡改这些数据。
3.2 攻击者模型
在我们的数据完整性和远程证明场景中,对手(A)能够读取证明者 P和验证者 V之间传输的消息,只要这些消息未使用当前仍被视为安全的加密方案进行加密。如果证明者行为不诚实,则该对手也可能包括 P;此外,若数据的完整性未受到保护(例如通过消息认证码(MAC)),对手还能够篡改数据。因此,只有当攻击者获取到正确的密钥时,A才能解密加密的消息或为被修改的消息伪造正确的MAC。此外,攻击者无法逆向加密哈希函数。
P基于策略的微内核虚拟化系统隐式证明 309
此外,我们假设硬件攻击是不可行的,这与大多数远程证明协议的规定一致。特别是,集成在芯片中的安全机制(例如 ARM TrustZone)或由 TPM 提供的安全机制不会被攻击者破坏。这意味着我们假设基于硬件的安全功能(例如加密引擎或安全扩展)以及以软件实现的任何固件组件的实现是正确的。
4 基于微内核的系统架构与TPM 2.0
在本节中,我们描述了所提出的基于微内核的系统架构设计,该架构包含 TPM 2.0,并利用现代ARM片上系统(SoC)的基于硬件的虚拟化和安全机制。
顾名思义,微内核的代码大小仅相当于Linux等常规宏内核的一小部分。此外,基于微内核的系统将所有非核心系统组件(如驱动程序)实现为用户空间任务,严格隔离这些任务,并仅提供少量系统调用。因此,它们非常适合用于最安全关键和安全敏感系统。正因如此,我们采用微内核作为系统架构的基础。
如图1所示,我们的系统架构设计将安全执行环境(右侧)与非安全环境(左侧)分离。两个执行环境均包含一个基于微内核的系统,该系统至少包括位于特权级PL1+的核心组件core以及位于非特权级PL0的用户空间组件init。
通过ARM TrustZone机制可实现两个隔离执行环境的分离,该机制基本将系统组件、设备和内存分配到安全世界或非安全世界。在安全世界中,基于微内核的系统或更确切地说其TrustZone虚拟机监控器(tzvmm)负责处理所有对安全关键任务和设备(例如TPM 2.0)的请求。在非安全世界中,第二个虚拟机监控器(vmm)以类似方式处理对虚拟机监视器的调用(和陷阱),但其目标是虚拟化Linux等富操作系统。
虚拟化的富操作系统可以是传统Linux或Android,为用户提供与系统交互的常规服务。这意味着用户可以登录到富操作系统,并例如从硬件设备(如传感器)读取数据。如果该设备被虚拟化,则访问会被拦截到虚拟机监控器。
虚拟机监控器反过来会将请求转发给同样位于非安全世界的设备驱动程序,或者使用基于硬件的接口,即所谓的安全监控调用(SMC),以访问在安全世界中实现的设备驱动程序,如图1所示。如果请求由TrustZone中的虚拟机监控器处理,tzvmm会将其转发给相应的设备驱动程序。通过这种方式,像TPM 2.0这样的安全关键设备可以在多个富操作系统之间被访问和共享,同时虚拟机监控器能够在必要时监控、限制或拒绝访问。
此时必须注意到,基于硬件的最小化 TrustZone 接口 SMC,其复杂性甚至低于少量
310 S. 瓦格纳和 C. 埃克特
微内核所使用的系统调用,也是我们在系统架构中设置两个微内核的原因。这样,即使非安全世界遭到破坏,系统仍极有可能继续运行并主动恢复。假设系统架构正确实现,则对手需要成功攻击核心组件所在的安全世界(主要通过 SMC调用或陷阱),才能完全破坏系统。
然而,即使通过基于硬件的虚拟化和TrustZone等安全机制实现了资源(如内存或设备)的隔离,我们的系统架构设计也包含了TPM 2.0,用于安全地创建和存储敏感信息,特别是加密密钥。与ARM的TrustZone不同,TPM是一个专用不可编程硬件安全模块,它不仅在硬件中实现加密引擎,还能够建立信任,正是因为它能确保其固件无法被任何用户或远程攻击者轻易修改。
除了作为信任锚点外,TPM 2.0还提供了存储加密完整性度量的机制。这些度量通常在authenticated boot期间收集,当前组件会度量启动链中的下一个组件,并将哈希值扩展到某个PCR寄存器中。根据可信计算组(TCG)规定的远程证明,这些PCR寄存器的值会使用非对称密钥进行数字签名,从而生成关于系统可信性的证明。由于PCR寄存器仅在系统重置时被重置,并且只能通过新的度量值进行更新(更准确地说是扩展),因此攻击者无法在不被发现的情况下修改启动组件。此外,PCR寄存器还可用于将密钥加密绑定到特定值,这意味着该密钥只能在PCR寄存器包含指定值时才能使用。
P基于策略的微内核虚拟化系统隐式证明 311
只有当PCR中的当前值与指定值匹配时,密钥才能被使用。在TPM 2.0中,可信计算组推广了这一概念,并开发了一种称为扩展授权(EA)的机制。通过EA,如果用户能够满足某一策略,则TPM允许使用加密密钥。TPM 2.0中的策略由一个密码学哈希表示,该哈希需要匹配特定值,且可以包含例如哈希后的秘密信息、TPM内部 NV内存区域的值或PCR值。正因如此,我们采用TPM 2.0策略作为我们认证的基础。
5 基于隐式证明的数据完整性保护
在本节中,我们提出了一种数据完整性保护与认证协议。与可信计算组(TCG)所规定的传统远程证明不同,我们的协议采用高效的对称操作,而非依赖开销较大的非对称加密操作,来生成系统完整性的可验证证明。然而,作为
主要贡献,我们的隐式证明协议利用了TPM 2.0提供的Extended Authorization机制,从而支持对授权和认证策略进行灵活定义。
我们提出的协议的核心思想基于以下事实:证明者 P和验证者 V双方各自持有一个受策略保护的加密密钥。为了成功实现基于策略的证明,当 V请求完整性保护数据时,P必须满足验证者的策略,才能加载 V的密钥。因此,V的策略可能包含针对证明方系统的受信任PCR值,这意味着只有在 P的系统仍处于可信状态时,密钥才能被加载。反过来,V必须按照证明者的策略行动,从而说服 P代表 V加载完整性密钥并生成完整性保护数据。因此,P的策略可以例如规定,仅当设备已启用且访问模式符合特定条件时,才允许 V访问虚拟化硬件资源。因此,在从虚拟化设备请求完整性保护数据时,为实现成功的隐式证明,双方必须各自满足对方的策略。
在接下来的章节中,我们首先在第5.1节和5.2节中定义符号表示和加密密钥。之后,在第5.3节中说明设置阶段,然后在第5.4节中重点讨论完整性保护和认证机制。
5.1 符号表示
一般来说,哈希函数 H可以将任意长度的输入压缩为长度为 l的输出,该长度取决于特定算法,即 H:{0, 1} ∗ →{0, 1}l。密码学哈希函数是一种具有抗碰撞性和抗原像性的单向哈希函数,二者描述了额外的安全属性。
消息认证码(MAC)是一种密码学值,可根据密码学哈希函数和共享对称密钥计算得出,用于验证消息的真实性与完整性。形式上,MAC算法是一个函数,对于一个秘密密钥 K和几乎任意长度的给定输入 m,生成固定长度 l的消息摘要 d,即为MAC(K, m) = d={0, 1} l。作为基于哈希函数的MAC示例,
一种HMAC
312 S. 瓦格纳 和 C. 埃克特
基于密钥对称密钥 K,为数据 m 计算消息认证摘要HMAC(K, m)= H((K⊕opad) || H((K⊕ipad) || m)),其中 || 表示连接,⊕ 表示异或,opad 表示外填充,ipad 表示内填充。
加密哈希函数还用于在加载软件组件之前测量其完整性。我们假设基于微内核的系统的加载时完整性可以通过一组测量值充分描述,这些测量值安全地存储在TPM的PCR寄存器中。这样的一组PCR值被称为平台配置 PC:=(PCR[i1],…, PCR[ik]),其中 i ∈{0… r−1}, k ≤ r和 r是可用PCR寄存器的数量。
要将完整性度量值 µ存储在索引为 i的PCR中,TPM内的当前值会与新的度量值通过PCR Extend(PCR[i], µ) 进行组合,其定义为 PCR[i] ← H(PCR[i] || µ)。
为简化起见,我们假设基于微内核的系统的PCR值是公开的,因此验证者事先已知这些PCR值。
与完整性度量类似,策略 P表示为一个密码学哈希值,可用于授权TPM操作。例如,要使用密钥 K进行签名,初始空哈希 P0将被扩展为签名的命令码,即 Psign ← H(P0 ||TPM CC PolicyCommandCode ||TPM2 Sign)。如果TPM能够验证生成的策略哈希 Psign与分配给密钥 K的策略哈希 P′相匹配,则可根据该特定策略使用该密钥。由于多个策略也可以组合使用,例如通过 TPM2 PolicyOR,因此可以创建更大型、更复杂但依然灵活的策略。
5.2 加密密钥
对于我们的数据完整性保护和认证协议,我们假设在证明者的 TPM 中已存在一个由 TPM 主种子生成的主存储密钥KPSK以及一个存储密钥KSK。如图2所示,为简化起见,我们仅要求KSK可通过策略加载,即PKSK ← H(P0 || TPM命令码策略指令代码 ||TPM2加载)。
除了存储密钥KSK之外,证明者还需要第二个密钥 Kp,它作为完整性密钥 Kint的中间父密钥。该密钥允许基于策略导入子密钥,这一过程通过指定命令码 TPM2 Import来编码,如图2所示。与 KSK一样,该密钥也绑定到证明者的 TPM 及其专用父密钥上,这是通过 TPM 的密钥属性 fixedTPM和 fixedParent强制执行的。附加到 Kp上的第二个策略在我们的协议中用于通过将 NV 内存区域的内容绑定到加载命令上来控制对硬件设备(例如传感器)的访问。更准确地说,如果 NV1中的某一位被置位,则分配给该位的硬件组件将被启用,这是访问该组件的前提条件。在 NV2中,可以存储一个最小阈值,例如用于平均函数或异常检测得分中的传感器值数量。这样,证明方系统的管理员可以限制对设备的访问,如果存储在 NV2中的访问请求数量不满足策略规定的阈值,或者该模式表明存在恶意行为。
最后,我们指定一个密钥哈希密钥K int,用于通过HMAC对数据进行对称签名,以代表验证者保护数据完整性。
该密钥最初由验证方的TPM创建,并在我们协议的设置阶段迁移到证明方的系统中。因此,只有验证者能够定义必须满足的策略,才能按图2所示使用该密钥。
对于我们的协议,至少要求该密钥能够在当前PCR值(必须包含基于微内核的系统,即核心、初始化、tzvmm等)与可信平台配置的指定值匹配时,用于计算一个HMAC。为了简化起见,我们也为复制(这是TPM 2.0中迁移的术语)从验证方的TPM到证明者的TPM指定基于策略的授权。由于我们在复制过程中对Kint进行加密,因此可选择性地定义一个解密密钥Kdec,用于解密AES加密密钥Kaes。但请注意,此加解密步骤仅在设置阶段需要执行一次。
5.3 阶段1:设置
在我们协议的设置阶段,证明方系统的管理员首先使用tpm2NV DefineSpace在 TPM中创建两个非易失性存储区域NV1和 NV2。第一个NV位置用于启用对设备的访问,而第二个则实现更细粒度的访问控制。这两个NV区域均可通过策略 PNV Read进行读取,并与TPM CC PolicyNV一起使用。
314 S. 瓦格纳 和 C. 埃克特
在NV1中,管理员可以设置某些位以启用相应的硬件组件。例如,如果 NV1的位0分配给索引为0的设备,管理员可以将该位置为1,以启用对该设备的访问。此外,管理员可以在策略中使用NV2来指定最小粒度或阈值。例如,假设该设备是一个传感器,且验证者只能读取至少n个传感器值的平均值,则可以将NV2中的当前值与策略中指定的参考值 n进行比较。NV2还可用于存储异常检测算法的结果,该结果需要低于策略中定义的某个阈值 t,才能加载和使用密钥Kint。
在设置用于策略 Kp 的非易失性存储位置后,使用 KPSK 的策略加载存储密钥 KSK。然后,根据前一节中描述的策略P创建 Kp,该策略
PKp= H(Pbase || TPM CC PolicyOR || PImport || PLoad NVs), (1)
其中
PImport= H(P0 || TPM CC PolicyCommandCode|| TPM CC Import),
PLoad NVs= H(PNVs || TPM CC PolicyCommandCode|| TPM CC Load), (2)
且 Pbase为 PImport或 PLoad NVs。
值 PNVs 是根据以下方程计算得出的,这些方程在 NV 位置初始化期间使用生成的加密哈希值作为 NV1 和 NV2 的相应名称。
PNV1= H(P0 || TPM CC PolicyNV || args|| nvIndex → Name) (3)
PNVs= H(PNV1 || TPM CC PolicyNV || args|| nvIndex → Name) (4) with
args= H(operandB.buffer|| offset || operation)
其中operandB是用于比较的值,off set是NV数据的起始值,operation是比较类型。对于NV1,操作为(A&B)= B,用于检查 B中的所有位是否在 A中被置位;而对于NV2,操作为 A ≥ B,允许证明者指定一个最小值。
一旦策略 PKp 成功生成,将使用TPM2创建Kp密钥,该操作会计算出一个新的(普通)密钥。对于此命令,公共模板指定了由TPM生成的密钥属性,例如密钥类型和关联策略。该命令返回公钥、加密的私钥以及有关创建的数据,这些数据可以被认证。
在创建中间父密钥Kp时,可以在存储密钥KSK仍被加载的情况下,选择使用TPM2创建生成一个非对称解密密钥对Kdec。与Kp一样,该密钥也附带了一个组合策略,允许加载和解密:
PKdec = H(Pbase || TPM CC PolicyOR || PLoad|| PDecrypt) , (5)
基于策略的隐式证明用于基于微内核的虚拟化系统 315
其中
PLoad= H(P0 || TPM CC PolicyCommandCode|| TPM CC Load),
PDecrypt= H(P0 || TPM CC PolicyCommandCode|| TPM CC Decrypt),
且 Pbase是 PLoad或 PDecrypt。
如上一节所述,该非对称密钥仅用于安全地传输一个AES密钥,该AES密钥用于加密 V的完整性密钥Kint,从验证者传输到证明者。此可选步骤仅执行一次,因此对我们的协议没有显著影响。
在验证者系统上,V在设置过程中生成密钥化哈希密钥 Kint。该密钥是一个对称签名密钥,可以迁移到新的TPM上(fixedTPM为CLEAR),并且在密码学上绑定到证明者基于微内核的系统的完整性度量。因此,只有当PCR寄存器的当前值与验证者指定的值匹配时,该密钥才能被加载。该密钥的策略——为了简化起见——允许在没有强身份验证的情况下进行复制,其计算方式如下
PKint= H(Pbase || TPM CC PolicyOR || PDup || PPCR HMAC), (6) with
PDup= H(P0 || TPM CC PolicyCommandCode|| TPM CC Duplicate)
且 Pbase为 PDup或 PPCR HMAC。该值 PPCR HMAC则由TPM计算得出
PPCR= H(P0 || TPM CC PolicyPCR || pcrs|| digestTPM)
PPCR HMAC= H(PPCR || TPM CC PolicyCC|| TPM CC HMAC Start)
其中pcrs是指定对应于PCR寄存器的位的结构,而digestTPM是由验证者使用所谓的试运行会话提供的所选PCR寄存器的摘要。此类会话允许指定预期的PCR值,而在非试运行会话中,TPM将使用内部PCR值来计算摘要。
一旦策略 PKint 成功生成,便可使用TPM2创建命令来创建密钥Kint。同样,可在公共模板中指定策略和密钥类型(键控哈希密钥),TPM将根据该公共模板相应地创建密钥。为了将键控哈希密钥Kint复制或迁移到证明者,TPM会将该密钥加密绑定到其新的父密钥Kp上,而该父密钥的完整性和真实性可在Kp创建时通过证明者的TPM生成的认证创建数据进行验证。在将Kint实际复制到证明方的系统时,验证者运行TPM2复制命令,并以可选的AES加密密钥和存储密钥Kp的公有部分作为输入。需要注意的是,由于Kp的属性 fixedTPM被设置,这隐式地也将复制操作限制在证明者的TPM上。TPM2复制的结果是一个AES加密的密钥结构,其中包含导入所需的全部信息
316 S. 瓦格纳 和 C. 埃克特
将密钥迁移到目标TPM。为了完成Kint的迁移,使用Kdec的公有部分加密 AES密钥Kaes,并与已加密的Kint一起发送给证明者。
在证明方的系统上,使用Kdec的私有部分解密 AES 加密密钥,并进而用于解密Kint,同时将其导入到其新父密钥Kp中。请注意,由于所有这些命令 tpm2 Duplicate、TPM2 解密和TPM2导入都是其各自密钥策略的一部分,因此该过程不需要管理员进行任何交互式授权。
5.4 阶段2:基于策略P的认证实现数据完整性保护
在本节中,我们描述了我们的数据完整性保护和认证协议,该协议在保护来自虚拟化设备的数据完整性的同时,隐式地创建了可验证证明,以证明 P的系统仍处于可信状态。
要从由基于微内核的系统虚拟化的设备(例如传感器)读取数据,验证者 V首先通过富操作系统提供的机制(例如ioctl)配置该设备。此配置包括设置粒度或阈值 n以及一个随机数V。然而,由于证明者 P不允许富操作系统的内核或设备驱动程序直接配置设备,该操作会被拦截并传递给非安全世界中的虚拟机监视器,如图3顶部虚线上方所示。虚拟机监视器随后会评估该配置——特别是粒度的值 n——该值可用于平均函数,或仅用于限制对硬件设备的访问。
如果配置有效且符合证明者管理员设定的标准,虚拟机监视器将请求转发至在安全世界中实现的安全设备驱动程序,该驱动程序能够配置物理硬件设备。同时,TrustZone中的虚拟机监控器将粒度 n存储在NV2中,这是使用密钥Kp的关键步骤,也是假设会在PCR寄存器中反映出来的tzvmm正确行为的一部分。
配置完成后,富操作系统中的客户端应用程序可以读取设备的数据,该操作同样会被拦截并转发到安全世界中的安全设备驱动程序。对于传感器,安全世界中的设备驱动程序随后根据粒度 n读取必要的传感器值,并例如计算平均值。为了保护结果的完整性,TrustZone 虚拟机监控器会请求 TPM 计算一个 HMAC mac
mac = HMAC(Kint, (nonceV || data)). (7)
只有在加载了密钥哈希密钥Kint,并且基于微内核的系统的PCR寄存器(即核心、初始化、tzvmm、虚拟机监控器等)与指定值匹配时,这才有可能实现。Kint 只有在设备于 NV1中启用,并且存储在 NV2中的粒度 n高于证明者管理员在策略 PNV1、PNVs和 PKp 中指定的阈值的情况下,才能在父密钥Kp下加载。
因此,证明者需要在TPM内部的策略会话中重新创建策略 PKp(参见公式1)以能够代表验证者加载密钥Kint。更准确地说,P必须计算 PLoad NVs(参见公式2),而这仅
如果NV索引中的值满足如下计算的相应策略P,则是可能的:
P′_NV1 = H(P0 || TPM_CC_PolicyNV || args || nvIndex → Name)
其中:
args = H(operandB.buffer || offset || operation)
,其中operandB是NV1中的值,offset为起始值(0),operation为比较类型,即在本例中对于NV1为
(A & B) = B
。该策略用于验证设备是否已启用。如果比较结果为真,则
P′_NV1
等于
PNV1
,表示设备已启用。随后可计算策略
P′_NVs
。
P′_NVs = H(P′_NV1 || TPM_CC_PolicyNV || args || nvIndex → Name)
其中:
args = H(operandB.buffer || offset || operation)
,其中operandB是NV2中的值 n,offset是起始值(0),而operation是对
A ≥ B
的比较,即
n ≥ n_PNVs
。该策略检查粒度或阈值 n高于策略中指定的值 PNVs。同样,如果比较结果为真,则
P′_NVs
等于
PNVs
且设备访问模式被接受。根据
P′_NVs
,策略
P′_Load_NVs
可计算为
P′_Load_NVs = H(P′_NVs || TPM_CC_PolicyCommandCode || TPM_CC_Load).
如果
P′_Load_NVs
等于
PLoad_NVs
,此策略可满足 OR‐策略
PKp
,如(1)中所规定,从而允许证明者加载Kint。证明者只需将
P′_Load_NVs
与预先计算的
PImport
值通过 TPM2_PolicyOR 组合,生成
PK′p
。通过指定使用新生成的策略
PK′p
的会话(该策略应等于
PKp
),证明者便能代表验证者加载密钥 Kint。
为了使用Kint保护设备数据的完整性并隐式验证系统的完整性,证明者只需重新创建策略
PKint
。通过在TPM内部创建一个新的策略会话并使用TPM2_PolicyPCR,证明者首先创建
PPCR
作为
P′_PCR = H(P0 || TPM_CC_PolicyPCR || pcrs || digestTPM).
对于该策略,必须指定基于微内核的系统的PCR寄存器,这些寄存器通常存储在较低编号的PCR寄存器中。我们假设证明者和验证者在PCR寄存器的选择上达成一致,因为双方都希望认证成功。然后,策略P在tpm2的 PolicyCommandCode中用于计算
P′_PCR_HMAC
,并将其与预计算值
PDup
结合以生成
P′_Kint
:
P′_PCR_HMAC = H(P′_PCR || TPM_CC_PolicyCC || TPM_CC_HMAC_Start)
P′_Kint = H(P′_PCR_HMAC || TPM_CC_PolicyOR || PDup || P′_PCR_HMAC).
如果
P′_Kint
等于
PKint
,则该策略最终可用于创建HMAC
mac
,其作用是对
data
和
nonceV
进行计算,以证明新鲜性,如(7)中所述。
data
和HMAC
mac
随后被返回到富操作系统。受HMAC保护的
data
可被传输至验证者系统,在该系统中可使用验证者的Kint生成新的HMAC
mac′
mac′ = HMAC(Kint, (nonceV || data)). (8)
如果新生成的HMAC
mac′
与来自证明者的HMAC
mac
相匹配,并且
nonceV
是预期的随机数,那么验证者不仅知道数据未被篡改,还知道证明方的系统仍然是可信的。
6 实现
在本节中,我们介绍了在Arndale开发板上实现的概念验证实现的详细信息。该开发板是一种所谓的单板计算机,配备了一个Exynos 5250 SoC,其包含一个 Cortex-A15MPCore[4],支持ARM虚拟化和安全扩展。
P基于策略的微内核虚拟化系统隐式证明 319
我们原型的主要组件包括一个在TrustZone中的基于微内核的系统,该系统将TPM 2.0模拟器(tpm2sim)作为原生微内核任务运行;以及一个位于非安全世界中的类似系统,该系统充当虚拟机监视器并虚拟化一个富操作系统。
在我们的基于微内核的系统中,我们采用了Genode[10]base-hw项目的裸机内核,该内核将 Genode的 core 组件与一个小型内核库相结合,代码规模约为17千行代码(KLOC),并支持TrustZone以及虚拟化功能。在微内核之上,我们使用了常规的 Genode用户态组件,例如大小约为3 KLOC 的 init,以及运行在非安全世界的虚拟机监控器vmm和运行在安全世界的tzvmm。对于我们的协议,我们主要改进了捕获机制和世界切换 机制,以实现能够向非安全世界中的虚拟机监控器以及TrustZone中的虚拟机监控器传输数据。
在安全世界中,我们扩展了虚拟机监控器tzvmm,以处理来自非安全世界的请求,并能够执行相应的TPM命令。由于我们在开始实现时没有硬件TPM 2.0,因此编写了一个Python脚本,从公开的TPM 2.0库规范PDF版本中提取出一个可用的模拟器,并已将其开源。然而,由于该规范的代码主要是为 Windows编写的,我们必须将代码移植到Genode上,以便能够将模拟器作为原生微内核任务运行。这包括对随机数生成、NV内存子系统以及通信机制的修改,其中通信原本基于套接字,在我们的Genode移植版本中改用进程间通信 (IPC)并通过共享内存区域传递命令和响应。
对于我们的富操作系统(即未经修改的传统 Linux 4.0 内核)并带有 BusyBox[2],我们创建了一个设备客户端应用和一个内核模块,以实现硬件组件的设备驱动程序。在我们的原型中,该设备驱动程序通常会直接配置和访问硬件组件,但被拦截至非安全世界的虚拟机监控器。为了能够将数据从富操作系统传输到虚拟机监控器,我们添加了
| 表1. 相关原生组件的代码大小(使用 cloc [7] 计算) |
|---|
| 组件 |
| ------------- |
| core |
| init |
| vmm |
| tzvmm |
| tpm2sim |
一种内存陷阱,用于虚拟机监视器配置,并额外实现了一种基于SMC的 World Switch,该机制使用共享内存位置在TrustZone之间传输数据。
为了使我们的原型实现在整体上更具可比性,对现有 Genode组件(例如 core、tzvmm 或 vmm)所做的修改,每个组件仅增加了数百行代码,如表1所示。其原因在于,协议的大部分功能由我们从规范文档中提取出的 TPM 2.0 模拟器处理,该模拟器约有 40 KLOC,以及位于安全世界和 非安全世界中的虚拟机监控器。系统的其余部分使用了进程间通信和共享内存等机制,这些机制已经是Genode提供的基于微内核系统的一部分。
7 安全讨论
在本节安全讨论中,我们将分析该协议的关键安全方面。由于我们提出的协议将数据访问与完整性保护结合到了隐式证明中,因此我们首先关注从证明者传输到验证者的数据的完整性。之后,我们将详细讨论基于策略的隐式证明机制的安全性。
为了保护完整性,证明者的 TPM 使用共享的 HMAC 密钥Kint 对数据(例如来自传感器的数据)计算消息认证码。该密钥由验证者创建并控制,在设置阶段从验证方的TPM加密并迁移到证明者的 TPM 中,并且只能在相应的 TPM 内部使用。因此,攻击者无法轻易伪造经过未授权修改的数据的正确 HMAC,因为它无法截获该 HMAC 密钥、解密并在任意 TPM 中使用它。此外,请注意,如果验证者为每个证明者创建独立的密钥,则证明者的身份会隐式地包含在 HMAC 中。更准确地说,由于为特定证明者创建的 HMAC 密钥在复制时指定了该证明者的公钥Kp,因此该 HMAC 密钥在密码学上与该证明者及其 TPM 的身份绑定。类似地,复制过程中使用的 AES 加密密钥也在密码学上绑定到证明者的公钥Kdec,该公钥固定于证明者的 TPM,因此无法迁移到任意 TPM。
此外,我们的协议包含一个用于保证新鲜性的随机数,验证者必须检查该随机数,以确保HMAC是针对最近的请求生成的。对于对手而言,这消除了重放旧数据的可能性,这些旧数据虽然受到正确HMAC的保护,但其内容可能已不再有效。这对于诸如心跳传感器之类的设备尤其重要,因为验证者必须能够检测到重放攻击,即攻击者(或甚至是证明者)可能试图让验证者相信系统仍在正常运行,没有任何停机或异常。
为了代表验证者生成正确的HMAC,证明者需要加载用于认证的HMAC密钥 Kint。在我们的认证机制中,验证者创建并控制密钥 Kint。
P基于策略的微内核虚拟化系统隐式证明 321
这意味着验证者能够定义策略,证明者必须满足这些策略。这使得验证者可以指定确切的PCR值,我们假设这些值反映了一种已知且可信的平台配置,特别是安全世界和非安全世界中基于微内核的系统的配置。由于密钥的认证值(authValue)仅为验证者所知,证明者之后无法更改此策略。然而,证明者能够为其父密钥Kp定义策略,从而使其能够限制对某些数据源的访问。
在认证过程中,首先会评估证明方的策略。如果这些策略无法满足,验证者将无法访问设备,从而使得证明者能够有效限制对设备的访问。然而,如果证明方的策略可以被满足,则在计算设备数据的HMAC之前,会进一步评估验证者定义的策略,这些策略至少包括一组可信的PCR值。需要注意的是,此时策略并非由操作系统进行验证,而这通常是基于策略的授权方案中的常见做法。
在我们的协议中,策略是由TPM进行验证的,这也使得执行点移入了TPM内部。因此,只有当TPM确保所有策略均被满足时,认证才能成功。例如,这意味着证明方的系统必须处于由PCR寄存器所反映的可信状态。如果证明者或任何攻击者修改了系统,则验证者的最终策略将无法满足,证明者也就无法代表验证者加载HMAC密钥Kint。结果,证明者无法保护数据的完整性,认证最终失败,因为验证者无法收到一个新鲜且有效的HMAC。
8 结论
在本文中,我们提出了一种基于策略的隐式证明协议,该协议不依赖于远程证明中传统所需的昂贵非对称加密操作。相反,我们的认证机制主要使用基于哈希的消息认证码以及由TPM强制执行的策略。具体而言,我们的基于策略的方法使验证者能够创建一个用于完整性保护的密钥,并将指定可信系统特性的策略加密绑定到该密钥上。为了成功完成认证,证明者需要使用该密钥来保护来自虚拟化硬件组件(例如传感器)的请求数据的完整性。因此,每当验证者访问虚拟化设备且所请求的数据受到已绑定至认证策略的密钥保护时,验证者即可隐式评估证明方系统的可信性。从而,我们的方法使验证者不仅能够确保从虚拟化设备请求的数据未被篡改,还能隐式验证证明方系统的完整性和可信性。
275

被折叠的 条评论
为什么被折叠?



