今年 4 月,来自德国的研究者披露了一个名为“StarBleed”的漏洞,它存在于赛灵思的 Virtex、Kintex、Artix、Spartan 等全部 7 系列 FPGA 中。通过这个漏洞,攻击者可以同时攻破 FPGA 配置文件的加密(confidentiality)和鉴权(authenticity),并由此可以随意修改 FPGA 中实现的逻辑功能。更严重的是,这个漏洞并不能通过软件补丁的方式修复,一旦某个芯片被攻破,就只能通过更换芯片的方式修复。

 

 

漏洞的发现者已于 2019 年 9 月将这个漏洞知会了赛灵思,并在第二天就获得了赛灵思的承认。根据赛灵思之前发布的财报,7 系列 FPGA 贡献了公司 35%的营收。这些 FPGA 被广泛用于通信设备、医疗、军工宇航等多个领域,而这些领域很多都需要系统有着很高的稳定性与安全性。因此,这次爆出的重大漏洞,无疑会对赛灵思及其客户带来较大的负面影响。

 

 

近年来,有关 CPU 的漏洞时有发现。例如在 2018 年初,几乎全部主流的 CPU 厂商都被发现在其 CPU 产品中存在熔断(Meltdown)和幽灵(Spectre)漏洞。相比之下,FPGA 的漏洞问题并不那么“常见”。在这篇文章中,老石将深入解析造成这个漏洞的技术原因,并总结一些可行的应对方法与预防措施。

 

关于详细介绍这个漏洞的论文全文,已上传至知识星球“老石谈芯进阶版”,请于文末扫码进入星球查看。

 

FPGA 的主要加密方式

随着 FPGA 在数据中心、通信基础设施、AI 加速、医疗设备、边缘计算等多个领域的广泛使用,针对 FPGA 安全性的研究在近年来逐渐成为学术界和工业界关注的热点之一。

 

与 CPU、ASIC 等芯片相比,FPGA 芯片本身并不会完成任何逻辑功能,它只包含大量的可编程逻辑阵列,以及若干固化的 IP 核。FPGA 系统功能的实现,基本完全取决于开发者的逻辑设计。由于不同的设计者可以开发不同的系统逻辑,这就使得相同的 FPGA 芯片可以广泛用于众多不同的行业领域。通常来说,一个 FPGA 设计都是由很多 IP 组合而成,而这些 IP 才是 FPGA 设计中最有价值的部分。

 

为了将设计加载到 FPGA 中运行,唯一的方式就是通过一个所谓的“比特流(bitstream)”文件完成,业界也通常称之为系统映像。系统映像由 FPGA 设计软件自动生成,它包含了 FPGA 设计的全部信息,因此是 FPGA 加密环节的重中之重。

 

通常来说,对比特流或系统映像文件的保护方式有两个层面,第一是加密,第二是鉴权。加密指的是使用特定算法对比特流文件进行处理,将其转换成密文,使得其中的内容对外不可见。在赛灵思的 7 系列 FPGA 中,使用了 CBC-AES-256 算法进行比特流加密。

 

鉴权指的是对加密后的比特流文件进行身份验证,防止对其进行篡改和删减,这类似于我们日常生活中的身份验证。如果比特流文件被修改,势必会导致错误的鉴权结果。如果将这个比特流下载到 FPGA 中,会因为身份校验失败而拒绝执行,从而避免被攻击的可能。在赛灵思的 7 系列 FPGA 中,使用了基于 SHA-256 的 HMAC(散列消息认证码,Hash-based Message Authentication Code)方法进行鉴权。

 

可以想象,如果比特流的加密过程被破解,那么攻击者就可以读出比特流文件中的所有信息,从而进行反向工程、IP 破解、信息收集等工作。如果鉴权过程被破解,那么攻击者就可以对比特流文件进行任意修改,比如修改系统功能、木马注入等。所以说,这两种保护方式缺一不可。

 

只可惜,这次的 StarBleed 漏洞恰恰利用了这两种保护方式各自的短板,从而彻底破解比特流的加密和鉴权,并达到了完全控制比特流和 FPGA 芯片的目的,可以说这个漏洞的破坏性和潜在危害性极强。

 

StarBleed 漏洞的具体攻击方法

整个攻击过程分为两大部分,第一是对加密的比特流文件进行破解,第二是获取鉴权密钥。

 

为了破解加密的比特流文件,攻击者利用了赛灵思 FPGA 里的一个特殊的配置寄存器 WBSTAR,这个寄存器原本保存了 FPGA MultiBoot 功能的起始地址,当启动 FPGA 时,就通过读取这个寄存器从片外非易失性存储器找到映像文件。因此,当 FPGA 复位时,这个寄存器的内容是不会被抹掉的。

 

对加密比特流的破解过程分为 5 个步骤。

 

第一步,攻击者对一个合法的比特流文件进行了简单篡改。具体来说,他需要修改比特流的一个 32 位字,将其改成对 WBSTAR 寄存器的写操作。写入的内容,就是比特流本身。

 

虽然比特流是加密的,但这个篡改过程并没有想象中那么困难。由于 Vivado 生成的比特流文件的格式和很多内容是固定的,攻击者可以对比不同的比特流文件,从而确定对 WBSTAR 寄存器操作命令的位置,然后对其进行修改即可。由于篇幅所限,这部分的具体的细节不再赘述,欢迎在知识星球或微博与老石进一步交流。

 

