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

“无事可干”的黑客们早已经把目光从操作系统转移到固件上了,毕竟一旦攻破了固件的大门,那么在其上的操作系统也会门户洞开。现在电脑或者x86服务器系统中固件众多:

UEFI在其中居于中间地位,它的安全性也是重中之重。我们在前文中介绍了UEFI安全启动:

这种技术把UEFI固件当做安全计算基石Trusted Computing Base (TCB),在其上验证操作系统的bootloader真伪,保证我们和操作系统之间不被插入一个伪造的bootloader。

但大家有没有想过,这里有个假设,那就是UEFI固件也就是BIOS是安全而可信的。这年头,谁会那么靠谱呢,如果某黑客拿个Flash烧写器,做个假BIOS怎么办?

要解决这个真假BIOS的问题,就需要我们今天的主角,Boot Guard出场了。今天我们就一起来了解一下它,并顺便看看其他的解决方案。在进入正题之前,我们需要补充一点密码学相关的知识。

密码学基础

很显然,本篇文章的重点在于Boot Guard,而想要更好地理解它的运作机理则需要一定的密码学基础。密码学是一门高深的学科,关于它的论著数不胜数,此处我们只讲大致原理,不讲细节,感兴趣的读者不妨自行寻找完整的资料来深入的理解这门学科。

1.加密Hash(散列)函数

稍有了解的人都知道:散列函数h是使一个较大域的X的值变为较小范围Y的一种数学函数,同时尽可能的使X均匀投影到Y的取值空间中,这样可以减小哈希冲突(你们还记得吗?敲黑板!用数学语言来解释:存在属于X的x1和x2,有相同的对应关系Y,即h(x1) = h(x2),这种情况就叫哈希冲突)的风险,

加密散列函数f是具有如下属性的散列函数:

  • 1). 很难找到x1和x2,使得f(x1)=f(x2)(这一性质通常被成为抗碰撞性(collision resistant))。

  • 2). 对于已知的y,很难找到一个x使得f(x)=y(这一性质通常被称为抗原像性(pre-image resistance),通俗的讲也就是单向性,即从输出反推输入很难或者耗时很长)。

此外,加密散列函数通常用来在给定x的情况下,快速计算y=f(x)。比较出名的应用有MD5,SHA-1,以及SHA-2系列等等。

加密散列函数在一些需要保护数据完整性的应用中是很有用的,由于其算法的特殊属性,攻击者很难在修改数据(例如某可执行文件)后不被拥有原始Hash值的人发现。同样的,即使攻击者知道原Hash值,他也做不到不改变Hash值的情况下对文件进行替换(pre-image resistance)。

2. 公钥加密法和数字签名

加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知道解密的方法,仍然无法了解信息的内容。

人类尝试加密数据的历史悠久,从希波战争到凯撒大帝出处都有它的痕迹,可以单独写一本书,这里按下不表。但在非对称密钥出现之前,一直都是对称密钥,大家都认为,如果想要在双方之间建立机密通信,那么双方就必须约定一个共享的秘密——shared secret,依靠这个共享的密钥进行加密解密。进而如何可靠的传递密钥变得异常重要。

公钥加密法在20世纪70年代末由Whitfield Diffie,Ralph Merkle和Martin Hellman提出。这种方法,一不需要事先约定,二不必事先知道与谁进行安全通信,也正是因为这两点特性,这一技术才会被称为是革命性的,它也是建立在这样一种概念——公钥部分和私钥部分共同组成新形式的密钥——非对称密钥。公钥可以交给任何人,而密钥的私有部分仅被其所有者知道。这就好比是通信双方,有一个人建立了一个保险柜(将保险柜的制造方法理解为私钥),将信息存入其中,并把保险柜的钥匙(公钥)交给另一方,而另一方当然可以拿着这个钥匙获取保险柜中的东西,但他不能,也不必知晓对方究竟是如何制造出了这样一个保险柜。

在受到Hellman,Merkle和Diffie想法的启发后,Ronald Rivest,Adi Shamir和Leon Adelman在几年后发明了RSA密码系统。使用RSA,持有私钥的实体A不仅可以使用该密钥来解密由知道A的公钥的人发送给他的数据,而且A还可以使用他的私钥来对一些数据进行数字签名(给别人配钥匙)。任何持有A的公钥并且可以访问签名数据的人,都可以通过数学手段来验证这一点:数据只能被拥有A的私钥的人来签名——也就是说,只有A可以生成该消息——并且它不会被没有私钥的人修改。

