TSS为上层应用调用TPM密码资源提供了多层接口,开发者可以根据自己的需要,按照规范要求调用这些接口来构建可信应用。但是,TSS作为一个控制TPM密码资源的微型操作系统,它需要通过对各种密码资源进行命名、定位、控制和调度,经过多年的演化,形成了一系列可信计算中独特的概念:实体(Entity)、命名(Name)、组织架构(Hierarchy)、索引(Index)、授权(Authorization)、会话(Session)、上下文(Context)。这些概念本质上都是从安全和效率的角度出发,以密钥为基础构建的一个复杂安全系统。
一个TPM资源实体是在TPM内部可以通过句柄(handle)直接引用的内容。实体这个概念范围比较广,它更像是对TPM中出现的各种抽象概念的一个定义,比如TPM中的安全机制和业务会话都可被定义成实体。常见的资源实体类型包括:
组织架构,字典攻击锁定机制,和PCR
永久实体指其句柄由TPM规范定义好,而且这些句柄不能被创建和删除。在TPM1.2中,PCR及其所有者是唯一的永久实体;根存储密钥(SRK)有固定的handle,但是它不是永久实体。在TPM2.0中,有更多的永久实体类型:三个固定的组织架构,一个临时组织架构,字典攻击锁定复位,保留的句柄,明文口令授权会话,和平台组织架构的NV开关等。
固定的组织架构。TPM2.0有三个固定的组织架构(平台,存储,背书),每一个架构都通过固定的handle来访问
TPM_RH_PLATFORM (0x4000000C)
TPM_RH_OWNER(0x40000001)
TPM_RH_ENDORSEMENT(0x4000000B)
访问固定组织架构需要被授权,它们每一个都有一个授权和访问策略。经过各自管理员的授权以后就可改变相应的组织架构(管理员被定义为知道相应组织架构)。组织架构的授权值和访问策略可以改变,但是不论我们如何引用一个组织架构,都是指向的同一个TPM资源实体。
固定的组织架构永远不能被删除,但是它们可以被自己的管理员或者平台管理员关闭。这三种组织架构可以包含相关的密钥链和数据,清除组织架构就能清除其中的密钥和 数据。
TPM2.0有一个叫做NULL的临时组织架构,它通过一个固定的handle来引用:TPM_RH_NULL(0x40000007)。这是一个非常特殊的组织架构,当TPM被用作密码协处理器时(向主机提供高效的密码运算服务,但是并不是可信服务),会利用到这个临时组织架构。临时组织的授权值和policy都是空的。
与固定组织架构类似,临时组织架构本身也是永久存在的,它不能被删除,但是和固定组织架构不同的是,它在TPM的每个加电周期里会被自动清除。有点类似于计算机内存中的固定系统数据。
字典攻击锁定机制有一个固定的句柄:TPM_RH_LOCKOUT(0x4000000A)。它同样有一个授权和policy。和之前介绍的三个固定组织架构一样,它的授权可以被自身的管理员修改。但是它是一个不包含密钥和对象的组织架构。当字典攻击触发锁定时,这个机制用于复位。它还可以用于清除TPM_RM_OWNER组织架构。通常情况下这个复位机制充当TPM存储组织架构的IT管理员。
示例:TPM可以被配置成输入口令失败5次之后将锁定这个用户24小时。锁定期间所有受到字典攻击保护的资源都不能被授权。用户需要让IT管理员相信这个锁定不是因为攻击,仅仅是因为密码输入错误。管理可以使用锁定授权复位失败计数器,这样一来用户就不需要等待24小时。
TPM拥有大量的PCR,这些PCR可以通过索引来访问。根据特定平台可信计算规范的要求,PCR可能和一个或多种哈希算法相关。PCR也拥有授权值和策略。根据这些授权值和策略,可以改写PCR中存储的值。
授权值和策略可以用于通过PCR扩展(extend)来改变PCR的值。读取PCR的值不需要任何授权。PC客户端平台规定至少要有24个PCR。但是强制规定需要有一个PCR库(bank),PCR库指的是拥有相同哈希算法的一组PCR。这个PCR库可以在系统启动时被配置为使用SHA-1或者SHA-256算法。
由于PCR是永久实体,所以不存在删除和创建PCR的命令,用户只能改变PCR的值和属性。
口令授权会话:
TPM有一个会话也是永久性的,它就是口令授权会话,其句柄为TPM_RS_PW(0x40000009),用户可以使用这个句柄来进行对明文口令的访问授权。
平台NV访问开关:
NV索引:
对象:
非持续的实体:
一个非持续的实体会在TPM一个上电周期内清除。尽管可以通过TPM2_ContextSave来保存一个持续实体,但是TPM的密码学机制不允许重新上电之后加载之前保存的内容,这样就保证了它不断变化的特点。这种非持续的实体同样也被分类:
与非持续实体相对应的是持续性实体,持续性实体会在TPM的上电周期之间保存。
持续性的实体:
一个持续性的实体就是一个组织架构的所有者要求TPM在上电周期之间保留在TPM中的对象。它与永久实体的不同之处是相关组织架构的拥有者可以清除持续性实体。因为TPM的持续性内存空间有限,所以我们应该节约使用持续性实体。
应用案例1:VPN密钥访问,在系统启动的早期阶段访问VPN时需要一个签名密钥。然而这个时候硬盘并不可用。如果应用将密钥保存在TPM的持续性存储空间内,系统在早期启动阶段可以立即使用密钥做密码学操作。
应用案例2:主密钥优化 一个主存储密钥通常作为一个密钥架构的根节点。密钥生成是密码运算中最为耗时的操作。当创建一个密钥之后把它存储到TPM的持续性空间中,这样就可以避免每次启动都重新生成密钥。主板制造企业通常会为TPM配置一个受限制的签名密钥。这个密钥用于标识这个平台的身份。如果主板损坏,然后TPM被替换到其他主板上,那么密钥将不能被加载使用(因为这里认为默认情况下密钥存储在与主板连接的磁盘上)。同时,一个企业的IT部门也希望给备用主板配置新的签名密钥。但是因为一个单纯的主板并没有硬盘,所以也没有办法存储密钥。这时IT部门可以将生成的密钥存储在TPM的持续性空间里,这要以来即使主板损坏了,TPM持续性空间存储的密钥仍然可以在替换的主板上使用。通常情况下,主存储密钥比如SRK,受限的主签名密钥比如身份认证密钥AIK,以及背书密钥是TPM中仅有的可持续性实体。
实体名称:
实体的名称是TPM2.0的一个新概念,它主要用于解决TPM1.2规范中出现的问题。极端严苛的安全分析表明,攻击者有可能在数据被传送到TPM的过程中截获这些数据。TPM需要阻止通过这种攻击篡改数据。但是TPM的存储资源有限,所以它允许一个密钥管理器在必要的时候将密钥加载到TPM或者由TPM导出。当密钥被加载到TPM之后,密钥就可以通过句柄来访问,这个句柄就是密钥所加载到的内存的速记符。因为应用软件可能不知道密钥管理器为了腾出额外空间将密钥的位置改变,所以密钥的handle也就没有防止修改的保护机制,并且恶意软件可以修改发送到TPM的数据来非法访问一个句柄指向的位置。
实体名称的作用:
通常情况下,上面描述的问题并不严重。但是如果用户将两个以上的密钥设置相同的口令,那么有可能通过修改句柄来非法访问另外一个具有相同口令的密钥。虽然在实际中很难实现,但是存在理论上的可能,为安全起见,TPM规范的制定者决定给每一个TPM实体赋予一个全局唯一的名字,比如当使用某个实体的进行HMAC授权计算时,就可以把实体的名称传给HMAC计算命令。这样一来,即使句柄发生变化也没有问题,因为实体的名称唯一而且不会变化。
有了实体名称后,在使用TPM命令进行HMAC授权时,会对TPM命令参数进行哈希,然后还会在计算中隐式地加上句柄相关的实体名称,即使命令参数中不包含实体的名称也是如此。在这种情况下,攻击者只能修改实体的句柄,但是不能修改实体的名称,因为修改会导致HMAC授权失败。
名称是一个TPM实体唯一的身份标示。对于永久性的实体来说(如PCR和组织架构),因为他们的句柄永远不会变,所以句柄就可以作为它们的名称。但是对于其他的实体(如NV索引和加载的对象)来说,它们的名称实际上是他们各自的公开数据的哈希值。TPM设备本身和API调用者在授权时会独立地计算实体的名称。
安全使用实体名称规则:
基于安全的考虑,在创建一个实体时就计算它的名称并合理存储是非常重要的。一种非常容易受到攻击的实现是提供一个由handle产生名称的函数,这个函数用handle作为输入,然后通过handle引用相关实体的公开数据并计算名称。这种做法将完全破坏使用名称来做HMAC运算的初衷。因为handle有可能被篡改,这样一来计算出的名称就有可能不是授权者预期的名称。
防止攻击者读取秘密信息:
用户可能定义一个普通的索引用于存储秘密信息。索引的policy保证只有用户自己可以读取秘密信息。然而在写入秘密信息之前,攻击者可能删除并使用不同的policy重新创建这个索引,这个policy允许攻击者可以读取索引位置的秘密信息。由于索引名称是通过索引公开部分的哈希计算出来的,所以攻击者最终会因为索引名称改变而授权失败。当用户试图去向新创建的索引位置写入秘密信息时也会授权失败,因为“事先通过哈希计算好的名称”将会用于写入命令的参数哈希值计算。暂时性和持续性实体的名称同样也是由其公共区域的摘要计算而来。实体的公共区域因类型不同而不同。
方便TPM密钥的安全管理:
当用户加载一个密钥时会收到TPM返回的handle。用户申请这个密钥的授权时会计算命令参数的HMAC值,HMAC值会隐式地包含密钥的名称(前文已经说过)。资源管理器可能在用户不知情的情况下将密钥导出,然后又重新加载到TPM中。需要知道的是,密钥重新加载到TPM后handle就会发生变化。资源管理器会将用户的handle替换成新的handle。这时授权仍然能够成功的原因是授权计算时并没有包含handle,而是名称。
防止攻击者通过handle替换密钥:
用户重新加载一个密钥后会收到一个handle。尽管攻击者可能通过使用相同的handle来替换用户的密钥,但是因为密钥的授权需要正确的名称,显然攻击者的密钥计算出的名称和原始的密钥不相同,所以攻击会因为HMAC授权不通过而失败。
总结:
TPM中的实体就是可以通过handle引用的TPM资源。永久实体在TPM的规范中具有固定的handle值,不但其handle不能被修改,而且自身也不能被删除或者重新创建。持续性实体可以通过用户选定的handle删除或者创建,它们能够在TPM上电周期之间保持,而非持续性实体则在TPM上电周期中被清除。对象是隶属于某一个组织架构下得实体,它们可能有一个私有区域,它们可以是易变的也可以被设置成持续性的。当对象被设置成可持续性时,它们就称作持续性实体。
一个实体的名称是实体唯一的身份标识。因为资源管理器在将实体换入换出TPM时,实体的handle会发生变化,所以实体的授权使用名称而非handle。
一个组织架构由一组相关的实体构成,它们被当作一个组来管理。这些实体包括永久对象(组织架构的handle),树根节点密钥。NV索引隶属于一个组织架构,但是不在树型组织中。除了其中的永久性实体,其他实体可以作为一个组被整体删除。
一个组织架构的密码学根节点是一个密钥种子,这个密钥种子是在TPM内部生成的一个很大的随机数,并且不会暴露在TPM安全边界之外。TPM使用这个种子来生成主要的密钥比如根存储密钥。作为组织架构根节点的密钥用于加密保护它们的子节点密钥。
TPM1.2只有一个组织架构,它代表所有者授权和根存储密钥。1.2版本的规范中只允许有一个SRK,它一直是一个存储密钥,并且是这个唯一组织架构的根节点。SRK是TPM在内部随机产生的,它一旦被擦除后就不能被重新产生。SRK也不能被换出TPM之外。子密钥可以被创建并使用SRK加密,这些SRK的子密钥可以用于加密它们自己的子密钥。但是总体上来说,整个密钥的组织架构都在所有者的控制下。这最终的导致TPM1.2只能有一个管理员。
TPM2.0对持续性组织架构进行了扩充,以支持以下应用场景:
将TPM用作一个密码协处理器。
开关TPM的部分功能。
隔离隐私敏感和隐私不敏感的应用。
这三种组织架构有如下的共同特性:
每一个组织架构都有一个授权值和policy。
每一个组织架构都有一个开关标志。
每一个组织架构都有一个用于派生密钥和数据对象的种子。
每一个组织架构都有可以包含子密钥的主要密钥。
TPM2.0规范增加了更多的灵活性。首先,组织架构主密钥不仅仅用于存储。它们还可以用作签名密钥。其次,主密钥不仅限于一个(理论上是无限多个),并且密钥使用的算法也多种多样(RSA,ECC,SHA-1,SHA-256)。第三,因为可以存在多个主密钥,所以不可能将它们全部存储在TPM内部。因此,与TPM1.2的SRK不同的是,主密钥是由秘密种子派生而来的。派生的过程是可重复的:也即相同的种子和密钥属性总是产生相同的密钥。除了将所有的主密钥存储起来,还可以选择需要的时候重新生成。所以本质上来说,种子是密码学的根。一个主密钥可以被换出TPM,保存上下文,并且还可以在一个上电周期内被重新加载,这样一来就可以省去重新生成密钥的时间。
各个组织架构有自己独立的授权控制(口令和policy),所以它们自然就可以有不同的管理员。TCG选择这三种组织架构,以及它们略有不同的操作是为了满足不同的应用场景,这个场景在组织架构的名字上也有所体现。
平台组织架构被设计成由平台厂商控制,平台厂商的控制体现在平台上的系统启动早期运行的代码。平台组织架构是TPM2.0中的新概念。在TPM1.2中,平台固件不能确保TPM已经被打开了,平台固件开发者就不能借助TPM来完成一些安全相关的任务。
平台组织架构在三个可持续性组织架构中的独有特性是,它在平台启动时就可以使用了,授权值被设置成空,让平台固件生成一个自己的授权值(policy可选)。与其他组织架构要求用户输入授权值不同的是,平台授权值是平台固件自己设置的。因此不需要将授权值存储到一个地方,代码本身就是授权值。
因为平台组织架构有它自己的使能开关标志,所以平台固件可以决定何时使能和失能这个组织架构。这样以来就可以满足平台固件和操作系统的独特的使用需求。
存储组织架构被设计用于平台的所有者:企业IT组织或者个人终端用户。这个存储组织架构与TPM1.2中的是相同的。它有一个所有者policy和授权值,这两者是持续性的。这样设计的原因是它们被设置之后很少发生变化。
平台所有者可以关闭这个组织架构,并且不影响平台组织架构。这样一来即使平台所有者关闭了这个组织架构,平台固件仍可以照常使用TPM。但在TPM1.2中只有一个组织架构,关闭它就等于关掉整个TPM。与之类似的是,这个组织架构可以在不影响其他组织架构的情况下被清除(修改种子,删除持续性对象),存储组织架构主要用于非隐私相关的操作。
背书组织架构是一个隐私树,用户在处理与隐私相关的任务时应该使用它。TPM和平台厂商可以认证这个组织架构下的主密钥是否受控于一个真实平台上的一个真实TPM设备。在TPM1.2中,一个主密钥可以是一个加密密钥,并且证书可以通过TPM2_ActivateCredential创建,TPM2.0有与之相同的身份激活命令。与TPM1.2不同的是,一个主密钥也可以当作一个签名密钥。创建和认证签名密钥是隐私相关的操作,因为它允许和一个独立唯一的TPM中的密钥相关。因为背书组织架构的目的是用于隐私相关的操作,它的使能开关位,policy,授权值也是独立于其他的组织架构的。它们受控于隐私管理员,当然这个管理员也有可能是终端用户。一个终端用户可以关闭背书组织架构,同时不影响TPM应用使用存储组织架构,平台软件也可以继续使用TPM。
隐私:
确定平台的真实身份:
激活证书:
TPM并不强制使用某一个证书格式,但是应该使用类似于X.509证书格式,证书包含证书提供者和密钥属性相关的信息。但是TCG的这个认证的过程有以下多个目标:
主密钥是一个签名密钥:
如果一个主密钥是一个签名密钥,并且直接用于认证其他签名密钥,前面提到的关联操作就很简单,因为所有的签名都聚合到了一个证书上。可以看证书链的认证者就可以证明这个认证来自一个真实的TPM。证书链表明这个密钥是固定在一个特定的TPM设备中。正因为如此,背书组织架构下的主密钥通常是一个加密密钥而不是签名密钥。
主密钥是一个加密密钥:
如果主密钥是一个加密密钥,那生成子密钥证书过程就相对比较复杂,这个过程叫做证书激活。证书授权中心又被称作隐私保护CA,因为它是受信任的,它不会泄露任何跟它所认证密钥相关的信息。
证书提供者生成证书:
证书提供者安全发送证书:
TPM解密证书:
在TPM之外,用户可以使用这个秘密信息按照协商好的方法解密证书。最简单的情况是,把秘密消息当作一个对称解密密钥直接解密证书。
以上的协议使证书提供者相信只有满足以下条件时才能恢复证书:
TPM隐私保护的设计要点:
隐私保护案例:检测两次可信声明之间的重启
一个认证服务器每隔一段时间就会轮询可信平台机器,用于验证PCR没有变化,或者验证新的PCR值是否可信。当可信平台重启时,这种认证可能会存在问题。在TPM1.2中,当可信平台已经进入到一个不可信的状态然后又重新启动,这时认证服务器没办法检测到重启,也就无法准确判断平台的可信性。在TPM2.0中,认证需要的数据中包含了启动次数信息。在这个过程中,需要混淆敏感信息,同时还要确保能够检测到重启次数,从而确定是否发生了重启。
与三个持续性的组织架构相对应的是易变组织架构,叫做空组织架构。空组织架构与三个持续性的组织架构类似。它也可以拥有主密钥,并由主密钥派生子密钥。
它的几个不同的属性如下:
空组织架构下的基本密码运算:
在空组织架构下,TPM可以用作一个秘密协处理器。此时,TPM主要使用外部生成的密钥或者不需要秘密信息的算法进行密码运算。作为密码协处理器的主要功能包括随机数生成器,摘要和HMAC算法,对称和非对称加密操作。
摘要基本操作:
TPM2.0提供两种密码学摘要基本操作API。它们都具备算法灵活性,允许在调用函数的时候选择哈希算法。相对简单但是灵活性稍差的方法是TPM2_Hash。调用者输入消息,TPM返回相应的摘要。消息的长度受限于TPM输入缓冲区的大小,通常情况下是1-2KB。另外一种API可以实现对大文件的哈希。API分别为TPM2_HashSequenceStart, TPM2_SequenceUpdate, 和TPM2_SequenceComplete。
应用案例1:对大文件做哈希
在这个应用案例中,我们假设TPM的输入缓冲区大小为2KB。用户希望使用SHA-256算法对一个4KB的文件做哈希。用户使用TPM做哈希是因为在软件层面没有实现SHA-256哈希算法。用户使用后一种序列式的操作命令是因为文件大于2KB。步骤如下:
这种API和TPM1.2中的类似,但是它有如下几方面的加强:
应用案例2:存储登陆口令
什么是加盐操作
一个典型的口令文件存储经过加盐的口令哈希值。验证操作主要是对输入的口令进行加盐操作并作哈希,然后与存储的值相比较。因为上述的计算中没有包含秘密信息,这种方法经常会遭受针对口令文件的线下攻击。
在这个应用案例中,我们使用一个TPM生成的HMAC密钥。口令文件存储加盐口令的HMAC值。验证的过程主要是对输入的口令进行加盐操作并做HMAC计算,然后将结果与存储值比较。因为线下攻击者没有HMAC密钥,所以他们无法实施攻击。
安全存储登录口令:
RSA基本操作:
有两个命令可以支持基本的RSA操作:TPM2_RSA_Encrypt和TPM2_RSA_Decrypt。这两个操作都需要一个已经加载的RSA密钥。它们都允许以下几种填充机制:PKCS#1,OAEP,和无填充。加载到TPM中的密钥的填充配置信息不能被覆盖。但是如果密钥的填充机制是空的话,调用者可以制定一种有效的填充方法。
TPM2_RSA_Decrypt是一个私钥操作。TPM在返回明文之前会验证授权信息,验证填充并去掉填充信息。
TPM2_RSA_Encrypt是一个公钥操作。必须制定一个消息和公钥,但是因为是公钥操作,所以不需要授权。TPM在加密操作之前会对明文做填充。
CRTM签名验证:
对称密钥基本操作:
总结:
TPM有三个持续性的组织架构和一个空组织架构。平台组织架构被平台OEM使用,表现为启动初期的代码。即使用户关闭了其他的组织架构,平台OEM仍然可以依赖这个组织架构完成一些功能。存储组织架构受控于用户,它应用于隐私不敏感的场景。背书组织架构应用于隐私相关的操作。隐私相关的证书激活操作通常在背书组织架构下完成。空组织架构是易变的。会话,上下文,和序列对象都会使用这种组织架构。同时,在这个空组织架构下也可以创建一个完整的密钥树,它们在重新上电后会被清除。除去TPM的安全存储特性,它还可以用作一个秘密协处理器。它主要是使用TPM外部生成的密钥或者不需要秘密信息的算法做密码学操作。作为密码协处理器的主要功能包括随机数生成器,摘要和HMAC算法,对称和非对称加密操作。