張 峰,李亞偉
1(91404部隊,秦皇島 066001)
2(北京賽迪軟件測評工程技術中心有限公司,北京 100048)
隨著軟件在高可靠性領域產品中的比重逐步提升,因軟件缺陷導致的安全事故也層出不窮,例如1999年美國NASA制造的火星氣候軌道探測器因為單位使用錯誤缺陷導致探測器墜毀,2011年7·23中國高鐵甬溫線因信號設備設計缺陷引發追尾重大事故,2016年日本 X 射線天文衛星因底層軟件飛行姿態失控狀態調整缺陷導致衛星徹底失控等等.為防止因為軟件缺陷導致重大安全事故發生,人們做了大量的安全防護工作,包括研制階段安全性需求分析設計論證工作以及研制測試階段的安全性測試工作,很多問題事后證明是軟件設計缺陷,但在測試階段仍存在被發現的可能.
目前在各類型軟件尤其航空航天、工業控制等高可靠性軟件研制過程中,軟件安全性測試工作越來越受重視,相關技術標準體系已經非常成熟,安全性測試工作過程也受到了全過程監督審查,可因為軟件設計缺陷且測試不夠充分而引發的安全事故頻發,損失慘重.
因此,一方面當前社會要求加強軟件安全性需求分析和設計工作,另一方面也對軟件安全性測試工作提出了更高要求.本文旨在介紹一種新的安全性測試分析思路和方法,以提高軟件安全性測試質量.
安全性測試是檢驗軟件中已存在的安全性、安全保密性措施是否有效的測試,其一般包括內容見表1[1].

表1 常規安全性測試內容
安全性測試目的是驗證軟件規定的安全性需求是否都實現,安全保護措施是否有效,是否具備因某部件或者功能失效而不引起系統發生事故的能力.常規安全性測試方法在一定程度上可以對軟件安全性進行檢測,但是也存在部分不足之處,主要體現在以下幾個方面:
(1)一定程度上對軟件安全性需求和設計的質量有很大依賴性;
(2)測試的覆蓋程度不能保證,測試的樣本有限,從而不能保證測試的深度和廣度;
(3)對測試人員個人經驗和能力要求很高,測試質量不能保障;
(4)對測試工具質量要求比較高,工具在一定程度上無法保證對運行平臺和業務邏輯的通用性,因此不能保證測試充分性.
針對以上問題可以看出,當前的安全性測試工作已經不能滿足安全性我們需要更完善的方法體系來保證安全性測試的充分性,以保障軟件安全可靠性.
軟件安全性測試僅是驗證軟件安全性需求和設計措施有效的過程和手段,軟件的安全可靠性需要由軟件安全性設計來保障,安全可靠性需求的質量一定程度上決定了軟件安全性測試的質量.然而實際現狀是在很多高安全可靠性領域軟件工程化生產管理方面,對軟件安全性分析重視程度較低,普遍在需求和分析階段沒有進行更深入安全性分析,因而在測試階段也就無法有更充分的依據來進行安全性測試用例設計.因此在當前階段對軟件安全性測試提出了更高要求,在安全性需求無法保障情況下,有必要在測試階段,基于被測軟件的需求和設計進行安全性分析工作并進行安全性測試用例設計,以提高軟件安全性測試質量.
在軟件安全性測試過程中,引入SFMEA(軟件潛在失效模式及后果分析)技術進行安全性測試需求分析,可以提高軟件安全性測試充分性.
FMEA全稱“Failure Mode and Effects Analysis”,即“潛在失效模式及后果分析”,FMEA方法主要應用于一般工業產品過程設計階段,對產品構成的部件或零件在過程階段的各個工序逐一進行分析,找出所有可能的失效模式,并分析因為失效帶來的后果,從而采取必要的預防措施,以保證產品的質量和可靠性.SFMEA(軟件潛在失效模式及后果分析)安全性分析技術是FMEA的擴展,用于軟件安全可靠性分析與設計的一種自底向上的分析方法,以失效模式為基礎,以軟件失效對系統或者軟件的影響或后果為核心,分析系統或者軟件設計架構層次,進行因果關系推理和歸納總結,以識別軟件設計的薄弱環節,提出改進措施和建議,以保障軟件產品的質量[2-4].
目前SFMEA安全性分析方法廣泛應用于高可靠性領域的軟件研發設計階段,也有學者提出在可靠性測試領域以SFMEA故障模型推動軟件測試用例設計.
SFMEA分析方法與一般產品設計FMEA基本相同,如圖1所示.
(1)首先確定系統分析對象級別和分范圍.通常根據軟件需求規格等相關文檔,分解系統或者軟件需求,確定分析級別和對象.
(2)確定分析對象的失效模式及其原因.針對分解后的分析對象,分析其所有可能的失效模式.軟件失效模式包括功能失效模式和性能失效模式,一般功能失效模式為主,找出關鍵軟件缺陷,形成軟件關鍵功能失效模式集合,并針對每一種失效模式分析其可能的失效原因.
(3)分析失效影響及其嚴重性.根據軟件失效可能帶來的風險進行分析,并根據風險嚴重程度確定失效嚴重等級.嚴重程度一般分為嚴重、一般和建議三個級別.
(4)提出預防措施建議.對每一個失效模式產生的影響和失效原因,提出相應預防措施及修改建議,形成完整的SFMEA表[2-4],見圖1.

圖1 SFMEA分析流程
如對某制冷設備進行SFMEA安全性分析結果如表2.

