草庐IT

【计算机】可信平台模块Trusted Platform Module - TPM

哐哐哐 Quan 2023-04-10 原文

简述 Brief Introduction

TPM内部功能模块示意图:

引述 Trusted Platform Module Technology Overview (Windows) | Microsoft Learn

Trusted Platform Module (TPM) technology is designed to provide hardware-based, security-related functions. A TPM chip is a secure crypto-processor that is designed to carry out cryptographic operations. The chip includes multiple physical security mechanisms to make it tamper-resistant, and malicious software is unable to tamper with the security functions of the TPM. Some of the key advantages of using TPM technology are that you can:

  • Generate, store, and limit the use of cryptographic keys.
  • Use TPM technology for platform device authentication by using the TPM’s unique RSA key, which is burned into it.
  • Help ensure platform integrity by taking and storing security measurements.

Trusted Platform Module简称TPM,该技术旨在为计算机设备提供基于硬件的安全相关的功能。TPM芯片是一种安全的协处理器,用于执行密码学相关操作。TPM芯片包含了多重物理防护措施,以防止被暴力破解和篡改,同时恶意软件无法篡改芯片的安全功能。列举一些使用TPM技术的优势:

       1. 生成和保存秘钥,同时限制秘钥的使用

       2. 使用TPM芯片内部烧录的独一无二的RSA秘钥对设备进行认证操作

       3. 使用度量操作,并通过获取和保存度量值来保证平台完整性

引述 TPM 2.0 A Brief Introduction

The TPM standard defines a hardware root of trust(HRoT) widely accepted as more secure than software that can be more easily breached by attackers.

ATTRIBUTES OF THE TPM INCLUDE:

TPM标准定义了一个基于硬件的根信任机制,其因比更容易被黑客攻破的基于软件的根信任机制更加安全而被广泛接受。

TPM拥有以下属性:

■ Support for bulk (symmetric) encryption in the platform 支持对称批量数据加密运算

■ High quality random numbers 高可信随机数生成

■ Cryptographic services 密码学服务

■ A protected persistent store for small amounts of data, sticky- bits, monotonic counters and extendible registers 存储小批量数据的受保护非易失存储器,粘结位,单向计数器以及
可延伸寄存器

■ A protected pseudo-persistent store for unlimited amounts of keys and data

■ An extensive choice of authorization methods to access protected keys and data

■ Platform identities 平台唯一标识符

■ Support for platform privacy

■ Signing and verifying digital signatures(normal, anonymous, pseudonymous) 签名及认证

■ Certifying the properties of keys and data

■ Auditing the usage of keys and data

引述 Trusted-Platform-Module-Summary_04292008.pdf

TPM (Trusted Platform Module) is a computer chip (microcontroller) that can securely store artifacts used to authenticate the platform (your PC or laptop). These artifacts can include passwords, certificates, or encryption keys. A TPM can also be used to store platform measurements that help ensure that the platform remains trustworthy. Authentication (ensuring that the platform can prove that it is what it claims to be) and attestation (a process helping to prove that a platform is trustworthy and has not been breached) are necessary steps to ensure safer computing in all environments. Trusted modules can be used in computing devices other than PCs, such as mobile phones or network equipment.

TPM是一种计算机芯片(微控制器),它可以存储各种用于认证你的PC或笔记本的工件。这些工件包括密码,证书,秘钥等。TPM芯片还可以用于存储平台度量值,该值可用于验证平台的可信度。认证(平台证明自己是自己所宣称的)和自证(平台证明自己处于可信状态且没有被破坏)是所有环境下确保安全计算的必要步骤。TPM不仅仅可以在PC中使用,也能在手机或者网络设备中使用。

重要术语 Important Terminologies

Endorsement Key: EK 签注秘钥

The endorsement key is an encryption key that is permanently embedded in the Trusted Platform Module (TPM) security hardware, generally at the time of manufacture. This private portion of the endorsement key is never released outside of the TPM. The public portion of the endorsement key helps to recognize a genuine TPM. The endorsement key is a base64 encoded value.

