软件实现的故障注入(SWIFI)是通过系统的调试器或者某些系统特权接口,编译时或者运行时动态修改执行程序,修改寄存器、存储器的值,从而达到改变系统状态的目的,使系统触发软件甚至硬件故障。软件故障模拟注入不需要任何硬件设施就可以实现故障的软件模拟,是一种低开销的故障注入方法,而且具有较好的灵活性。
软件实现的故障注入方法通常采用程序或者脚本来控制故障注入全过程,以避免额外的硬件开销,并且具有更大的灵活性,这种方法主要用于评估应用程序和操作系统。评估应用程序一般需要在操作系统上构造故障注入层或者直接在应用程序上实施注入;而评估操作系统则要将故障注入机制内嵌到操作系统当中或者虚拟机之中,需要模拟的故障类型既包括部分硬件故障,也包括软件缺陷。
软件故障注入过程可以看作是向目标程序(源代码或二进制代码)引入变异的过程。该技术的目的在于通过制造软件层的错误来产生软件或硬件上的故障。它包括许多不同的注入方式,比如修改内存数据,或突变应用软件等。几乎所有类型的故障它都可以注入,从寄存器和内存故障,到网络丢包,再到不正确的错误标志位和错误条件。软件故障注入更倾向于实现细节,通过通信和交互函数,它可以访问到程序的各种状态。
目前有两种主流的软件故障注入技术。
(一)编译时软件实现的故障注入(Compile-Time Software Implemented Fault Injection,CTSIFI)
这种注入技术是通过修改目标程序的执行映像来模拟系统的软、硬件故障。在目标程序的编译阶段,通过将故障写入目标程序的源代码或汇编代码中去,然后被系统生成目标程序执行映像,系统一旦加载和执行带有故障的执行映像就会产生故障,这样就达到了故障注入的目的。这种方法实施起来很简单,只需要对要评测的程序进行修改,同时也由于注入代码是被固定在镜像中,所以它不需要额外的控制软件来控制故障的执行,故障代码的固定也使得它通常被用来模拟永久型故障。而且,这种方法对于运行状态的目标程序并不影响。
CTSIFI方法通常在程序源代码级上实施,但对于基于COTS系统一般无法获取其源代码,因此很难通过CTSIFI方法进行故障仿真,该缺点严重影响了CTSIFI的使用。
(二)运行时软件实现的故障注入(Run-Time Software Implemented Fault Injection,RTSIFI)
这种技术可以在目标程序的运行阶段注入故障,但是,完成故障注入要依靠触发机制。按照触发机制分为超时、异常/陷阱、代码插入三种,下面分别对它们进行简单的介绍。
1.超时
超时触发是最简单的触发机制。实现原理就是依靠定时器的超时来进行触发。当定时器超出提前设定的时间阈值时,就会通知系统调用故障处理中断子程序。对于定时器的实现,并没有特殊要求,软、硬件均可以实现。并且它不需要去改变目标程序或工作负载。由于该触发机制是依照时间而不是特殊的事件来触发的,因此,在进行故障注入时,它极有可能对目标程序及其行为产生一些不可预估的影响。超时触发机制通常被用来进行瞬时故障和间歇故障的注入。(www.xing528.com)
2.异常/陷阱
异常/陷阱触发机制是以某个特殊的事件或者系统状态为触发条件,比如硬件异常,或者软件陷阱等。当硬件设备检测到了某事件的发生或者目标程序执行到插入的软件陷阱时,会产生一个中断,调用中断处理程序执行故障注入。对于异常/陷阱的触发机制,要求每一个设定的特殊事件或者系统状态要有与之相对应的中断服务。
3.代码插入
对于选定的目标程序,在进行故障注入时,在某条代码的前面插入故障注入代码,从而达到引入故障的目的。与编译时注入故障不同的是,代码插入机制是在程序运行时插入的故障代码,它是增加而不是修改。代码插入和异常/陷阱一样实现故障注入,但是它们所处的系统层级不一样,代码插入是在用户态的工作,而异常/陷阱则是在内核态执行。
由于RTSIFI方法通常在机器代码级对软件进行故障注入,因而可以有效地克服源代码级故障注入的缺点,特别是对无法提供源代码的第三方程序更适用。由于RTSIFI方法不需要对修改后的源程序文件进行编译,因而配置和执行开销要比CTSIFI低很多。但是,在二进制代码级对目标程序进行故障注入也面临一些问题:首先是故障代表性问题,很难保证对机器代码的变异一定能代表特定的缺陷;其次对于高级语言,不同的编译器产生的二进制代码可能会存在一定的差异性。
软件注入技术近年来逐渐成为注入领域的热门方向,其不依赖于硬件的注入方式,可选择在应用层、操作系统层、协议层等多位置注入的灵活性,使其拥有广泛应用前景。
软件故障注入方法也存在若干缺点,一是软件只能修改体系结构可见的寄存器等硬件资源,无法对软件不可访问位置进行故障注入,只能够部分模拟实际的故障情况;二是软件故障注入一般在RTL级以上进行,注入类型及故障覆盖率都很高,但依赖于机器指令周期,对时间敏感的参数估计精度过低,对于总线和CPU这种潜伏期较短的故障很可能难以捕捉;注入模块本身作为目标系统的负载,也会使注入结果出现偏差。因此,对时序要求严苛的系统均不宜采用软件故障注入的方式。
意大利都灵理工大学开发的BOND就是一个基于软件的故障注入工具,它可以模拟在WindowsNT4.0/2000操作系统上的系统异常。葡萄牙Coimbra大学的Xception利用系统的特权模式,在调试接口对正在运行系统进行修改;Doctor采用超时中断与代码修改来进行故障注入,注入目标包括处理器、随机只读存储器和网络中的数据包;还有利用软件陷阱进行故障注入的Ferrari。
在国外典型的软件故障注入工具有FERRARI、FIAT、FINE和Xception。在国内主要有哈工大和航天科技集团771所共同开发的SFIOS和SFIS,其中SFIOS专用于星载系统,通过指令系统来注入故障,并采用包括时间、位置、事件在内的多种触发方式。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。