張 峰,李亞偉
1(91404部隊,秦皇島 066001)
2(北京賽迪軟件測評工程技術(shù)中心有限公司,北京 100048)
隨著軟件在高可靠性領(lǐng)域產(chǎn)品中的比重逐步提升,因軟件缺陷導(dǎo)致的安全事故也層出不窮,例如1999年美國NASA制造的火星氣候軌道探測器因為單位使用錯誤缺陷導(dǎo)致探測器墜毀,2011年7·23中國高鐵甬溫線因信號設(shè)備設(shè)計缺陷引發(fā)追尾重大事故,2016年日本 X 射線天文衛(wèi)星因底層軟件飛行姿態(tài)失控狀態(tài)調(diào)整缺陷導(dǎo)致衛(wèi)星徹底失控等等.為防止因為軟件缺陷導(dǎo)致重大安全事故發(fā)生,人們做了大量的安全防護工作,包括研制階段安全性需求分析設(shè)計論證工作以及研制測試階段的安全性測試工作,很多問題事后證明是軟件設(shè)計缺陷,但在測試階段仍存在被發(fā)現(xiàn)的可能.
目前在各類型軟件尤其航空航天、工業(yè)控制等高可靠性軟件研制過程中,軟件安全性測試工作越來越受重視,相關(guān)技術(shù)標(biāo)準(zhǔn)體系已經(jīng)非常成熟,安全性測試工作過程也受到了全過程監(jiān)督審查,可因為軟件設(shè)計缺陷且測試不夠充分而引發(fā)的安全事故頻發(fā),損失慘重.
因此,一方面當(dāng)前社會要求加強軟件安全性需求分析和設(shè)計工作,另一方面也對軟件安全性測試工作提出了更高要求.本文旨在介紹一種新的安全性測試分析思路和方法,以提高軟件安全性測試質(zhì)量.
安全性測試是檢驗軟件中已存在的安全性、安全保密性措施是否有效的測試,其一般包括內(nèi)容見表1[1].
表1 常規(guī)安全性測試內(nèi)容
安全性測試目的是驗證軟件規(guī)定的安全性需求是否都實現(xiàn),安全保護措施是否有效,是否具備因某部件或者功能失效而不引起系統(tǒng)發(fā)生事故的能力.常規(guī)安全性測試方法在一定程度上可以對軟件安全性進行檢測,但是也存在部分不足之處,主要體現(xiàn)在以下幾個方面:
(1)一定程度上對軟件安全性需求和設(shè)計的質(zhì)量有很大依賴性;
(2)測試的覆蓋程度不能保證,測試的樣本有限,從而不能保證測試的深度和廣度;
(3)對測試人員個人經(jīng)驗和能力要求很高,測試質(zhì)量不能保障;
(4)對測試工具質(zhì)量要求比較高,工具在一定程度上無法保證對運行平臺和業(yè)務(wù)邏輯的通用性,因此不能保證測試充分性.
針對以上問題可以看出,當(dāng)前的安全性測試工作已經(jīng)不能滿足安全性我們需要更完善的方法體系來保證安全性測試的充分性,以保障軟件安全可靠性.
軟件安全性測試僅是驗證軟件安全性需求和設(shè)計措施有效的過程和手段,軟件的安全可靠性需要由軟件安全性設(shè)計來保障,安全可靠性需求的質(zhì)量一定程度上決定了軟件安全性測試的質(zhì)量.然而實際現(xiàn)狀是在很多高安全可靠性領(lǐng)域軟件工程化生產(chǎn)管理方面,對軟件安全性分析重視程度較低,普遍在需求和分析階段沒有進行更深入安全性分析,因而在測試階段也就無法有更充分的依據(jù)來進行安全性測試用例設(shè)計.因此在當(dāng)前階段對軟件安全性測試提出了更高要求,在安全性需求無法保障情況下,有必要在測試階段,基于被測軟件的需求和設(shè)計進行安全性分析工作并進行安全性測試用例設(shè)計,以提高軟件安全性測試質(zhì)量.
在軟件安全性測試過程中,引入SFMEA(軟件潛在失效模式及后果分析)技術(shù)進行安全性測試需求分析,可以提高軟件安全性測試充分性.
FMEA全稱“Failure Mode and Effects Analysis”,即“潛在失效模式及后果分析”,FMEA方法主要應(yīng)用于一般工業(yè)產(chǎn)品過程設(shè)計階段,對產(chǎn)品構(gòu)成的部件或零件在過程階段的各個工序逐一進行分析,找出所有可能的失效模式,并分析因為失效帶來的后果,從而采取必要的預(yù)防措施,以保證產(chǎn)品的質(zhì)量和可靠性.SFMEA(軟件潛在失效模式及后果分析)安全性分析技術(shù)是FMEA的擴展,用于軟件安全可靠性分析與設(shè)計的一種自底向上的分析方法,以失效模式為基礎(chǔ),以軟件失效對系統(tǒng)或者軟件的影響或后果為核心,分析系統(tǒng)或者軟件設(shè)計架構(gòu)層次,進行因果關(guān)系推理和歸納總結(jié),以識別軟件設(shè)計的薄弱環(huán)節(jié),提出改進措施和建議,以保障軟件產(chǎn)品的質(zhì)量[2-4].
目前SFMEA安全性分析方法廣泛應(yīng)用于高可靠性領(lǐng)域的軟件研發(fā)設(shè)計階段,也有學(xué)者提出在可靠性測試領(lǐng)域以SFMEA故障模型推動軟件測試用例設(shè)計.
SFMEA分析方法與一般產(chǎn)品設(shè)計FMEA基本相同,如圖1所示.
(1)首先確定系統(tǒng)分析對象級別和分范圍.通常根據(jù)軟件需求規(guī)格等相關(guān)文檔,分解系統(tǒng)或者軟件需求,確定分析級別和對象.
(2)確定分析對象的失效模式及其原因.針對分解后的分析對象,分析其所有可能的失效模式.軟件失效模式包括功能失效模式和性能失效模式,一般功能失效模式為主,找出關(guān)鍵軟件缺陷,形成軟件關(guān)鍵功能失效模式集合,并針對每一種失效模式分析其可能的失效原因.
(3)分析失效影響及其嚴重性.根據(jù)軟件失效可能帶來的風(fēng)險進行分析,并根據(jù)風(fēng)險嚴重程度確定失效嚴重等級.嚴重程度一般分為嚴重、一般和建議三個級別.
(4)提出預(yù)防措施建議.對每一個失效模式產(chǎn)生的影響和失效原因,提出相應(yīng)預(yù)防措施及修改建議,形成完整的SFMEA表[2-4],見圖1.
圖1 SFMEA分析流程
如對某制冷設(shè)備進行SFMEA安全性分析結(jié)果如表2.
表2 SFMEA安全性分析結(jié)果表
依據(jù)軟件測試的常規(guī)測試流程,基于SFMEA安全性分析方法進行軟件安全性測試工作流程如圖2所示.
(1)安全性測試需求分析.在軟件測試需求分析和策劃階段,依據(jù)SFMEA安全性分析方法,按照圖1安全性分析流程進行安全性測試需求分析,對被測系統(tǒng)和軟件安全關(guān)鍵業(yè)務(wù)和模塊生成FMEA失效模式表,明確安全性測試內(nèi)容;
(2)安全性測試用例設(shè)計.基于安全性分析FMEA失效模式表進行測試用例設(shè)計;
(3)安全性測試執(zhí)行.依據(jù)安全性測試用例執(zhí)行測試,在測試過程中根據(jù)需要調(diào)整或者補充FMEA表及測試用例,對測試發(fā)現(xiàn)的安全性問題分析原因并提出改進建議,并進行回歸測試;
(4)安全性測試總結(jié).在測試執(zhí)行完畢后對測試過程和測試結(jié)果進行總結(jié),對安全性問題進行分析,對軟件安全性進行評估[5].
圖2 基于SFMEA安全性分析技術(shù)進行安全性測試步驟
測試重點關(guān)注內(nèi)容如表3.
表3 基于SFMEA分析方法的安全性測試重點關(guān)注內(nèi)容
據(jù)媒體報道: 2018年1月1號剛開通三天的北京有軌電車西郊線發(fā)生重大事故.事故原因是車輛發(fā)生故障后未按規(guī)定摘擋,動力手柄未按規(guī)定回位,仍位于前進動力位置,導(dǎo)致故障恢復(fù)后,車輛突然竄出并脫軌.之后調(diào)了大型起重機到達現(xiàn)場把列車吊回了軌道.列車成功被吊回軌道.結(jié)果還是沒有人想到要摘擋,列車在車內(nèi)無司機,手柄位于前進動力的情況下,直接從香山加速下山放飏,溜車6公里后,由于電流過大啟動過熱保護,車輛在隧道內(nèi)自動停車.本文以此事故為例進行安全性測試分析工作,分析基于SFMEA安全性分析方法進行安全性測試可以檢測并發(fā)現(xiàn)哪些安全問題,是否可以避免事故的發(fā)生.
根據(jù)案例分析,假設(shè)車輛控制系統(tǒng)在車輛動力控制方面有如下需求(不考慮剎車控制):
(1)輸入:
1)動力手柄信號: 無動力(00),前進動力(01),后退動力(10),故障(11).
2)車輛運行狀態(tài): 停止(00)、前進(01)、后退(10)故障停車(11).
(2)輸出: “動力控制電流”: 無輸出(0),有輸出(100).
(3)軟件處理需求:
1)“狀態(tài)字”=前進狀態(tài)(01)或后退狀態(tài)(10),且“動力手柄信號”=01時,輸出“動力控制電流”=100;車輛開始前進.
2)“狀態(tài)字”=前進狀態(tài)(01)或后退狀態(tài)(10),且“動力手柄信號”=10時,輸出“動力控制電流”=100;車輛開始后退.
3)“狀態(tài)字”=前進狀態(tài)(01)或后退狀態(tài)(10),且“動力手柄信號”=11時,輸出“動力控制電流”=0;車輛故障停車.
4)“狀態(tài)字”=故障停車(10)時,輸出“動力控制電流”=0;即車輛保持停止.
5)“狀態(tài)字”=停止?fàn)顟B(tài)(00),輸出“動力控制電流”=0;即車輛保持停止.
根據(jù)以上需求,對軟件運行狀態(tài)進行分析,軟件運行狀態(tài)轉(zhuǎn)換圖如圖3所示.
圖3 車輛運行狀態(tài)轉(zhuǎn)換圖
根據(jù)車輛動力控制部分需求和以上運行狀態(tài)圖,按照SFMEA安全分析方法,對其在狀態(tài)轉(zhuǎn)換期間的可能存在的失效模式進行分析,如表4所示.
以上僅分析在車輛動力控制部分可能失效情況,讀者可以依據(jù)此方法進行更深入分析.在實際情況中,根據(jù)系統(tǒng)復(fù)雜程度,可能存在的失效情況比該實例多很多.
根據(jù)表3安全性分析表,針對以上安全性分析設(shè)計相應(yīng)測試用例.以表4中第6、7種失效模式為例設(shè)計測試用例,設(shè)計安全性測試用例如表5.
同理,根據(jù)表3安全性分析結(jié)果可以設(shè)計其它8種失效模式的安全性測試用例,分別進行相關(guān)安全性測試.
表4 車輛狀態(tài)控制失效模式分析表
表5 測試用例
執(zhí)行表5中2個測試用例結(jié)果可檢測并發(fā)現(xiàn)系統(tǒng)的一個重要安全問題: 軟件上電初始化模塊設(shè)計存在重大缺陷,在車輛初始化時,未檢測動力手柄是否處于無動力(=00)狀態(tài),當(dāng)動力手柄處于前進動力(01)或者后退動力(10)狀態(tài)時未提出告警并限制車輛啟動,存在車輛失控運動風(fēng)險.
同理設(shè)計并執(zhí)行其它8類失效模式安全性測試用例,也以檢測軟件是否存在其它的安全風(fēng)險,包括多種嚴重級別的安全隱患問題.這其中部分問題我們可以通過常規(guī)安全性測試方法進行驗證,但是不能保證常規(guī)安全性測試方法進行的安全性測試用例能夠覆蓋表4中的各種失效風(fēng)險問題,這就是基于SFMEA技術(shù)進行安全性測試分析與常規(guī)安全性測試的差異.
SFMEA與軟件產(chǎn)品正向設(shè)計流程不同,它是一個典型的思維發(fā)散過程,其核心是盡可能完整和正確地分析總結(jié)軟件的失效模式.其關(guān)注重點不在于產(chǎn)品“能干什么”,而是產(chǎn)品“可能怎么壞掉”.軟件安全性測試核心也是檢驗軟件整體或者部分在“壞掉”情況下是否進行了預(yù)期判定和有效處理.
本文僅是以此為例介紹一種在軟件安全性測試過程中進行安全性測試需求分析的方法.在軟件設(shè)計開發(fā)已經(jīng)完成且不具備明顯的安全性需求情況下,與常規(guī)安全性測試采用的非法輸入操作、猜錯法等方式不同,該方法采取的是一種逆向思維方法,以系統(tǒng)方法逆向分析系統(tǒng)各種失效的可能性及帶來的風(fēng)險影響,從而推進安全測試用例設(shè)計,更大程度上保證了安全性測試充分性.
但SFMEA安全性分析方法在一定程度上存在工作量大、成本高、復(fù)雜程度高等特點,所有在實際應(yīng)用中,應(yīng)根據(jù)項目進度、規(guī)模等選擇性進行,針對系統(tǒng)中安全關(guān)鍵業(yè)務(wù)及模塊進行安全性分析和測試.同時也需要根據(jù)被測軟件特點,結(jié)合其他安全性測試方法,綜合其優(yōu)缺點進行測試方法選擇,以更好地保證被測軟件安全性測試工作的質(zhì)量、進度以及成本等合理進行.