可编程逻辑
今年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-basedMessageAuthenticationCode)方法进行鉴权。
可以想象,如果比特流的加密过程被破解,那么攻击者就可以读出比特流文件中的所有信息,从而进行反向工程、IP破解、信息收集等工作。如果鉴权过程被破解,那么攻击者就可以对比特流文件进行任意修改,比如修改系统功能、木马注入等。所以说,这两种保护方式缺一不可。
只可惜,这次的StarBleed漏洞恰恰利用了这两种保护方式各自的短板,从而彻底破解比特流的加密和鉴权,并达到了完全控制比特流和FPGA芯片的目的,可以说这个漏洞的破坏性和潜在危害性极强。
StarBleed漏洞的具体攻击方法
整个攻击过程分为两大部分,第一是对加密的比特流文件进行破解,第二是获取鉴权密钥。
为了破解加密的比特流文件,攻击者利用了赛灵思FPGA里的一个特殊的配置寄存器WBSTAR,这个寄存器原本保存了FPGAMultiBoot功能的起始地址,当启动FPGA时,就通过读取这个寄存器从片外非易失性存储器找到映像文件。因此,当FPGA复位时,这个寄存器的内容是不会被抹掉的。
对加密比特流的破解过程分为5个步骤。
第一步,攻击者对一个合法的比特流文件进行了简单篡改。具体来说,他需要修改比特流的一个32位字,将其改成对WBSTAR寄存器的写操作。写入的内容,就是比特流本身。
虽然比特流是加密的,但这个篡改过程并没有想象中那么困难。由于Vivado生成的比特流文件的格式和很多内容是固定的,攻击者可以对比不同的比特流文件,从而确定对WBSTAR寄存器操作命令的位置,然后对其进行修改即可。由于篇幅所限,这部分的具体的细节不再赘述,欢迎在知识星球或微博与老石进一步交流。
比特流数据结构,灰色部分是加密的内容
第二步,将篡改后的比特流加载到FPGA里。此时,FPGA会对比特流进行解密,并将一个32位字写入WBSTAR寄存器。值得注意的是,这里写入的是已经解密的比特流内容!
第三步,加载完毕后,由于比特流发生了修改,因此校验失败,并自动触发系统复位。
第四步,使用另外一个未加密的比特流文件,读取WBSTAR寄存器的内容。由于WBSTAR寄存器的特殊性,它的内容不会随着复位而清除。因此,此时攻击者再使用另外一个未加密的比特流文件读取这个寄存器的内容,就可以得到解密后的FPGA比特流的32位内容了。这个未加密的比特流文件已开源,请在文末扫码进入知识星球查看。
第五步,手工复位,然后重复上述步骤,直到整个比特流都解密完成。
可以看到,攻击者利用了上面提到的鉴权过程晚于加解密过程这个缺陷,通过“蚂蚁搬家”的方式完成了对比特流的完全解密。最可怜的是,此时的FPGA本身也沦为了帮助解密的工具。这也解释了为什么只能通过更换FPGA芯片才能修补这个漏洞。
下面的表格总结了不同的7系列FPGA的比特流大小,以及解密所需要的时间。读出一个32位字大概需要7.9毫秒,那么破解一个KintexFPGA的比特流就大概需要3小时42分钟。
接下来,就可以对鉴权过程进行破解了。这个过程相对简单,事实上,身份校验所需的HMAC密钥就存储在比特流文件中,并且未经其他额外的加密。这正是所谓的“谜底就在谜面上”。所以只需要读取完整的比特流,就可以免费附赠HMAC密钥一枚。有了它,就可以任意修改比特流文件的内容,并重新计算身份校验。此外,攻击者甚至可以修改HMAC密钥本身。
综上所述,StarBleed漏洞正是利用了赛灵思7系列FPGA的两大设计缺陷:
1.身份校验发生在解密过程之后
2.身份校验的密钥直接存储在加密后的比特流文件里,且无额外加密
通过StarBleed漏洞,攻击者破解了全系列的赛灵思7系FPGA,包括SAKURA-X板卡上的Kintex-7,Basys3板卡上的Artix-7等等。同时,攻击者还利用同样的原理攻击了6系FPGA,例如ML605板卡上的Virtex-6FPGA,也能实现不完全破解。
防御方法
由于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安全性设计。亡羊补牢,犹未晚也。
全部0条评论
快来发表一下你的评论吧 !