无需漏洞也能攻破:云计算FPGA的重大安全隐患

以下文章来源于老石谈芯 ,作者老石谈芯的老石

老石谈芯
老石谈芯

FPGA相关的各种芯文、芯情、芯事


当前,FPGA已经成为云数据中心里重要的硬件加速单元。例如,在之前的文章中详细介绍过微软的“Catapult”项目。通过这个项目,微软在Azure云数据中心里部署了上百万个基于FPGA的智能网卡,并使用FPGA对一系列应用进行了硬件加速。这其中包括必应搜索(Bing)的文件排名运算,以及通过FPGA构建的实时AI系统“Brainwave”。


亚马逊AWS则采用了名为FPGA即服务(FaaS的业务模式,也就是将FPGA作为了AWS云的硬件加速实例,面向云服务的广大用户和开发者。这种业务模式提供了FPGA云服务的完整基础设施架构,包括FPGA的开发、调试、部署、维护等等,使得开发者可以直接利用云中的FPGA资源进行算法的硬件加速和开发。腾讯云、阿里云、华为云等公有云提供商也纷纷跟进,也在云服务中加入了FPGA的硬件加速实例。


然而,随着FPGA在云数据中心的不断部署,由此引发的安全性隐患也逐渐成为业界关注的重点之一。和CPUGPU、网络交换芯片等数据中心常见的硬件单元不同,FPGA带来的潜在安全性问题有着非常独特的一面。


一方面,FPGA芯片本身可能存在高危漏洞。在之前的文章中,我们介绍过赛灵思的7系列FPGA被曝出名为“StarBleed”的漏洞,它使得攻击者能同时攻破FPGA配置文件的加密和鉴权两个重要环节,并由此随意更改FPGA中实现的逻辑功能。这个漏洞的严重之处在于,一旦FPGA芯片被攻破,就无法通过软件补丁的方式进行修复,而只能停机换芯片。


另一方面,由于FPGA的特殊性,即使芯片没有任何功能漏洞,攻击者也可以使用一些很巧妙的手段进行破坏性的操作,并破解并窃取加密信息。今天这篇文章,就将介绍这其中的一个攻击方法。


FPGA虚拟化与多租户FPGA


FPGA云计算应用中,虚拟化技术是目前比较常见的FPGA管理和资源调度方式。关于FPGA虚拟化技术,有兴趣的读者可以看看老石之前的文章FPGA虚拟化:突破次元壁的技术》,里面详细介绍了FPGA虚拟化的很多技术细节。简单来说,虚拟化技术在传统的FPGA开发层级中加入了额外的一层,从而将用户的应用逻辑与底层硬件分离开,使开发者无需太关心硬件的实现方式,这能大幅降低FPGA的开发难度,缩短开发周期。



通过FPGA虚拟化技术,就可以实现在单个FPGA上划分出多个逻辑区域,并分配给不同的用户进行使用,这就是FPGA的多租户(Multi-tenent)技术。


在多租户FPGA中,理论上不同用户的区域是相互独立的,这可以通过划分不同的FPGA设计区域实现。不同的用户并不会共享FPGA上的逻辑资源,此外,他们的FPGA配置文件、上层软件等都应该是加密和独立的。这些都由虚拟层进行调度和管理,在技术上,这可以通过FPGA的部分可重构(Partial Reconfiguration)特性实现。


例如,下图中就展示了两种不同的多租户FPGA实现方法,第一种使用了两个相互独立的设计区域,第二种则实现了多个用户设计A、B、C、D在FPGA上的混合排列。



事实上,不同用户的设计区域很难做到完全独立。比如,在同一个FPGA芯片上,供电、时钟等全局资源往往需要共享。仅仅如此,就会给多租户FPGA设计带来安全隐患。


针对FPGA的电压攻击


在今年的FCCM大会上,来自马萨诸塞大学的Russell Tessier教授做了名为“Security and Privacy Concerns for the FPGA-Accelerated Cloud and Datacenters”的报告,并介绍了一种针对FPGA的电压攻击方法。


这篇论文的全文和大会报告,已上传至知识星球“老石谈芯 - 进阶版”,请于文末扫码进入星球查看。


简单来说,攻击者可以在FPGA上实现一些消耗大量功耗的电路,由此会引发芯片上电压的下降。由于使用同一个FPGA的用户共享芯片上的供电网络,这种电压下降会波及到FPGA上其他用户的设计区域。值得注意的是,这种利用电压进行攻击的方式会无视多租户之间相互独立的逻辑区域。


一旦电压下降过大,就会带来很多问题。其中最主要的问题,就是会造成电路延时的增加。这样一来,原本时序收敛设计就不能满足时序,从而造成各种错误的功能和计算结果。


例如,对于常见的加法运算来说,它的关键路径取决于最长进位传播(carry propagation)的时间。正因此,FPGA中内置了固化的进位链结构,以提高进位传播的速度。然而,一旦电路延时增加,可能会导致时钟沿到来时,加法的进位尚未完成传播,由此导致计算结果出现重大误差。


下图就是一个行波进位加法器(Ripple Carry Adder)的例子,它计算四位二进制加法1111 + 0001时,应该得到二进制数10000(十进制16),但由于电压降低导致延时增加,使得进位未能传播到最高位,最终得到的结果是00000。



耗电单元(Power Waster)


可以看到,这种电压攻击的关键,就是在FPGA上实现某种可以消耗大量功耗的电路数字电路的一个重要知识点是,动态功耗和所谓的开关速率(switch activity)呈线性相关,也就是下面这个公式中的f。因此只要实现一个能高速进行状态切换的电路,就能消耗大量功耗。


基于此,这种耗电模块事实上非常简单,可以直接用一阶环形振荡器实现,见下图。



实验表明,当例化28000个这样的环形振荡器时,每个振荡器可以消耗2.2mW的功耗,并由此带来芯片上电压的迅速下降。在下图中可以看到,50微秒之内,离这些耗电单元最近区域的电压(黑线)就由1.1V下降到0.85V左右。如果离耗电单元稍远,也会出现不同程度的电压下降,甚至在芯片的边缘部分也会受到波及。



使用这种电压攻击的方法,除了可以对其他用户的电路功能造成破坏之外,还可以用来窃取其他用户的加密信息。例如,Tessier教授就展示了如何破解并获取RSA算法的私钥。简单来说,有一种名为中国剩余定理(CRT,也称为孙子定理)的算法,在实现RSA计算时可以得到4倍的性能提升。然而,如果在这个过程中通过电压攻击的方法引入错误的计算结果,就会简单的反推出RSA的私钥,并且这个过程与RSA密钥长度无关,且只需要一次迭代就可以完成。这个过程的具体细节在本文不再赘述,有兴趣的读者可以在知识星球“老石谈芯进阶版”或微博与我互动讨论。


《孙子算经》中的物不知数问题


FPGA电压攻击的防治策略


如前文所述,这种基于大量耗电单元、并导致芯片电压下降和电路延时增加的攻击方式,会对使用FPGA的全部用户都造成影响,而且不受设计区域划分的限制。与之前介绍过的StarBleed漏洞不同,这种攻击方法并不利用FPGA芯片本身的设计缺陷,而是利用了FPGA的特点,大量例化耗电单元并实施攻击。因此这种方法理论上适用于任何FPGA。


为了应对这样的新型攻击方式,一种防御方法就是在芯片上布置若干电压检测模块,并实时监控不同区域的电压值。如果一旦出现电压攻击,这些检测模块就可以锁定导致电压下降的源头,并配合管理软件对这个用户区域进行封锁。


在下图中,使用了12000个耗电模块,以及不同数量的电压检测单元,出现异常的电压检测单元以黑点表示。可以看到,当使用40个电压检测单元时(最右图),就可以把攻击源头锁定在一个相对较小的区域中。



此外,电压下降带来的延时增加并非都是坏事。这涉及到一个重要的思维方式的转变。近年来,一个比较流行的研究领域叫做“近似计算”,即Approximate Computing。它的主要观点是,在很多特定的应用场景中,并不需要做到100%的精确计算,而这会带来可观的性能提升与功耗降低


例如,有人专门对FPGA数学运算进行过近似计算的研究。事实上,对于上文提到的4位行波进位加法器,它的最长进位链出现的概率只有3.1%。也就是说,在某种程度的电压攻击时,有96.9%的概率不会影响计算结果。


关于近似计算的内容,本文也不再展开。上面提到的这个FPGA近似计算的研究,老石会上传到知识星球,欢迎文末扫码进入星球查看并参与讨论


结语


当前,FPGA云计算领域的应用正在蓬勃兴起。使用FPGA虚拟化技术,让多个用户共同使用同一个FPGA的硬件加速资源,也成为了一种常见的FPGA业务模型。然而,这种业务模式也带来了一些前所未有的安全性问题。本文介绍的利用耗电单元进行FPGA电压攻击的方法,就是这其中的一个。


事实上,从FPGA出现至今,在大部分情况下它都是作为单一用户的器件而存在的。也就是说,正是FPGA使用场景的不断扩展,才会出现这些人们从未考虑过的问题,并由此引发对FPGA技术本身更多、更新的思考。而这也将推动整个行业不断向前迈进。


(注:本文仅代表作者个人观点,与任职单位无关。)




免责声明:本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,我们将立即删除内容!本文内容为原作者观点,并不代表本公众号赞同其观点和对其真实性负责。



END