表2 SFMEA安全性分析結果表
依據軟件測試的常規測試流程,基于SFMEA安全性分析方法進行軟件安全性測試工作流程如圖2所示.
(1)安全性測試需求分析.在軟件測試需求分析和策劃階段,依據SFMEA安全性分析方法,按照圖1安全性分析流程進行安全性測試需求分析,對被測系統和軟件安全關鍵業務和模塊生成FMEA失效模式表,明確安全性測試內容;
(2)安全性測試用例設計.基于安全性分析FMEA失效模式表進行測試用例設計;
(3)安全性測試執行.依據安全性測試用例執行測試,在測試過程中根據需要調整或者補充FMEA表及測試用例,對測試發現的安全性問題分析原因并提出改進建議,并進行回歸測試;
(4)安全性測試總結.在測試執行完畢后對測試過程和測試結果進行總結,對安全性問題進行分析,對軟件安全性進行評估[5].

圖2 基于SFMEA安全性分析技術進行安全性測試步驟
測試重點關注內容如表3.

表3 基于SFMEA分析方法的安全性測試重點關注內容
據媒體報道: 2018年1月1號剛開通三天的北京有軌電車西郊線發生重大事故.事故原因是車輛發生故障后未按規定摘擋,動力手柄未按規定回位,仍位于前進動力位置,導致故障恢復后,車輛突然竄出并脫軌.之后調了大型起重機到達現場把列車吊回了軌道.列車成功被吊回軌道.結果還是沒有人想到要摘擋,列車在車內無司機,手柄位于前進動力的情況下,直接從香山加速下山放飏,溜車6公里后,由于電流過大啟動過熱保護,車輛在隧道內自動停車.本文以此事故為例進行安全性測試分析工作,分析基于SFMEA安全性分析方法進行安全性測試可以檢測并發現哪些安全問題,是否可以避免事故的發生.
根據案例分析,假設車輛控制系統在車輛動力控制方面有如下需求(不考慮剎車控制):
(1)輸入:
1)動力手柄信號: 無動力(00),前進動力(01),后退動力(10),故障(11).
2)車輛運行狀態: 停止(00)、前進(01)、后退(10)故障停車(11).
(2)輸出: “動力控制電流”: 無輸出(0),有輸出(100).
(3)軟件處理需求:
1)“狀態字”=前進狀態(01)或后退狀態(10),且“動力手柄信號”=01時,輸出“動力控制電流”=100;車輛開始前進.
2)“狀態字”=前進狀態(01)或后退狀態(10),且“動力手柄信號”=10時,輸出“動力控制電流”=100;車輛開始后退.
3)“狀態字”=前進狀態(01)或后退狀態(10),且“動力手柄信號”=11時,輸出“動力控制電流”=0;車輛故障停車.
4)“狀態字”=故障停車(10)時,輸出“動力控制電流”=0;即車輛保持停止.
5)“狀態字”=停止狀態(00),輸出“動力控制電流”=0;即車輛保持停止.
根據以上需求,對軟件運行狀態進行分析,軟件運行狀態轉換圖如圖3所示.

圖3 車輛運行狀態轉換圖
根據車輛動力控制部分需求和以上運行狀態圖,按照SFMEA安全分析方法,對其在狀態轉換期間的可能存在的失效模式進行分析,如表4所示.
以上僅分析在車輛動力控制部分可能失效情況,讀者可以依據此方法進行更深入分析.在實際情況中,根據系統復雜程度,可能存在的失效情況比該實例多很多.
根據表3安全性分析表,針對以上安全性分析設計相應測試用例.以表4中第6、7種失效模式為例設計測試用例,設計安全性測試用例如表5.
同理,根據表3安全性分析結果可以設計其它8種失效模式的安全性測試用例,分別進行相關安全性測試.

表4 車輛狀態控制失效模式分析表

表5 測試用例
執行表5中2個測試用例結果可檢測并發現系統的一個重要安全問題: 軟件上電初始化模塊設計存在重大缺陷,在車輛初始化時,未檢測動力手柄是否處于無動力(=00)狀態,當動力手柄處于前進動力(01)或者后退動力(10)狀態時未提出告警并限制車輛啟動,存在車輛失控運動風險.
同理設計并執行其它8類失效模式安全性測試用例,也以檢測軟件是否存在其它的安全風險,包括多種嚴重級別的安全隱患問題.這其中部分問題我們可以通過常規安全性測試方法進行驗證,但是不能保證常規安全性測試方法進行的安全性測試用例能夠覆蓋表4中的各種失效風險問題,這就是基于SFMEA技術進行安全性測試分析與常規安全性測試的差異.
SFMEA與軟件產品正向設計流程不同,它是一個典型的思維發散過程,其核心是盡可能完整和正確地分析總結軟件的失效模式.其關注重點不在于產品“能干什么”,而是產品“可能怎么壞掉”.軟件安全性測試核心也是檢驗軟件整體或者部分在“壞掉”情況下是否進行了預期判定和有效處理.
本文僅是以此為例介紹一種在軟件安全性測試過程中進行安全性測試需求分析的方法.在軟件設計開發已經完成且不具備明顯的安全性需求情況下,與常規安全性測試采用的非法輸入操作、猜錯法等方式不同,該方法采取的是一種逆向思維方法,以系統方法逆向分析系統各種失效的可能性及帶來的風險影響,從而推進安全測試用例設計,更大程度上保證了安全性測試充分性.
但SFMEA安全性分析方法在一定程度上存在工作量大、成本高、復雜程度高等特點,所有在實際應用中,應根據項目進度、規模等選擇性進行,針對系統中安全關鍵業務及模塊進行安全性分析和測試.同時也需要根據被測軟件特點,結合其他安全性測試方法,綜合其優缺點進行測試方法選擇,以更好地保證被測軟件安全性測試工作的質量、進度以及成本等合理進行.