SC 2022议题解读:采用Fuzzing技术防护高性能计算静默数据损坏安全风险
时间:2022-08-17 08:00:01
1.背景
随着硬件工艺的进步,CPU晶体管密度增加,计算机软错误(soft error)概率急剧增加。软错误是计算机系统中无序产生的0-1比特反转。与硬件缺陷或可靠性裂化引起的硬件错误不同,软件错误不会损坏硬件,而是会损坏硬件CPU硬件计算或存储单元中的数据在无法察觉时间接改变。例如,当计算机运行时,会发生一些随机事件CPU计算单元中数个比特的数据状态发生变化,在后续计算中造成错误传输,损坏运行中的应用层软件中的数据,损坏静默数据(Silent Data Corruption,简称SDC)。SDC无法被CPU捕获错误的报告机制往往导致软件运行可以正常结束,但计算结果莫名其妙地错误。此外,这种安全风险极其隐蔽,难以在大型系统中复制,尤其是超级计算环境。它被工业和学术界普遍认为是未来高性能计算的十大挑战之一[1]。
近年来SDC问题经常出现在大规模计算系统中。由于其隐蔽性难以追溯,一旦发生严重事故,往往需要几周甚至几个月的跟踪调试,严重影响软件的可靠性,造成重大经济损失。如Sun公司(已被Oracle收购)1996年系统软错误造成的SDC失去了大量的重要客户。Meta2021年的研究人员~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红线代表了当前保护策略在多输入下对11个常见高性能计算程序的期望。统计结果显示,传统SID在改变输入时,保护波动很大,很难达到预期值;MINPSID它不仅能有效地减少保护浮动,还能在绝大多数输入下达到保护的预期。计算可得,MINPSID有效地降低了传统SID保护97%左右遗留的额外风险。
其次,我们进行评估MINPSID输入搜索引擎引导定位潜伏指令的性能。和随机Fuzzing与基线技术相比,输入搜索引擎Fuzzing通过编译层的程序分析技术,在每个迭代中最大化当前输入的控制流图和历史输入之间的差异,从而在同一程序输入的错误注入实验中挖掘更多的潜在指令。如下图所示,输入搜索引擎可以有效定位45.6%更多的潜伏指令,极大化降低了高性能计算中潜在的系统性风险。
最后,我们进行了评估MINPSID整个工作流程的时间费用。如下图所示,对于11个常见的高性能计算程序,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