一个TPM2.0资源实体是TPM内部可以通过handle直接引用的内容。这个概念包含了对象的概念,因为TPM规范使用对象来引用一个实体的子集。这看起来可能有些迷惑,所以这一章我们将简要介绍这些实体的类型:永久实体(组织架构,字典攻击锁定机制,和PCR);与永久实体类似的非易失性实体(NVRAM索引);对象(秘钥和数据);以及易变的实体(各种各样的会话)。
介绍完以上内容后,后续的章节将更加详细地介绍每一种实体及其使用。具体来讲,下一章将深入介绍组织架构,组织架构包含一些相关的实体,并且按照一个组来管理。
一个永久实体的handle是由TPM规范定义好的,这些handle不能被创建和删除。在TPM1.2中,PCR和所有者是唯一的永久实体;根存储秘钥(SRK)有固定的handle,但是它不是永久实体。在TPM2.0中,有更多的实体类型:三个固定的组织架构,一个临时组织架构,字典攻击锁定复位,保留handle,明文口令授权会话,和平台组织架构的NV使能。后面几个小节将依次介绍。
TPM2.0有三个固定的组织架构(平台,存储,背书),每一个架构都通过固定的handle来访问:TPM_RH_PLATFORM(0x4000000C),TPM_RH_OWNER(0x40000001),和TPM_RH_ENDORSEMENT(0x4000000B)。访问它们需要被授权,它们每一个都有一个授权和policy。经过各自管理员的授权以后就可改变相应的组织架构(管理员被定义为知道相应组织架构)。组织架构的授权值和policy可以改变,但是不论我们引用一个组织架构,都是指的同一个TPM资源实体。固定的组织架构永远不能被删除,但是它们可以被自己的管理员或者平台管理员关闭。这三种组织架构可以包含相关的秘钥链和数据,清除组织架构就能清除其中的秘钥和 数据。
下一章将详细介绍组织架构,包括每个组织架构的管理和应用案例。现在为止,我们应该可以了解到固定的组织架构是TPM的永久性资源实体。它们不能被创建或者删除。
另外和上述组织架构类似的的永久实体是临时组织架构和字典攻击锁定复位机制。
TPM2.0有一个叫做NULL的临时组织架构,它通过一个固定的handle来引用:TPM_RH_NULL(0x40000007)。TPM被用作密码协处理器时会用到这个组织架构。第9章也会描述,他的授权值和policy都是空的。
与前面的固定组织架构类似,这个临时的组织架构本身是永久存在的。它不能被删除,但是和固定组织架构不同的是,它在TPM的每个上电周期里会自动清除。阅读第9章来了解更多。
字典攻击锁定机制有一个固定的handleTPM_RH_LOCKOUT(0x4000000A)。它同样有一个授权和policy。和之前介绍的三个固定组织架构一样,这个授权可以被相应的管理员修改。不同的是,它是一个不包含秘钥和对象的组织架构。当字典攻击触发锁定时,这个机制用于复位。它还可以用于清除TPM_RM_OWNER组织架构。通常情况下它充当TPM存储组织架构的IT管理员。
示例:失败次数复位
TPM被配置成输入口令失败5次之后将锁定这个用户24小时。锁定期间所有受到字典攻击保护的资源都不能被授权。用户需要说服IT管理员相信这个锁定不是因为攻击,仅仅是因为密码输入错误。管理可以使用锁定授权复位失败计数器,这样一来用户就不需要等待24小时。
TPM拥有一些使用索引来访问的PCR。根据平台相关规范的定义,PCR可以使用一种或者多种算法。它们同样也有授权值和policy,这个规范来选择(通常是NULL),授权值和policy可以用于通过PCR扩展(extend)来改变PCR的值。读取PCR的值不需要任何授权。 PC客户端平台规定至少要有24个PCR。只有一个PCR bank是强制的,bank可以在系统启动时被配置为使用SHA-1或者SHA-256算法。
因为PCR是一种永久实体,所以没有创建或者删除PCR的命令;你只能修改它的属性或者值。第12章还会详细介绍这些永久性实体。
如果平台相关的规范想要使用handle时,设备厂商可以在TPM中保留handle。这些handle的设计意图是当TPM内部的固件面临严重的安全问题时,TPM可以验证固件的哈希值。在写这本书的时候,还没有平台相关的规范使用保留的handle。
TPM有一个会话也是永久性的,它就是口令授权会话的handle-TPM_RS_PW(0x40000009),用户可以使用这个handle来做明文口令授权。
handle(0x4000000D)TPM_RH_PLATFORM_NV控制着平台组织架构的NV使能。当清除使能位后,所有平台组织架构下NV索引的访问都将被拒绝。
需要说明的是,NV索引可以隶属于平台组织架构或者存储组织架构。存储组织架构本身控制着其NV索引的使能,但是平台组织架构并不控制平台的NV索引使能。所以平台NV的使能就是一个隔离控制的案例。这样就实现了平台组织架构下的密钥等资源与平台NV索引的独立控制。
应用案例:存储启动参数
平台的固件可以很方便地使用TPM作为存储启动参数的NV空间。即使是在TPM平台组织架构关闭的情况下,这个空间也必须保持可读。这样一来,独立控制就显现它的作用了。
接下来我们来了解一些和永久实体类似的实体:NV索引。它们是非易失性的,但却不在架构设计的定义中。
一个NVRAM索引就是一个非易失性TPM实体。TPM内部有一定的非易失性存储空间供用户配置用于数据存储。当配置完成后,这个空间就具备一个索引和一组属性,索引和属性是用户可以选择的。
因为NVRAM索引具有更多的属性,TPM规范没有把它视为一种对象。读写NVRAM可以被单独控制。它们可以被配置成看起来像PCR,计数器或者位域。同时也可以配置成只能写一次的实体。第11章会详细介绍他们的属性和应用案例。
NVRAM索引同时具有授权值和授权policy。NV索引的拥有者可以改变授权值,但是不能改变授权policy,授权policy一旦被创建就不能再修改。如果NVRAM与平台相关,那么当平台组织架构被清除时相关的NVRAM索引也将被删除。
对象和NVRAM类似,他们都属于某一个组织架构,都自己的数据和授权机制,但是对象的属性相对较少。
一个TPM对象可能是密钥或者其他数据。它有一个公共的部分,并且“可能”有一个私密的部分,比如一个非对称密钥对儿的私钥,一个对称密钥,或者是加密的数据。所有的对象都隶属于一个组织架构。TPM对象也都有相关的授权数据和授权policy。与NV索引相同的一点是,一个对象的policy一旦被创建后就不能再修改。
当TPM对象应用于命令时,命令被分为管理和用户两类。在创建TPM对象时,用户可以决定在使用这个对象的命令中,哪一些命令可以通过授权数据来使用,哪一些只能使用policy。但是需要特别提醒的是:对于有些命令来说,不管密钥创建的时候配置什么样的属性,它们都只能通过policy来授权执行。
跟NVRAM索引相似,所有的TPM对象都隶属于以下四中组织架构中的一种:平台,存储,背书,或者NULL。当一个组织架构被清除时,它所有的对象也都将被删除。
通常来说,大部分的TPM对象都是密钥。第10章将会详细描述它们。使用密钥和其他TPM对象时还要求有一个TPM非固定实体:会话。
一个不持续的实体会在TPM一个上电周期内清除。尽管可以通过TPM2_ContextSave来保存一个持续实体,但是TPM的密码学机制不允许重新上电之后加载之前保存的内容,这样就保证了它不断变化的特点。这种不持续的实体同样也被分门别类。
用于授权的会话或许是最为广泛应用的一种,比如HMAC和policy会话,它们用于TPM实体的授权,命令和命令响应参数加密,和命令审计。第13章会深入介绍它们的使用。
哈希和HMAC事件序列实体用于保存密码库函数的中间结果,因为通常情况下密码学软件库都具有“start,update,complete”的设计模式。这种模式允许对比TPM命令缓冲区大的数据块儿做哈希或者HMAC。第9章会描述它们的应用。
与不持续实体相对应的是持续性实体,持续性实体会在TPM的上电周期之间保存。
一个持续性的实体就是一个组织架构的所有者要求TPM在上电周期之间保留在TPM中的对象。它与永久实体的不同是相关组织架构的拥有者可以清除持续性实体。因为TPM的持续性内存空间有限,所以我们应该节约使用持续性实体。下面是一些很有用的应用案例。
应用案例:VPN密钥访问
在系统启动的早期阶段访问VPN时需要一个签名密钥。然而这个时候硬盘并不可用。如果应用将密钥保存在TPM的持续性存储空间内,系统在早期启动阶段可以立即使用密钥做密码学操作。
应用案例:主密钥优化
一个主存储密钥通常作为一个密钥架构的根节点。密钥生成是密码运算中最为耗时的操作。当创建一个密钥之后把它存储到TPM的持续性空间中,这样就可以避免每次启动都重新生成密钥。
应用案例:身份密钥的初始配置
主板制造企业通常会为TPM配置一个受限制的签名密钥。这个密钥用于标识这个平台的身份。如果主板损坏,然后TPM被替换到其他主板上,那么密钥将不能被加载使用(这里认为默认情况下密钥存储在与主板连接的磁盘上?)。同时,一个企业的IT部门也希望给备用主板配置新的签名密钥。但是因为一个单纯的主板并没有硬盘,所以也没有办法存储密钥。这时IT部门可以将生成的密钥存储在TPM的持续性空间里,这要以来即使主板损坏了,TPM持续性空间存储的密钥仍然可以在替换的主板上使用。
通常情况下,主存储密钥比如SRK,受限的主签名密钥比如身份认证密钥AIK,以及背书密钥是TPM中仅有的可持续性实体。第10章还会详细讨论。
实体的名称是TPM2.0的一个新概念,它主要用于解决TPM1.2规范中出现的问题。极端严苛的安全分析表明,攻击者有可能在数据被传送到TPM的过程中截获这些数据。TPM的设计可以阻止通过这种攻击篡改大部分的数据。但是因为TPM的存储资源有限,所以它允许一个密钥管理器在必要的时候将密钥加载到TPM或者由TPM导出。当密钥被加载到TPM之后,密钥就通过handle来访问,这个handle就是密钥所加载到的内存的速记符。因为应用软件可能不知道密钥管理器为了腾出额外空间将密钥的位置改变,所以密钥的handle也就没有防止修改的保护机制,并且恶意软件可以修改发送到TPM的数据来非法访问一个正确的handle位置(回想一下,前面有介绍,为了让RM能虚拟化handle,handle本身是不在认证范围内的,也就是说不在计算HMAC和Policy范围内)。
通常情况下,上面描述的问题并不严重。但是如果用户将两个以上的密钥设置相同的口令,那么有可能通过修改handle来非法授权另外一个具有相同口令的密钥。你有可能会说,这个貌似不太可能吧。但是TPM规范的制定者也倾向于是幻想狂,他们认为这个是有可能的。为了不仅仅是提醒所有人不要对不同的密钥设置相同的口令,他们决定给每一个TPM实体一个唯一的名字,当使用这个实体的命令做HMAC授权计算时,实体的名称会用于HMAC计算。这样一来,即使handle会变化也没有问题,因为实体的名称不会变。
在一次HMAC授权中,TPM命令参数会被做哈希,然后还会在计算中隐示地加上handle相关的实体名称,即使命令参数中不包含实体的名称也是如此。如此,攻击只能修改实体的handle,但是不能修改相关的名称,因为修改成另一个密钥的名称会导致HMAC授权失败。
名称是一个TPM实体唯一的身份标示。对于永久性的实体来说(如PCR和组织架构的handle),因为他们的handle永远不会变,所以handle就是它们的名称。对于其他的实体(如NV索引和加载的对象)来说,它们的名称实际上是他们各自的公开数据的哈希值。TPM设备本身和API调用者在授权时会独立地计算实体的名称。
基于安全的考虑,在创建一个实体时就计算它的名称并合理存储是非常重要的。一种非常幼稚的实现是提供一个由handle产生名称的函数,这个函数用handle作为输入,然后通过handle引用相关实体的公开数据并计算名称。这种做法将完全破坏使用名称来做HMAC运算的初衷。因为handle有可能被篡改,这样一来计算出的名称就有可能不是授权者预期的名称。
以下将介绍一些名称的使用案例。
应用案例:攻击者清除NV索引的位域
如果一个密钥的所有者在密钥的policy中使用了NV索引的位域,当比特3置1之后将撤销某一个密钥用户的使用权。撤销使用权的用户或者攻击者可以删除NV索引并使用相同的policy重新创建它。当密钥所有者想设置比特5时,他会使用由handle产生名称的函数计算名称。密钥所有者使用这个结果来授权并设置比特5。但是这时候NV索引的比特3是清除状态,因为TPM在创建位域时会将所有的比特初始化位零。
如果密钥的所有者合理地存储了密钥的名称并将这个存储的名称用于授权,那么上述的过程中授权将会失败。授权失败的原因是,当攻击者重新创建NV索引时,属于公共部分的比特3将会被清除(问题:攻击者不能设置这个比特吗?),进而也就修改了密钥的名称,这与事先存储的值不同。
NV索引的名称就是索引公共区域的摘要值。一个攻击者可以删除并重新创建索引。但是除非公共区域(索引值,属性,policy)相同,否则索引的名称将会改变。
示例:攻击者读取秘密信息
用户可能定义一个普通的索引用于存储秘密信息。索引的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时,实体的handle会发生变化,所以实体的授权使用名称而非handle。
这一章总结了各种实体的类型,并引出了后续章节的概况。接下来的章节将详细介绍组织架构(永久实体),密钥(对象),NV索引(持续性实体),PCR(永久实体),和会话(非持续性实体)。