SC 2022议题解读:采用Fuzzing技术防护高性能计算静默数据损坏安全风险

百家 作者:百度安全应急响应中心 2022-06-22 15:55:37

1.背景

随着硬件工艺的进步,CPU中的晶体管密度不断增大,计算机中发生软性错误(soft error)的概率急剧增加。软性错误是计算机系统中无序产生的0-1比特反转。与因硬件缺陷或者可靠性裂化导致的硬性错误不同的是,软性错误并不损坏硬件,而会在CPU无法察觉的时候间接改变硬件计算或存储单元中的数据。比如,在计算机运行时,一些随机事件会将CPU计算单元中的数个比特的数据状态进行改变,并在后续的计算中造成错误传播,损坏正在运行的应用层软件中的数据,带来静默数据损坏(Silent Data Corruption,简称SDC)。SDC无法被CPU的错误报告机制捕获,往往导致软件运行可正常结束但计算结果却莫名错误,且在大型系统尤其是超算环境中该类安全风险极其隐蔽并难复现,被工业界和学术界普遍认为是未来高性能计算中的十大挑战之一[1]。
近年来SDC问题在大规模计算系统中频繁出现,由于其隐蔽性难以对其进行溯源,一旦发生严重事故往往需要数周甚至数月时间进行追踪和调试,严重影响软件可靠性并会造成重大经济损失。如Sun公司(已被Oracle收购)在1996年因为系统上软性错误造成的SDC故障流失了大量重要客户。Meta的研究人员在其2021~2022年的实验[2,3]中披露,通过在全球数据中心数十万台机器上超过18个月的实验发现,除去海拔、气候和辐射等环境原因,足够大的计算规模和运行时长会积累带来大量反复出现的SDC问题。其损坏的数据无法监测,并且会在大型高并发系统的运算过程中传播,带来结构性风险。因此,解决SDC不仅需要可靠的硬件监控,亦需要健壮的软件实现。
传统的硬件保护策略如双模冗余或者三模冗余虽然可以有效发觉程序中潜在的SDC,但是因为其所带来的高能耗和额外空间为芯片设计带来了极大的负载,导致其难以应用于实际。由此,软件层级的保护因为其易开发、跨平台和低能耗的特性,成为了抵御SDC有效的保护策略。其中,右图所示的选择性指令复制(Selective Instruction Duplication,简称SID)有选择的对程序中比较脆弱的指令进行复制,通过引入的比较指令(CMP)去检测原有指令和复制指令中的不匹配情况,进而保护程序抵御SDC。SID具有开销灵活、泛化性强、平台无关的特点,已成为可靠性领域的热点。


2.问题揭秘:SID和程序输入

对一个程序进行SID保护之前,首先需要得知程序中的哪些指令相对而言更为脆弱,即每个指令的保护代价和保护收益。指令的保护保护代价,即该指令在当前程序中运行的时间开销,可以通过编译器层级的程序分析技术获得;而指令的保护收益,即保护该指令后可以降低多少潜在的SDC,一般可以通过错误注入(Fault Injection)获得。错误注入是可靠性研究领域的常用技术,通过人为的对程序运行引入错误,去模拟真实场景中软性错误的发生。然而,由于SID中对于指令的保护收益的评估依赖于错误注入,且错误注入依赖于程序输入,这造成了现有的SID保护策略都是基于单一的程序输入的。在现实场景中,程序输入的选择是海量且随机的,传统的SID的保护效能被急剧减弱。因此,如何对SID进行增强,使其在任何程序输入下都可以有效抵御SDC,成为了高性能计算可靠性领域亟待研究的难点。
我们对于改变程序输入造成原有SID保护效能急剧下降的情况进行了深入的分析。观察发现,有一类指令的执行状态的变化是造成SID保护效能的下降的主要原因,我们将其命名为“潜伏指令”(Incubative Instruction)。如下图所示,潜伏指令在SID评估其保护收益的程序输入下不容易对程序造成SDC,风险判定较低,所以往往不被SID所保护。但是当改变输入的时候,潜伏指令对SDC的容错能力急剧下降,其原有的判定失效,本应该被保护的指令此时却没有被SID所保护。由此可得,如何快速、精准地定位程序中的潜伏指令,是在多程序输入下增强SID保护的关键。


3. MINPSID技术解析

与传统的SID方法相比,面向所有程序输入的方法需要精准定位潜伏指令,并对其加以保护,这为解决问题的方法设计带来了独特的挑战。首先,软件程序的设计目的、开发风格和输入格式千差万别,量化并比较程序输入的方法需要具有普适性;其次,高性能软件程序所处理的问题较为复杂,一般具有较大的时间开销,故定位潜伏指令需快速且自动化;最后,为了实现SID在多个程序输入下的增强,潜伏指令需要和传统SID所面向的全部指令相结合,并作出最优的取舍。