它的数学理论基础在于大质数分解困难,如果大家感兴趣,可以参考吴军的《数学之美》

总的来说大家只要记住,公钥和私钥是一起产生的;公钥谁都可以有,私钥只有自己有;知道公钥、秘文和明文,无法推导出私钥,反之亦然;公钥私钥可以相互验证。

BIOS固件的验证

好了,在了解非对称密码之后,我们来看看如何以及是谁来验证BIOS的完整性。一个显而易见的方法是对BIOS进行签名,用主板生产厂商的私钥进行签名,如果签名校验失败,就拒绝执行BIOS代码,这就是Boot Guard的大致工作原理。但细节往往复杂太多,其中有许多有趣的环节。

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,把主板的安全水平提升了一个档次。

但服务器领域和部分国产领域,则交出了不同的答案。大的云服务器厂商如Google和国产大厂,需要把安全根掌握在自己的手上,选择关闭Intel Boot Guard,换上一套自己的安全链条。即把安全根从Microcode转到BMC或者FPGA中去,来自己掌控命运。

后记

最后说一句,广大最终用户别想着自己关闭Boot Guard。一旦开启就不能关闭,这也是为了安全计。

作者:老狼

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/415314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

element teble嵌套表单

以下代码是组件代码 并不是上图的代码 &#xff0c;只是大致功能是一样的&#xff0c;emm 主要是table列表里面嵌套form表单 并有添加校验&#xff0c; 其余功能代码是组件传参 或其他逻辑使用的未用到可不用 <template><div><el-form :rules"rules"…

2024.2.28 网络

思维导图 整理面试题 1、什么是回调函数 答&#xff1a;将函数作为参数传到另一个函数里面&#xff0c;当那个函数执行完之后&#xff0c;再执行传进去的这个函数。这个过程就叫做回调。 2、结构体和共用体的区别 答&#xff1a;结构体的每个成员都会分配内存&#xff0c;…

为什么会对猫毛过敏?如何缓解?浮毛克星—宠物空气净化器推荐

猫咪过敏通常是因为它们身上的Fel d1蛋白质导致的&#xff0c;这些蛋白质附着在猫咪的皮屑上。猫咪舔毛的过程会带出这些蛋白质&#xff0c;一旦接触就可能引发过敏症状&#xff0c;比如打喷嚏等。因此&#xff0c;减少空气中的浮毛数量有助于减轻过敏现象。猫用空气净化器可以…

HarmonyOS开发云工程与开发云函数

创建函数 您可直接在DevEco Studio创建函数、编写函数业务代码、为函数配置调用触发器。 1.右击“cloudfunctions”目录&#xff0c;选择“New > Cloud Function”。 2.输入函数名称后&#xff0c;点击“OK”。 函数名称仅支持小写英文字母、数字、中划线&#xff08;-&a…

rtthread stm32h743的使用(三)uart串口设备使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.建立新工程&#xff0c;选择相应的芯片型号及debug引脚及调试器 2.打开cubemux&#xff0c;设置外部时钟及串口外设…

大数据分布式计算工具Spark实战讲解(数据输入实战)

Python数据容器转RDD对象 PySpark支持通过SparkContext对象的parallelize成员方法&#xff0c;将&#xff1a; - list - tuple - set - dict - str 转换为PySpark的RDD对象 注意&#xff1a; •字符串会被拆分出1个个的字符&#xff0c;存入RDD对象 •字典仅有key会被存入…

【饮食】如何有效的补充维生素,矿物质?学习笔记(附膳食营养素参考摄入量DRIs)

程序员养生指南之 【饮食】如何有效的补充维生素&#xff0c;矿物质&#xff1f;学习笔记&#xff08;附膳食营养素参考摄入量DRIs&#xff09; 文章目录 一、维生素补充1、需要补充维生素的情况2、食补&#xff1a;缺啥补啥3、补充剂&#xff08;无脑吃&#xff09; 二、膳食营…

面试笔记系列八之JVM基础知识点整理及常见面试题

类实例化加载顺序 加载&#xff1a;当程序访问某个类时&#xff0c;JVM会首先检查该类是否已经加载到内存中。如果尚未加载&#xff0c;则会进行加载操作。加载操作将类的字节码文件加载到内存&#xff0c;并为其创建一个Class对象。 连接&#xff08;验证、准备、解析&#x…

【MySQL面试复习】了解过索引吗?(索引的底层原理)/B 树和B+树的区别是什么?

