面对日益升级的供应链攻击和 “预装” 后门威胁,开源硬件是可信赖硬件的终极答案吗?开源硬件一定比闭源硬件安全(自主可控)吗?
著名硬件黑客黄欣国 (Andrew ‘bunnie’ Huang) 在上周末举行的混沌计算机俱乐部会议 (36C3) 上讨论了这个问题。
数年前,黄欣国和朋友构建了开源笔记本电脑 Novena,在此过程中他们意识到构建一个完全可信的开源硬件非常困难,即使你能制造自己的 CPU 和 SSD,你也无法确保它们是值得信任的,因为你没办法确保供应链的每一环节你的硬件没有遭到纂改。自从斯诺登事件以后,人们已经意识到供应链攻击的风险无处不在:在产品交付到客户手中的各个环节,从送货司机、海关官员到仓库工人都可能接触硬件,有机会纂改硬件。尤其是在智能手机行业,固件调换(预装)已经形成了规模庞大的市场。
黄欣国的结论是开放硬件和闭源硬件的可信度没什么差别。软件有近乎完美的信任转移机制,比如验证哈希值,但硬件没办法采用这些方法。他描述了构建可信任硬件的三个原则:
1. 复杂性是验证的敌人;
2. 不能只验证元件而要验证整个系统;
3. 赋权终端用户去验证和密封硬件。
他和朋友发起了 Betrusted 项目去实践这三个原则。
以下是《我们能否开发出可信硬件》的论文原文,安全牛编译如下:
我们能否打造可信硬件?
为什么开放硬件自身不能解决信任问题?
几年前,我和 Sean ‘xobs’ Cross 弄了个开源笔记本电脑 Novena(上图),一路从电路板构建起来的,并将构建方法和过程分享给了全世界。我是开源硬件的坚定支持者,坚信分享知识就是共享力量。我们没料到的是,媒体会把我们的开源硬件小创造标榜为更可信的计算机。若说有何不同的话,构建 Novena 的过程让我强烈意识到:真是什么都不能信任!仔细审查过每个部件的开放性和文档后,你就会发现:从开机加电到执行你代码的第一条指令的过程中,如果不运行几个闭源固件块,你根本无法启动任何现代计算机。互联网批评家认为,如果我们真想弄个可以信任的东西出来,我们就应该构建自己的 CPU 和固态硬盘 (SSD)。
我还真的认真考虑过这个建议。我在芯片行业待过,所以从无到有构建开源片上系统 (SoC) 的想法也没那么疯狂。但是,我想得越多,就越感觉到,自己构建片上系统也还是太多短视。制造芯片的过程中我也在编辑芯片掩模;芯片的可塑性相当强,甚至在流片试产之后都保有可塑性。我也花了十年时间争论供应链问题,对付假货、劣等工艺、秘密零件替换——把 “好” 芯片偷偷换成 “坏” 芯片的机会和动机简直不要太多。即使工厂出品的是经过严格质检的产品,配送公司、海关人员和仓库工作人员也有机会在用户拿到计算机前动点儿手脚。最后,当今高度集成的电子商务系统环境下,往供应链中注入恶意硬件也不过就是下单产品、篡改、装回原包装箱,然后再退个货这么简单。买到这种被篡改过的退换货品的受害者根本不会察觉。
参照上述经验,我可以肯定,开源硬件的可信度跟闭源硬件没什么不同。换句话说,两者都不可信。虽然开源硬件让用户有机会创新,也自带比闭源硬件更正确和透明的设计意图,但最终,无论开源还是闭源,任何足够复杂的硬件实际上都是难以检验的。就现代十亿级晶体管 CPU 而言,即使我们公开了完整的掩模组,如果没有实用方法在不破坏 CPU 的同时,以近原子级的程度验证掩模组和手中芯片间的等价性,那也是毫无意义的。
所以,到底为什么,相比闭源软件,我们觉得自己可以更加信任开源软件呢?毕竟,Linux 内核都有 2,500 万行代码了,而且贡献者里还包括向来就跟 “隐私” 或 “信任” 不搭界的企业。
个中关键就在于,软件有近乎完美的信任转移机制,用户可以把审计程序这种困难任务委托给专家去做,并将此审计结果精准转译到用户自己的程序副本中。有了这套机制,我们才可以不用担心软件程序的 “供应链”,不用先信任云才能信任我们的软件。
软件开发者使用 Git 等工具管理源代码(如上图所示,云在左边),用 Merkel 可信树跟踪代码修改。这些散列树将代码链向各自开发历史,使经审核后的代码不易被偷偷插入恶意代码。代码构建再经过散列和签名(如上图所示,密钥在中上部),可重现构建的项目支持第三方审计者下载、构建和证实(如上图所示,绿色对勾)用户下载的程序符合开发者的本意。
上一段讲了很多东西,重点是:软件中的信任转移机制依赖一种名为“散列”的东西。了解散列为何物的读者可以略过下一段内容;不了解的可以看看。
散列可将任意大文件转换为一组短得多的符号:比如,左侧文件转换为“🐱🐭🐼🐻”(猫-鼠-熊猫-熊)。这些符号有两个重要属性:
(1) 原始文件的些微改变都会导致符号组的巨大变化;
(2) 符号组基本上不会泄露关于原始文件的任何信息。
信任转移中起关键作用的是第一个属性:基本上,散列值是鉴别大量数据细微修改的一种快速可靠的方法。如上图所示,右边的文件动了一个数字,肉眼几乎不可查,但散列的改变就是天翻地覆一般——“🍑🐍🍕🍪”(桃子-蛇-披萨-曲奇)。
因为计算机源代码也不过就是 “0” 和 “1” 组成的字符串,我们也就可以对计算机源代码执行散列操作。这样一来,代码库中的任何修改就能快速检出了。多名开发人员协作的时候,每个代码贡献都用上一个贡献的散列值再行散列,构建出一棵散列树。重写已提交的代码贡献,将会改变树中此贡献点之后的所有东西。
为什么我们无需一条一条审查 Linux 内核 2,500 多万行源代码?因为我们可以信任专家团队,知道他们的知识和专业技能可以凭借散列的力量,转化进我们电脑上运行的程序副本中。
由于散列很容易计算,我们可以就在持续执行前加以验证——所谓堵上“检查时间 vs 使用时间” (TOCTOU) 缺口。程序检查时间与使用时间之间的窗口期越短,恶意黑客篡改代码的机会越少。
现在我们来看看硬件语境下的开源示意图,如上图所示。看起来是不是有点复杂?因为本来就这么复杂:你手里的硬件在你拿到之前早已被无数只手碰过了。
Git 可以确保原始设计文件不遭篡改,开放性有助于保证可信设备已 “尽最大努力” 加以构建和测试。然而,供应链中仍有很多人可以篡改该硬件,也没有什么 “硬件散列函数” 可以让我们将开发者的本意与手里实际拿到的硬件实例间画上等号。想要检查现代芯片,我们最多就是破坏性分拆芯片,一层一层揭下来用扫描电子显微镜 (SEM) 检查;或者弄一台房子一样大的显微镜来做叠层成像。
这就好像硬件版的海森伯格不确定性原理:你无法在不干扰其功能的同时确定计算机的构造。换句话说,对硬件而言,检查时间和使用时间是解耦的,为恶意黑客创造了篡改机会。
当然,我们完全依赖硬件来忠实计算软件中完美信任转移所需的散列和签名。一旦篡改了硬件,那所有这些机智的算法就顿时毫无价值了:被篡改的硬件完全可以伪造散列计算的结果,让恶意代码看起来跟合法代码毫无二致。
打造可信硬件的三个原则
现实情况就是这样,我们应该怎么做呢?难道我们就只能束手无策吗?有没有什么方案能够解决硬件验证问题?
我在这个问题上思考多年,总结出三条核心原则:
1. 复杂性是验证的敌人。缺乏散列、Merkel 可信树和数字签名等工具在开发人员和用户间转移信任,我们只能依赖自己的双眼评估硬件是否正确构造。使用工具和应用程序自动化验证不过是在迁移信任问题,因为无论工具自身能否经过验证,你都只能信任该验证工具的结果。所以,偏离肉眼查验越远,验证硬件的成本和难度就越高,呈指数型螺旋上升趋势。理想状态下,硬件要么是普通用户都能轻松验证,要么在社交网络二度以内的 “可信” 人脉技术帮助下加以验证。
2. 验证整个系统而不仅仅是组件。如果键盘和显示器有后门,验证 CPU 没什么用处。所以我们的检查范围应从用户界面一路涵盖到执行秘密计算的芯片。尽管 Keystone 和 OpenTitan 等开源安全芯片项目备受推崇,是可信硬件生态系统的重要组成部分,但单靠它们自身并不足以保护用户的隐私。
3. 让用户能够验证和封装自己的硬件。将验证和密钥生成委托给中心权威机构,会使用户暴露在各种供应链攻击面前。因此,终端用户要有足够的文档来查验自己的硬件是否正确构建。一旦经过验证且拿到密钥,还需封装硬件,以便用户无需每次设备离身之后都得再做一遍费时费力的重新验证过程。总的说来,封装越好,无需担心设备中秘密资料被实体抽出的时间也就越长。
不幸的是,第一条和第二条原则一起颠覆了我们对当今电子设备和计算机的预期。行业诞生之初,计算机制造商就一直在比拼谁往越来越小型的机器里塞入更多的功能,憋着劲儿增加计算机的复杂性。因此,我们实际上根本不可能验证现代硬件,无论开源还是闭源。相反,如果可信度是首要考虑,务必选取有限的功能集,围绕这些必需功能设计最小可行可验证产品。
Betrusted 的简单性
为证实我们的想法,我和 Sean ‘xobs’ Cross,还有Tom Mable,启动了名为 “Betrusted” 的项目,打算将这些原则转化为可实际验证的可信设备。根据第一条原则,我们缩减了设备的功能,只包含安全文本和语音聊天、双因子身份验证和数字货币存储的功能。
这意味着 Betrusted 无法浏览网页;没有“应用商店”;没法帮你叫车;也不能导航。不过,这东西能保护你的私密对话;赋予你健壮的身份验证第二因子;还能提供存储数字货币的安全场所。
为符合第二条原则,我们延伸了 Betrusted 的一系列外设,将信任边界扩展至用户的眼睛和指尖。这就将 Betrusted 与仅开源芯片的安全飞地项目区别开来了。
可验证 I/O
举个例子,Betrusted 的输入接口是实体键盘。实体键盘不过是由开关和导线构成,便于检查。
Betrusted 的键盘只需对着光线就能检查,还支持更换键盘膜以便使用不同语言。
Betrusted 的输出界面是 200ppi 的黑白液晶显示器,具备电子报或纸媒的性能,足以满足绝大多数文字聊天、身份验证和银行应用。该显示器的电路全由大号晶体管组成,对着明亮的光线用个 USB 显微镜就能看清。下图是 50 倍放大率的显微镜下看到的显示器一角。
此显示器构造如此简单,是为了不给隐藏后门留余地。能看到每个晶体管是一方面,更重要的是,就没有多余的晶体管可以挂载攻击。
相比之下,彩色显示器依赖硅板上几百万个晶体管实现帧缓冲和命令界面,而且这控制器芯片是闭源的。即使此类控制器芯片开源,要检查验证也需要逐层剥离和用臊面电子显微镜查看。所以,Betrusted 所用 LCD 的可检性和简单性在显示器世界中可谓独一份。
可验证的 CPU
CPU 自然是问题的核心。我仔细想过非破坏性芯片检查方法。就算有这种检测方法,估计没有几千万美元和两年时间也是完不成概念验证系统执行的。这就可能涉及到追逐风险资本,然后导致解决方案变成闭源。虽说闭源有机会通过向政府和企业售卖服务和许可专利技术而变身亿万富翁,我是挺担心普通人估计就无法受惠了。
短期妥协的解决方案就是使用现场可编程门阵列 (FPGA)。我们依靠逻辑布局随机化来缓解固定芯片后门的威胁,依赖比特流自省来辅助设计者到用户的信任转移。如果不关心这些技术细节,可以直接跳到下一段。
我们打算用在 Betrusted CPU 中的 FPGA 是 Xilinx “7系列”中的 Spartan-7,因为其 -1L 型号在能耗上胜过 Lattice ECP5 FPGA 2-4 倍。采用低能耗 FPGA 能让 Betrusted 设备从半天就自动关机,提升到电池电量能撑一整天。其不利一面是,Spartan-7 FPGA 是闭源器件,目前依赖专有编译器。不过,已出现一些令人振奋的发展,有助缓解 FPGA 工具链恶意植入或篡改威胁。比如:
检查已编译比特流的能力将 CPU 问题带回到与软件类似的情景,也就是我们能用数学工具将信任元素从设计者有效转移至硬件层面上。因此,尽管晶体管级的 FPGA 构建细致检查是不可行的(但因其结构规律,FPGA 检查仍比通用 CPU 检查来得容易),FPGA 的逻辑和路由不确定性、可驱动比特流检查的新工具,以及 100% F/OSS 解决方案编译设计的前景,大幅提升了基于 FPGA 的 CPU 验证与信任转移的标准。
上图:FPGA 设计工具中强调的信号,表明设计意图可关联至 FPGA 中的硬件块。
有人可能会说,只有开发出非破坏性定制芯片检测方法,FPGA 才可以作为可验证可信硬件的黄金标准。毕竟,即使掩模级芯片设计开源,怎么确定自己手中的芯片忠实实现了每一个设计功能呢?
上面描述的系统触及简单性第一原则和从用户界面到芯片验证的第二原则。第三原则——检查验收后用户对设备的封装,7 系列 FPGA 也是可以达成的。
将秘密封在 Betrusted 里
透明性是验证的好朋友,但用户还需能够封装硬件,保护自己的秘密。理想工作流中,用户应可以:
1. 收到 Betrusted 设备;
2. 通过视觉检查和 FPGA 比特流随机化与自省,确认其正确构建;
3. 以密钥封装 Betrusted 设备。
理想状态下,密钥应完全由 Betrusted 设备自行生成,一旦封装,应 “难以” 被黑客直接接触设备以盗取或篡改这些密钥。
密钥生成和自封装应可用 7 系列 Xilinx 设备实现。因为Xilinx 的 FPGA 硬件内置了比特流加密功能。撰写此文的时候,我们已对此加密格式和熔断机制有了几近充分的了解,可提供完全自托管的密钥生成与封装 F/OSS 解决方案。
至于这种封装有多好,答案可能有点儿技术流。简单讲就是,应该没人能借走 Betrusted 设备几个小时就抽取到密钥,抽取密钥的任何尝试都将在硬件上留下永久性的改动。更具体一些,Xilinx 7 系列设备很流行,历经广大安全社区的广泛审查。针对这些设备所用 256 位 CBC AES + SHA-256 HMAC 加密的著名攻击,利用硬件边信道泄露 AES 轮间信息。此类攻击要求对硬件的无限访问,需要 24 小时时间从 160 万所选密码收集数据。虽然可以改进,但要记得,用聚焦离子束物理检查抽取密钥,这种开箱成像操作消耗的时间也大约是 24 小时。换句话说,保护硬件内秘密的程度更多是由物理篡改防护措施决定的,严格加密措施反而作用没那么大。
更进一步,既然边信道攻击原理已被披露,我们就能应用简单的缓解措施挫败此类攻击,比如贴封条,或者移除向 FPGA 呈现所选密码的必要外部配置和调适接口。用户还可以选择使用通用 SRAM 加密密钥,这种掉电即失,大大增加了取下 FPGA 或修改电路板的风险。当然,这样也带来了备用电源中断时意外丢失密钥的代价。
但至少,用 7 系列设备,用户可以确知自己的设备是否被物理篡改,这是个好的开始;从防篡改的角度看,已经是用户所能期待的全部了。
可以访问 Betrusted 项目在 GitHub 上的页面 https://betrusted.io,了解更多相关信息。我们认为 Betrusted 更像是“硬件/软件发行版”,而不仅仅一个硬件产品。我们希望 Betrusted 能够分叉,适应我们多样化数字生态系统的各种不同需求和用户场景。我们是否制作完整 Betrusted 参考设备售卖,将取决于社区的反馈;目前已经收到关于此类设备真正需求的大量意见与建议。
信任 Betrusted vs 使用 Betrusted
我个人认为 Betrusted 是可验证可信硬件探索的一种进化而非终结。为什么开放性不足以解决硬件中的信任问题?我花了几年时间将个中原因提炼成几条简明扼要的原则。我很确定,随着我们对用例、威胁模型和可用工具的理解加深,这些原则也会进化发展。
我个人开发 Betrusted 的动机,是为了与我的非技术朋友们享有私密对话。因此,其另一个巨大障碍自然就是用户接受度:你对隐私安全重视到愿意花时间验证硬件的程度吗?验证硬件要花费时间精力,iPhone 很好用,苹果公司的隐私宣传很高调。而且,“无论如何,我这种好人当然‘君子坦荡荡’啦”。或许,我们打造真正可验证可信通信设备的异想天开尝试,不过会被大众当成某个新奇小玩意儿。
即便如此,我这至少启动了关于硬件信任问题的讨论,将这个问题具体地阐述出来。我们是在奠定让他人可以通往更安全、更私密、更可信数字未来的框架。
感谢 NLnet 基金对 Betrusted 团队的支持。
报告原文:
https://www.bunniestudios.com/blog/?p=5706