比特流数据结构,灰色部分是加密的内容

 

第二步,将篡改后的比特流加载到 FPGA 里。此时,FPGA 会对比特流进行解密,并将一个 32 位字写入 WBSTAR 寄存器。值得注意的是,这里写入的是已经解密的比特流内容!

 

第三步,加载完毕后,由于比特流发生了修改,因此校验失败,并自动触发系统复位。

 

第四步,使用另外一个未加密的比特流文件,读取 WBSTAR 寄存器的内容。由于 WBSTAR 寄存器的特殊性,它的内容不会随着复位而清除。因此,此时攻击者再使用另外一个未加密的比特流文件读取这个寄存器的内容,就可以得到解密后的 FPGA 比特流的 32 位内容了。这个未加密的比特流文件已开源,请在文末扫码进入知识星球查看。

 

第五步,手工复位,然后重复上述步骤,直到整个比特流都解密完成。

 

可以看到,攻击者利用了上面提到的鉴权过程晚于加解密过程这个缺陷,通过“蚂蚁搬家”的方式完成了对比特流的完全解密。最可怜的是,此时的 FPGA 本身也沦为了帮助解密的工具。这也解释了为什么只能通过更换 FPGA 芯片才能修补这个漏洞。

 

下面的表格总结了不同的 7 系列 FPGA 的比特流大小,以及解密所需要的时间。读出一个 32 位字大概需要 7.9 毫秒,那么破解一个 Kintex FPGA 的比特流就大概需要 3 小时 42 分钟。

 

 

接下来,就可以对鉴权过程进行破解了。这个过程相对简单,事实上,身份校验所需的 HMAC 密钥就存储在比特流文件中,并且未经其他额外的加密。这正是所谓的“谜底就在谜面上”。所以只需要读取完整的比特流,就可以免费附赠 HMAC 密钥一枚。有了它,就可以任意修改比特流文件的内容,并重新计算身份校验。此外,攻击者甚至可以修改 HMAC 密钥本身。

 

综上所述,StarBleed 漏洞正是利用了赛灵思 7 系列 FPGA 的两大设计缺陷:


1. 身份校验发生在解密过程之后


2. 身份校验的密钥直接存储在加密后的比特流文件里,且无额外加密

 

通过 StarBleed 漏洞,攻击者破解了全系列的赛灵思 7 系 FPGA,包括 SAKURA-X 板卡上的 Kintex-7,Basys3 板卡上的 Artix-7 等等。同时,攻击者还利用同样的原理攻击了 6 系 FPGA,例如 ML605 板卡上的 Virtex-6 FPGA,也能实现不完全破解。

 

 

防御方法

由于 StarBleed 漏洞直接利用了赛灵思 7 系列 FPGA 芯片的设计缺陷,且攻击过程直接在加载映像文件时展开,因此不能使用软件补丁或固件升级的方法规避这个漏洞。目前唯一的修复方法只有更换芯片,赛灵思官方已经向研究者承认了这一点。

 

事实上,攻击者使用这种方法无法破解 UltraScale 或更新的 FPGA 系列。这说明上面所说的设计缺陷已经在新型 FPGA 架构中得到了修复。例如,首先对比特流文件进行鉴权,通过后再进行加载。

 

虽然除了换芯片外没有完全防御的方法,我们仍然可以采用一些设计手段增加破解的成本和复杂度。一个常见的方法是在设计中增加额外的冗余逻辑,这些额外的部分并不影响逻辑功能,但会极大的提升设计的复杂度,从而增加破解的时间成本。比如,在状态机中增加很多无用状态等等。

 

此外,还可以在板卡设计时封锁 FPGA 的配置端口,比如研究者使用的 JTAG 和 SelectMAP 端口等。事实上,在量产的 FPGA 设计中,应该也很少有暴露的 JTAG 端口。

 

同时,研究者还思考了如何尽早发现这类设计缺陷和漏洞,而形式化方法就是一个很好的解决手段。设计者可以根据芯片的设计规约,建立形式化模型,并通过满足性验证(satisfiability)等方式对这个模型进行分析和证明。老石在之前的文章《形式化芯片验证:救世主还是乌托邦》中,曾对形式化方法做过详细介绍,有兴趣的读者可以看看。

 

结语

FPGA 的安全性研究并非一个全新的课题。然而,传统的 FPGA 攻击方法都需要使用额外的物理设备或操作,实用性远不如此次爆出的 StarBleed 漏洞。

 

一旦 FPGA 被攻破,攻击者可以任意读取 FPGA 比特流的数据、IP 内容等,并实现反向工程;也可以任意改变 FPGA 实现的逻辑功能,这使得 FPGA 所在的系统可能沦为攻击者的高性能“肉鸡”。由于 FPGA 能以 40Gbps 甚至更高的速度线速发送数据包,这使得大规模 DDOS 攻击变得“简单”。此外,攻击者也可以通过逻辑实现的方式,大幅提升芯片温度并对系统硬件进行不可逆的物理破坏,等等。

 

可以说,这次的 StarBleed 漏洞给业界敲响了警钟,也将会提升人们对 FPGA 安全性的重视,并以此指导未来的 FPGA 安全性设计。亡羊补牢,犹未晚也。