针对以上的挑战,我们设计了解决方案MINPSID,其流程图如上所示。整体来看,技术可以分为两个部分:(1)包含重排列机制的SID主体算法(包括图中1、2、8、9和10)和(2)对潜伏指令的输入搜索引擎(包括图中的3、4、5、6和7)。
首先针对任意给定的程序代码,我们使用默认输入对其中每条指令进行等量重复的错误注入实验,其目的是获取每条指令的保护代价和保护收益。其次我们使用Fuzzing技术获取和所有历史输入中差异性最大的输入,以评估尽可能少的输入来获取更多的潜伏指令,进而加速其在高性能计算环境下的模型部署。为了评估程序中不同输入的差异性,我们在编译器层级设计了程序变换,如下图所示,通过程序在该输入下的一次执行,获得其加权控制流图,并转化为被索引的程序控制流图数组。通过计算不同输入所对应的控制流图数组之间的欧几里得距离,程序的差异性可以得到精准地量化。我们由此作为激励函数并构建Fuzzing引擎,经过迭代并达到收敛状态后,即可获得和原输入相比差异性较大的程序输入。我们对当前所获得的输入继续进行指令层级的错误注入实验,通过其结果和默认输入结果的比对来定位潜伏指令的位置。对于被判定为潜伏指令的程序指令,我们选择其他输入下最大的保护收益作为其新的保护收益;对于其他指令,我们则维持其保护收益不变。最后,我们基于这些保护收益和原有的保护代价,对程序进行SID保护并声称可执行二进制文件。基于此收益重排列所生成的保护稳健,不仅可以在默认输入下取得较好的性能,而且因为其输入无关的特性,任何输入下都有较好的表现。


4. 结果评估

和传统SID相比,我们首先评估MINPSID是否可以在多程序输入的环境下可以有效降低SDC的概率,如下图所示。其中深蓝色和橙色分别代表了传统SID和MINPSID在多输入下对十一个常见的高性能计算程序的保护结果,红线代表了当前保护策略的期望值。统计结果显示,传统SID在改变输入的时候,保护浮动极大,且难以达到期望值;而MINPSID不仅可以有效的降低保护浮动,还可以在绝大多数输入下达到保护的期望值。计算可得,MINPSID有效降低了传统SID保护中约97%的遗留的额外风险。

其次,我们评估MINPSID中输入搜索引擎引定位潜伏指令的性能。和随机Fuzzing的基线技术相比,输入搜索引擎的Fuzzing通过编译器层级的程序分析技术,在每个迭代中都最大化了当前输入的控制流图和历史输入的差异,进而得以在相同程序输入的错误注入实验中挖掘更多的潜伏指令。如下图所示,我们观测到输入搜索引擎可以有效定位45.6%更多的潜伏指令,极大化降低了高性能计算中潜在的系统性风险。

最后,我们评估了MINPSID整个工作流程的时间开销。如下图所示,对十一个常见的高性能计算程序,MINPSID的保护和部署总共需要4.43~265.06分钟,其平均运行时间是63.71分钟。MINPSID的瓶颈主要是对不同程序输入的海量的错误注入实验,其可以通过大量并行来降低时间开销。MINPSID的开销是一次性的,这意味着一旦保护完成,其可以保护程序在任何输入下的潜在SDC,为高性能计算系统的稳定性提供了重要保障。


5. 总结

本文面向多输入SID难以保护静默数据损坏的问题,提出了MINPSID方法。MINPSID使用了编译器层级的程序分析技术以实现精准、高效的Fuzzing,有效地解决了传统SID在多输入下存在的问题,具有开销低、可拓展、易泛化的特性,解决了高性能计算系统中潜在的重要问题。百度安全在Fuzzing方向持续的跟踪和研究前沿技术,并与国内外学术界展开了广泛而深入的合作,不断开拓Fuzzing在新领域中的安全问题的应用边界,深化计算机系统基础问题的研究。该工作由百度安全实验室、美国爱荷华大学和阿贡国家实验室合作完成。后续我们还将陆续推出更多精彩工作,敬请期待!

参考文献

1.https://www.osti.gov/biblio/1222713
2.https://arxiv.org/abs/2102.11245
3.https://arxiv.org/abs/2203.08989    


百度安全应急响应中心


百度安全应急响应中心,简称BSRC,是百度致力于维护互联网健康生态环境,保障百度产品和业务线的信息安全,促进安全专家的合作与交流,而建立的漏洞收集以及应急响应平台。地址:https://bsrc.baidu.com

长按关注

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接