EK是在制造阶段被注入到TPM中的一个非对称加密秘钥,无法更改删除,其中的私钥部分永远不会在芯片外面出现,因此公钥部分能够用于唯一识别一个真正的TPM。

EKEndorsement Key. This is an asymmetric key contained inside the TPM (injected at manufacturing time). The EK is unique for every TPM and can identify it. The EK cannot be changed or removed.
EKpubRefers to public key of the EK.
EKPrivRefers to private key of the EK.
EKCertEK Certificate. A TPM manufacturer-issued certificate for EKPub. Not all TPMs have EKCert.

Storage Root Key: SRK 存储根秘钥

The storage root key is embedded in the Trusted Platform Module (TPM) security hardware. It is used to protect TPM keys created by applications so that these keys cannot be used without the TPM. Unlike the endorsement key (which is generally created when the TPM is manufactured), the storage root key is created when you take ownership of the TPM. This means that if you clear the TPM and a new user takes ownership, a new storage root key is created. This property is not typically manipulated by the service client. The StorageRootKey is a base64 encoded value.

SRK也存储在TPM中,用于保护各类应用程序生成的秘钥,以保证这些秘钥在离开TPM的SRK后无法使用。SRK是在获取到TPM的所有权之后生成的,这意味着如果TPM被清空之后,另一个新的用户获得了所有权,一个新的SRK会被生成。

Attestation Identity Key: AIK 身份证明秘钥

An Attestation Identity Key is a special purpose TPM-resident RSA key that is used to provide platform authentication based on the attestation capability of the TPM.

AIK是一个存储在TPM中有特殊用途的RSA秘钥,它和EK有数学上的关联,用于平台签名认证。

引述:

What's the difference between the endorsement key and the attestation identity key within the TPM?

The Endorsement Key is used to prove that you are talking to a real TPM. However, it cannot be used for signing. The AK can be used for signing and is associated with the EK.

You can consider the Endorsement Key (EK) fixed per TPM. Actually, the EK is the primary key of the endorsement hierarchy. As such, it depends on the Endorsement Primary Seed (EPS) which is really fixed for the lifetime of the TPM and a so-called template which e.g. determines if the EK is an RSA or an ECC key.

I mentioned earlier, that disclosing the EK public key would violate our privacy (since we can never change it). Therefore, the TPM will not allow us to use the EK for signing. That is the reason why we need an Attestation Key (AK), previously also called Attestation Identity Key (AIK).

The purpose of AKs is to sign data (e.g. PCR values) to prove that they originate from a real TPM (without having been tampered with). Remember, we cannot use the EK for signing directly.

PCR: Platform Configuration Registers 平台状态寄存器

RoT: Root of Trust 根信任

HRoT: Hardware Root of Trust 根信任

SCoT: Static Chain of Trust 静态信任链条

VMK: Volume Master Key 卷主密钥

FVEK: Full Volume Encryption Key 全卷加密密钥

TPM的所有权Ownership

译自:Change the TPM owner password (Windows) | Microsoft Learn

使用TPM需要成为它的“主人”,也就是需要Take Ownership of the TPM,获取所有权的方式就是设置一个Ownership Password,只有知道这块密码才能用它做一系列的操作,如加解密。同一时刻,一个TPM只能存在一个owner password,这个owner password让你能够在没有物理访问能力的情况下,使能、失能、清除一个TPM,例如使用远程命令行工具。同时,TPM owner password也给予了修改TPM字典破解逻辑的权限(为了防止owner password被暴力破解Brute Force Attack,TPM有防破解逻辑,例如在尝试若干次错误的owner password之后,TPM会在一定时间内禁止尝试)。获得所有权的操作会在每次启动的时候由Windows系统执行。所有权可以被更改,例如当你分享你的owner password或者清除你对该TPM的所有权之后,别人也可以获得所有权并对它从新初始化。