系列文章目录 在MySQL中&#xff0c;如何定位慢查询&#xff1f; 发现了某个SQL语句执行很慢&#xff0c;如何进行分析&#xff1f; 系列文章目录了解过索引吗&#xff1f;(索引的底层原理)B 树和B树的区别是什么&#xff1f; 了解过索引吗&#xff1f;(索引的底层原理) 如果没…

行为树入门:BehaviorTree.CPP Groot2练习(叶子节点)(2)

以《行为树BehaviorTree学习记录1_基本概念》练习。 1 SequenceNode顺序控制节点 代码下载 git clone https://gitee.com/Luweizhiyuan2020/ros2_bt.git例程 1.1 sequence 顺序执行 下载版本SequenceNode1。 1.2 ReactiveSequence 异步执行 注意&#xff1a; ①only a…

Ruoyi框架上传文件

axios资料&#xff1a;axios中文文档|axios中文网 | axios axiosjson 默认情况下&#xff0c;axios将JavaScript对象序列化为JSON。 submit(data) {if (data && this.definitionId) {// 启动流程并将表单数据加入流程变量startProcess(this.definitionId, JSON.string…

【深度学习笔记】5_2 填充和步骤

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.2 填充和步幅 在上一节的例子里&#xff0c;我们使用高和宽为3的输入与高和宽为2的卷积核得到高和宽为2的输出。一般来说&#xff0…

Python中的os库

一.OS库简介 OS是Operating System的简写&#xff0c;即操作系统。 OS库是一个操作系统接口模块&#xff0c;提供一些方便使用操作系统相关功能的函数。 二.OS库常用函数 2.1文件和目录 2.1.1&#xff1a;os.getcwd() 作用&#xff1a;返回当前工作目录&#xff0c;结果是…

Vue3学习——路由prop配置、replace

写法一 在路由中可直接写prop: true&#xff0c;即可在页面中defineProps使用 相当于&#xff08;<Detail id“1” name“2” />&#xff09;,但只能是params {path: /service,name: 服务,component: () > import(../views/Service/index)&#xff0c;props: true}…

蓝桥杯前端Web赛道-寻找小狼人

蓝桥杯前端Web赛道-寻找小狼人 题目链接&#xff1a;0寻找小狼人 - 蓝桥云课 (lanqiao.cn) 题目要求&#xff1a; 其实通过题目要求以及题目中提供的gif可知&#xff0c;该题就是需要我们手动写出能够代替filter函数的函数 我们先分析题目给出的代码&#xff1a; let newcar…

Linux:Ansible的常用模块

模块帮助 ansible-doc -l 列出ansible的模块 ansible-doc 模块名称 # 查看指定模块的教程 ansible-doc command 查看command模块的教程 退出教程时候建议不要使用ctrlc 停止&#xff0c;某些shell工具会出现错误 command ansible默认的模块,执行命令&#xff0c;注意&#x…

单片机复位按键电路、唤醒按键电路

目录 单片机复位按键 外部手动复位 单片机复位按键电路 复位按键电路1 复位按键电路2 单片机唤醒按键 单片机唤醒按键电路 单片机复位按键 单片机复位&#xff1a;简单来说&#xff0c;复位引脚就是有复位信号&#xff0c;就是从头开始执行程序 本质&#xff1a;就是靠…

开源大模型LLM大爆发,数据竞赛已开启!如何使用FuseLLM实现大语言模型的知识融合?

开源大模型LLM大爆发&#xff0c;数据竞赛已开启&#xff01;如何使用FuseLLM实现大语言模型的知识融合&#xff1f; 现在大多数人都知道LLM是什么&#xff0c;以及可以做什么。 人们讨论着它的优缺点&#xff0c;畅想着它的未来&#xff0c; 向往着真正的AGI&#xff0c;又有…

NOIP 2008 普及组初赛试题及解析

NOIP 2008 普及组初赛试题及解析 一. 单项选择题 &#xff08;共20题&#xff0c;每题1.5分&#xff0c;共计30分。每题有且仅有一个正确答案.&#xff09;。二. 问题求解&#xff08;共2题&#xff0c;每题5分&#xff0c;共计10分&#xff09;三. 阅读程序写结果&#xff08;…

【JavaScript】手写 Promise(Promise\A+测试)

手写Promise-Promise\A测试 接下来咱们来测试一下手写Promise的代码能否通过Promise\A测试 Promise\A规范: Promise\A是社区推出的规范,其实最早Promise也是社区推出并实现的,旨在规范Promise的实现,里面约定了: 状态必须是:pending,fulfilled,rejectedthen方法的详细实现细…
最新文章