摘要
軟件故障注入是功能安全驗證的重要技術(shù)手段。本文旨在為軟件故障注入提供一個基本概述,以及簡介現(xiàn)有的故障注入技術(shù)。
01
故障注入方法簡介
在功能安全相關(guān)關(guān)鍵場景中,密集的測試活動對于確保新系統(tǒng)和內(nèi)置容錯機(jī)制按預(yù)期運行至關(guān)重要。確保系統(tǒng)在出現(xiàn)故障時正常運行(Fail Operational)是一個需要比傳統(tǒng)測試內(nèi)容復(fù)雜的問題。在系統(tǒng)中引入故障以評估其行為并測量容錯機(jī)制的效率(即覆蓋率和延遲)的過程稱為故障注入。
故障注入方法的發(fā)展是隨著數(shù)字化的發(fā)展同步進(jìn)行的。
最開始,數(shù)字系統(tǒng)只使用了簡單的硬件系統(tǒng)。因此,第一種故障注入方法包括通過假設(shè)簡單的硬件故障模型(如位翻轉(zhuǎn)或位卡死)將物理故障注入目標(biāo)系統(tǒng)硬件(例如,使用輻射、引腳電平、電源干擾等)。
硬件的日益復(fù)雜使這些物理方法的使用變得相當(dāng)困難,甚至不可能,一個新的故障注入方法,即基于通過軟件(軟件實現(xiàn)的故障注入SWIFI)對硬件故障進(jìn)行運行時仿真,變得非常流行。
隨著關(guān)鍵系統(tǒng)在其他應(yīng)用領(lǐng)域的擴(kuò)展,我們看到這些系統(tǒng)的軟件部分越來越復(fù)雜,這成為系統(tǒng)故障的一個不可忽視的原因。阿麗亞娜5號火箭的第一次試飛(1996年6月4日)就是一個例子。在試飛過程中,火箭偏離了飛行路線,在起飛后不到一分鐘就發(fā)生了爆炸,造成了5億美元的損失。爆炸是由軟件中的錯誤數(shù)據(jù)轉(zhuǎn)換引起的,從64位浮點到16位有符號整數(shù)表示。該漏洞源于對以往任務(wù)中軟件子系統(tǒng)的重用,而沒有進(jìn)行實質(zhì)性的重新測試,開發(fā)人員認(rèn)為該任務(wù)與新系統(tǒng)兼容。
SWIFI工具用于在程序狀態(tài)(例如,數(shù)據(jù)和地址寄存器、堆棧和堆內(nèi)存)和程序代碼(例如,在程序執(zhí)行之前或期間存儲代碼的內(nèi)存區(qū)域)中注入錯誤。不幸的是,在復(fù)雜的軟件密集型系統(tǒng)中,通過SWIFI無法準(zhǔn)確模擬真實軟件故障的影響。因為在過去三十年中,汽車中使用的代碼行的規(guī)模從數(shù)萬行呈指數(shù)增長到數(shù)億行。
與第一種故障注入方法相比,使用故障注入來模擬真實軟件故障(即bug)的影響,即軟件故障注入(SFI),是相對較新的方法。實際上,軟件故障的注入包括在目標(biāo)程序代碼中引入小的更改,創(chuàng)建不同版本的程序(每個版本有一個注入的軟件故障)。
ISO 26262標(biāo)準(zhǔn)規(guī)定了軟件中錯誤檢測和處理機(jī)制的使用,以及通過故障注入進(jìn)行驗證。
軟件故障注入是一種假設(shè)實驗,它可能起源于軟件開發(fā)過程的任何階段,包括需求分析、設(shè)計和編碼活動。在給定的工作負(fù)載下執(zhí)行目標(biāo),并將故障插入目標(biāo)系統(tǒng)的特定軟件組件中。主要目標(biāo)是觀察系統(tǒng)在存在注入故障的情況下的行為,考慮到這些故障會重現(xiàn)可能在運行期間影響系統(tǒng)給定軟件組件的合理故障。
02
故障注入方法關(guān)鍵特性
//
故障是系統(tǒng)狀態(tài)不正確的判定或假設(shè)的原因,稱為錯誤。故障是在提供錯誤服務(wù)時發(fā)生的事件,即用戶或外部系統(tǒng)感知到錯誤狀態(tài)。
故障注入活動獲得的結(jié)果的準(zhǔn)確性在很大程度上取決于實驗的幾個關(guān)鍵特性,即:
代表性
是指故障負(fù)載和工作負(fù)載代表系統(tǒng)在運行期間將經(jīng)歷的真實故障和輸入的能力。通過定義一個真實的故障模型,并在實驗過程中準(zhǔn)確再現(xiàn)該故障模型,可以實現(xiàn)故障的代表性。
非侵入性
要求故障注入過程中采用的儀器(如故障插入和數(shù)據(jù)收集)不應(yīng)顯著改變實際系統(tǒng)的行為。例如,執(zhí)行額外的代碼來破壞軟件狀態(tài)可能會導(dǎo)致侵入。
重復(fù)性
是指當(dāng)在同一環(huán)境中使用同一程序多次執(zhí)行故障注入活動時,可確保統(tǒng)計結(jié)果等效的特性。由于計算機(jī)系統(tǒng)中存在許多不確定性的來源,例如線程調(diào)度和事件計時,要實現(xiàn)這一特性并非易事。
實用性
是指故障注入在成本和時間方面的有效性。這些因素包括實現(xiàn)和設(shè)置故障注入環(huán)境所需的時間、執(zhí)行實驗的時間以及分析結(jié)果的時間。該屬性要求實驗由自動工具支持,以滿足時間和預(yù)算限制。
可移植性
要求故障注入技術(shù)或工具能夠輕松地應(yīng)用于不同的系統(tǒng),以便進(jìn)行比較。故障注入工具的可移植性還指該工具支持多個故障模型并用新的故障模型進(jìn)行擴(kuò)展的能力。
03
軟件故障特征
軟件故障的注入需要對要注入的故障進(jìn)行精確定義,這反過來又需要對軟件故障進(jìn)行清晰的理解和描述。這并不容易實現(xiàn),因為軟件故障是由于開發(fā)過程中發(fā)生的人為錯誤造成的,這些錯誤會以程序中錯誤指令的形式影響軟件工件。
為了提高軟件可靠性,人們提出了幾種故障分類模式。在故障分類模式中,正交缺陷分類(Orthogonal Defect classification,ODC)是研究人員和實踐者最廣泛采用的模式之一,并已在多個研究中用于定義軟件故障注入的故障模型。ODC是一個對軟件故障進(jìn)行分類的框架,目的是獲得軟件開發(fā)過程的度量和定量反饋;
04
軟件故障注入技術(shù)
//
許多SFI技術(shù)和工具是在20多年的時間里發(fā)展起來的。這里,我們通過區(qū)分兩種基本方法來說明和討論這些工作:注入故障效應(yīng)(也稱為錯誤注入),其中通過擾動系統(tǒng)狀態(tài)引入錯誤,以及注入實際故障,其中更改程序代碼以模擬代碼中的軟件故障。以下小節(jié)分別回顧了軟件故障注入技術(shù):
· 數(shù)據(jù)錯誤注入的方法最早,這些方法基于當(dāng)時存在的硬件故障注入技術(shù);
· 接口錯誤注入方法,旨在測試組件與其他組件交互的穩(wěn)健性;
·注入實際故障的方法,在程序代碼中引入小的故障更改。
4.1數(shù)據(jù)錯誤注入
早期注入故障效應(yīng)的方法是在通過SWIFI研究硬件故障的背景下發(fā)展起來的。SWIFI旨在通過軟件干擾內(nèi)存或硬件寄存器的狀態(tài),再現(xiàn)硬件故障(如CPU、總線和內(nèi)存故障)的影響(即錯誤)。根據(jù)以下標(biāo)準(zhǔn),SWIFI方法將內(nèi)存位置或寄存器的內(nèi)容替換為損壞的值:
· 注入什么。內(nèi)存位置或寄存器中單個位、字節(jié)或字的內(nèi)容已損壞。通過對電氣或門級故障產(chǎn)生的錯誤的分析,定義了錯誤類型。常見的錯誤類型是用固定值(卡在0和卡在1故障)或相反值(位翻轉(zhuǎn))替換位。
· 注入的地方。由于內(nèi)存位置眾多,注入內(nèi)存的錯誤通常針對位置的子集。注入可以集中在特定內(nèi)存區(qū)域中隨機(jī)選擇的位置(例如堆棧、堆、全局?jǐn)?shù)據(jù))或用戶選擇的位置(例如內(nèi)存中的特定變量)。在寄存器中注入的錯誤可以針對那些可以通過軟件訪問的寄存器(例如,數(shù)據(jù)和地址寄存器)。
· 何時注入。錯誤注入可能與時間或事件有關(guān)。在前一種情況下,在經(jīng)過給定的實驗時間后注入錯誤,該時間由用戶或根據(jù)概率分布選擇。在后一種情況下,當(dāng)特定事件在執(zhí)行期間發(fā)生時,例如在第一次訪問或每次訪問目標(biāo)位置時,會注入錯誤。可以模擬三種類型的硬件故障,分別是瞬時故障(即偶然故障)、間歇性故障(即多次重復(fù)故障)和永久性故障。
值得注意的是,SWIFI工具注入的硬件錯誤可以在程序狀態(tài)(例如,數(shù)據(jù)和地址寄存器、堆棧和堆內(nèi)存)和程序代碼(例如,在程序執(zhí)行之前或執(zhí)行期間存儲代碼的內(nèi)存區(qū)域)中注入。這是軟件故障注入的一個重要區(qū)別:程序狀態(tài)中的損壞旨在反映軟件故障的影響,即錯誤程序的執(zhí)行導(dǎo)致的錯誤,例如錯誤的指針、標(biāo)志或控制流,SWIFI工具可以直接引入此類錯誤;相反,程序代碼中的故障旨在反映代碼中的實際軟件故障。
4.2 接口錯誤的注入
在輸入?yún)?shù)處注入錯誤旨在模擬目標(biāo)外部故障產(chǎn)生的影響,包括外部軟件組件中軟件故障的影響,并評估目標(biāo)檢測和處理損壞輸入的能力。以類似的方式,輸出值的損壞被用來模擬故障部件的輸出,并可用于評估故障對系統(tǒng)其余部分的影響。
輸入?yún)?shù)的故障可能會揭示目標(biāo)的錯誤檢測和恢復(fù)機(jī)制(例如,輸入處理代碼)的設(shè)計和實施中的缺陷。它通常在穩(wěn)健性測試中采用,該測試評估“系統(tǒng)或組件在存在無效輸入或壓力環(huán)境條件下能夠正確運行的程度”。應(yīng)該注意的是,健壯性測試和接口錯誤注入的目標(biāo)不同于功能測試技術(shù),例如黑盒測試:健壯性測試旨在評估軟件模塊在面對無效輸入時的健壯行為(例如,避免了進(jìn)程崩潰,或產(chǎn)生了警告信號),它與目標(biāo)的功能正確性無關(guān)。
接口錯誤注入可以通過兩種方式執(zhí)行。第一種方法基于鏈接到目標(biāo)組件的測試驅(qū)動程序(例如,使用目標(biāo)導(dǎo)出的API的程序),并通過提交無效輸入來執(zhí)行該程序。這種方法類似于單元測試,但在這種情況下,評估的是健壯性,而不是功能正確性。第二種方法包括攔截和破壞目標(biāo)與系統(tǒng)其余部分之間的交互,即在調(diào)用目標(biāo)組件時觸發(fā)攔截器程序,并修改原始輸入以引入損壞的輸入。在這種情況下,目標(biāo)組件將在集成目標(biāo)的整個系統(tǒng)的上下文中進(jìn)行測試。這種方法類似于SWIFI,因為流經(jīng)系統(tǒng)的原始數(shù)據(jù)(在本例中為接口輸入)被損壞的數(shù)據(jù)替換。
在接口錯誤注入實驗中,在實驗期間發(fā)生的幾個輸入?yún)?shù)和目標(biāo)API的幾個調(diào)用中,通常只有一個輸入?yún)?shù)和一個調(diào)用被破壞。生成無效輸入值的常用方法有三種:
· 模糊化:原始值被隨機(jī)生成的值替換。
· 位翻轉(zhuǎn):通過反轉(zhuǎn)原始值的一個或多個位的值來生成損壞的值。
· 基于數(shù)據(jù)類型的注入:原始值被替換為無效值,該值是根據(jù)被破壞的輸入?yún)?shù)類型選擇的,其中類型是從目標(biāo)導(dǎo)出的API派生的。這種方法為每種數(shù)據(jù)類型定義了一個無效值池,這些值是從類型域的分析中選擇的(例如,在C指針的情況下為“NULL”)。
4.3注入代碼的更改
前面小節(jié)討論的主要是通過使用SWIFI方法注入故障影響(即錯誤)來模擬軟件故障。這些方法的一個公開問題是注入錯誤(如位翻轉(zhuǎn))的代表性,它不一定與軟件故障產(chǎn)生的錯誤匹配。
為了解決代表性問題,最近對SFI的研究集中在程序代碼中錯誤的注入(即代碼更改)。即可以采用注入代碼更改來模擬真實軟件故障,因為注入的故障會產(chǎn)生與真實軟件故障產(chǎn)生的錯誤和故障相似的錯誤和故障。一般可通過在進(jìn)程的代碼存儲區(qū)或二進(jìn)制可執(zhí)行文件上應(yīng)用SWIFI,在程序中注入錯誤。但要注意通過對這些程序進(jìn)行徹底測試,需在有限的范圍內(nèi)注入軟件故障,需要專門針對軟件故障注入的工具和技術(shù)。
05
結(jié)論
//
在為系統(tǒng)選擇方法時,應(yīng)考慮所討論的故障注入方法的特點。
錯誤注入通常用于評估單個組件的健壯性,并改進(jìn)代碼特定部分的錯誤處理。主要原因是,錯誤的注入允許對系統(tǒng)的特定部分進(jìn)行實驗,因為它可以評估錯誤對特定組件接口或程序變量的影響。事實上,錯誤注入不需要等待錯誤生成并傳播到正在評估的程序狀態(tài)的特定部分。此外,由于錯誤注入可以應(yīng)用于單個組件,因此可以在軟件驗證的早期階段執(zhí)行。
相反,注入代碼更改的目的是作為一個整體評估容錯系統(tǒng),并在備選設(shè)計選擇之間進(jìn)行定量評估和比較。代碼更改更適合于這些目標(biāo),因為它們基于軟件故障的代表性模型,并密切模擬故障軟件的行為。這是定量評估和比較的一個重要要求,因為它們考慮了故障發(fā)生的相對概率,以反映系統(tǒng)在運行期間表現(xiàn)出的行為。這使得代碼更改的注入更適合于軟件驗證的后期階段,此時系統(tǒng)組件已經(jīng)集成,開發(fā)人員的目標(biāo)是評估系統(tǒng)在其運行壽命期間的預(yù)期容錯性(以及衍生的度量,如可用性)。
作者:鄭威,TüV北德功能安全總監(jiān)
編輯:黃飛
-
寄存器
+關(guān)注
關(guān)注
31文章
5421瀏覽量
123315 -
cpu
+關(guān)注
關(guān)注
68文章
11033瀏覽量
215978 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3108瀏覽量
74984 -
驅(qū)動程序
+關(guān)注
關(guān)注
19文章
859瀏覽量
48833 -
硬件系統(tǒng)
+關(guān)注
關(guān)注
0文章
49瀏覽量
11612
原文標(biāo)題:軟件故障注入方法
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
后驅(qū)動技術(shù)在故障注入中的退化機(jī)理的研究
PXI故障注入開關(guān)模塊應(yīng)用于故障注入測試
運行時軟件故障注入器的設(shè)計與實現(xiàn)
分布式星載系統(tǒng)故障注入研究
基于FPGA的容錯計算機(jī)故障注入研究
Pickering Interfaces最近擴(kuò)展了他們的PXI故障注入開關(guān)產(chǎn)品系列
Zynq-7000的功能安全參考系統(tǒng)的介紹
綜合模塊化航空電子平臺網(wǎng)絡(luò)故障注入策略

面向AES算法的電壓故障注入攻擊方法
船舶一體化網(wǎng)絡(luò)系統(tǒng)的故障注入平臺設(shè)計
故障注入測試工具:FIT
硬件&芯片安全滲透利器--BTS1002多接口精密觸發(fā)故障注入儀

功能安全實車測試新突破:故障注入技術(shù)的創(chuàng)新實踐

評論