基于静态可信根(SRTM)的Bitlocker的工作原理

引述:

基于静态可信根(SRTM)的Bitlocker的工作原理是什么? - 知乎前文介绍了bitlocker的大致工作流程: 老狼:Bitlocker、TPM和系统安全大家应该了解了Windows上保证系统数据安全的Bitlocker的大致原理。本文将深入探讨它背后的工作原理:基于静态可信根(SRTM,Static Root of Tr…https://zhuanlan.zhihu.com/p/33858479TPM的主要作用是利用安全的经过验证的加密密钥带来强大的设备安全性。TPM功能的核心是签注密钥EK - Endorsement Key,这是在生产过程中内置到TPM硬件的加密密钥。这个签注密钥的私钥部分绝不会出现在TPM外部或暴露给其他组件、软件、程序或个人。另一个关键密钥是存储根密钥SRK - Storage Root Key,该密钥也存储在TPM内;它被用来保护其他应用程序创建的TPM密钥,使这些密钥只能由TPM通过被称为绑定的过程来解密,TPM也是通过该过程锁定数据到设备。与签注密钥不同,只有当TPM设备第一次被初始化或新用户获得所有权时,存储根密钥才会被创建。

平台状态寄存器PCR - Platform Configuration Registers,是用来记录系统运行状态的寄存器,TCG规范要求实现的一组寄存器,至少有16个(TCG 1.1规范),每个20个字节;TCG 1.2规范中引进了8个额外的平台状态寄存器用于实现动态可信根(DRTM);在TPM 2.0之后,引入了多bank的概念。

PCR是TPM的核心器件,为了防止PCR值被恶意代码随便篡改或伪造,TPM限制对平台状态寄存器的操作,不能像普通寄存器那样通过MMIO来随意进行读写操作,平台状态寄存器位于TPM内部,其内部数据受到TPM的保护。对PCR内容的读取是不受限制的,但对其写入只有一种,那就是Extend。Extend操作大致如下:

New PCR value = SHA-1 hash (Current PCR value || new SHA-1 hash)

也就是在原有的20字节PCR后面加上新Hash的SHA-1的值,组成40个字节,然后再对这40个字节进行SHA-1的Hash,再次得到新的20个字节的PCR。

这个Extend操作全部由TPM芯片完成,外部只能提供新的SHA-1的值。扩展操作是不可逆的,即先扩展度量值A再扩展度量值B所得到的PCR值跟先扩展B再扩展A的结果是不同的。而且知道了新的PCR的值和老的PCR的值,也不能倒推出新的SHA-1的值。

通过扩展,PCR能够记录一个无限长的度量值序列,这一系列度量值组成的序列反应了系统状态的变迁 ,这个扩展序列中的某一个度量值被改变了,之后的度量序列都会受到影响。虽然理论上来说,一个PCR维护的度量序列就能够记录整个平台的状态值,但实际应用中,PCR被TCG定义为多个寄存器组,并且越来越多。每个寄存器都被赋予不同的度量对象:

有了PCR的帮忙,我们就可以开始建立静态信任链。所谓静态,是因为它需要一个核心度量信任根(CRTM - Core Root of Trust for Measurement)。这个CRTM是先验的可以信任的基础,有了它,整个信任链条才可以建立。CRTM开始的时候,被设定是UEFI BIOS的PEI阶段的FV,认为它是不会被修改的,它是可信的。但是因为对BIOS的攻击越来越多,甚至包括物理攻击,即用BIOS工程师常用的烧写工具直接烧写BIOS,这对直接使用PEI作为CRTM提出了挑战。于是CRTM被前置到Boot Guard ACM中,关于Boot Guard不在本文的范围内,我们今后再讲,这里权且相信它的安全性。有了CRTM的安全,下面的链条就可以建立起来了:(measure就是将当前状态的hash值使用Extent操作记录到PCR中去)

引述:bitlocker对磁盘进行加密解密

  

1. BIOS 启动并初始化TPM。并measure firmware部分敏感内容和启动分区以及bootloader,将结果放入PCR组。

2. 如果 PCR 值与期望值相匹配,则 TPM 将使用存储根密钥 (SRK - Storage Root Key) 对卷主密钥 (VMK - Volume Master Key) 进行解密。

3. 从卷中读取加密过的 FVEK - Full Volume Encryption Key,并使用解密 VMK 对其进行解密。

4. 访问磁盘扇区时,使用 FVEK 进行解密。

5. 为应用程序和过程提供解密数据。

引述:How Windows uses the TPM | Microsoft Learn

什么是Boot Guard?电脑启动中的信任链条解析

引述:什么是Boot Guard?电脑启动中的信任链条解析 - 知乎“无事可干”的黑客们早已经把目光从操作系统转移到固件上了,毕竟一旦攻破了固件的大门,那么在其上的操作系统也会门户洞开。现在电脑或者x86服务器系统中固件众多: UEFI在其中居于中间地位,它的安全性也是重中…https://zhuanlan.zhihu.com/p/116740555

BIOS固件的验证

Intel Boot Guard引入了一个叫做ACM(Authenticated Code Module) 的黑盒,也把BIOS凭空分成两部分:IBB和OBB。IBB(Initial Boot Block)一般只包括PEI和SEC阶段,OBB(OEM boot block)则是剩余的阶段。

CPU在出厂的时候,ME是处于Manufacture mode,这时主板厂商(OEM)可以通过工具将厂商的主板启动非对称秘钥对中的公钥部分Fuse到pch中的NVRAM中。并用签名服务器对BIOS image用密钥对中的私钥进行签名。在启动的时候,黑盒ACM先启动,它用Fuse在pch中的公钥验证BIOS是否真的由其对应的私钥签名,如果通过,就跳到Reset Vector执行,否则死机。这似乎很好理解,但诡异的是ACM也放在Flash上,谁来保证ACM的真伪呢?答案就是ACM是由Intel用ACM私钥签名了的,而由Intel的microcode来验证签名正确与否。

好了,我们可以串起来讲一下了。Microcode验证ACM, ACM验证IBB,IBB验证OBB(想想为什么不用ACM验证整个BIOS,而要分成两步)。OBB后面呢?那就是UEFI安全启动了。整体是这样:

由此一个启动的安全链条建立起来了。它环环相扣,每一步验证后一步,如果其中任何一个呗破坏,则拒绝启动,来保证最终用户看到的界面是安全的。

安全根的问题

如果我们梳理整个链条,源头的源头,在这条河的最上游,信任和安全的原点在哪里呢?在Microcode,如果你信任它,才能信任最后的结果,也就是它是这一信任链条的根。那么,我们该不该信任它呢?

实际上Microcode也需要签名,而验证这个签名的就是CPU硬件。在最后的最后,这实际上取决于相信不相信Intel公司。相信Intel,才能相信Microcode这个黑盒,才能相信它验证过的ACM黑盒,才有接下来的安全链。而CPU硬件是目前是无法伪造的,也目前没有被攻破。所以现在大部分电脑厂商,包括笔记本和台式机,总的趋势都是接受并开启了Boot Guard,把主板的安全水平提升了一个档次。

参考链接:

A Practical Guide to TPM 2.0:https://link.springer.com/content/pdf/10.1007/978-1-4302-6584-9.pdf

有关【计算机】可信平台模块Trusted Platform Module - TPM的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  5. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  6. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. ruby-on-rails - Controller 中的 Rails 辅助模块 - 2

    我有一个Controller,我想为这个Controller创建一个助手,我可以在不包含它的情况下使用它。我尝试像这样创建一个与Controller同名的助手classCars::EnginesController我创建的助手是moduleCars::EnginesHelperdefcheck_fuellogger.debug("chekingfuel")endend我得到的错误是undefinedlocalvariableormethod`check_fuel'for#有没有我遗漏的约定? 最佳答案 如果你真的想在Controll

随机推荐