- 機械安全:電氣、電子和可編程電子控制系統軟件功能安全標準解析與實踐
- 工業和信息化部電子第五研究所組編
- 5229字
- 2024-01-18 12:06:43
1.2 軟件功能安全概述
1.2.1 發展概況
嵌入式軟件在安全關鍵系統中的應用,使得保障軟件的功能安全成為軟件工程領域的研究熱點。軟件作為系統的重要組成要素,不會直接危及生命、財產和環境等安全,但借助軟件實現的人機交互卻可能因軟件失效造成人員誤操作,從而形成危害。對于沒有人機交互的嵌入式安全關鍵系統而言,軟件錯誤地控制系統也可能造成災難性的后果。以機器人控制軟件為例,在軟件控制機械臂執行任務時,當控制的距離參數、速度參數溢出時,控制軟件需要確保機械臂不會執行該指令,以免造成人身傷害及財產損失。當軟件可以引起危害或控制危害的發生時,該軟件就是危險的。
軟件安全性(Software Safety)一詞最早出現在1979年美國發布的MIL-STD-1574A中。1986年,MIT(麻省理工學院)的Leveson 教授提出,軟件安全性在系統的生命周期中應該作為一個單獨的課題加以重點研究。此后,美國國防部(DoD)、美國國家航空航天局(NASA)、美國聯邦航空管理局(FAA)、歐洲航天局(ESA)、英國國防部(MoD)等國防、科研機構及電氣與電子工程師協會(IEEE)、國際電工委員會(IEC)、航空無線電技術委員會(RTCA)等標準化組織均對軟件功能安全展開了進一步研究,形成了一系列標準、論著、論文等出版物,涉及國防、交通、醫療等多個安全關鍵領域。
軟件的功能安全在近年來得到了廣泛的研究,形成了軟件安全性工程體系,研究的內容包括軟件安全性需求的獲取與描述、面向標準的軟件開發過程、軟件安全需求驗證,形成了一系列的軟件安全性分析標準、方法及工具。實施軟件安全性工程的主要作用如下。
(1)有效地防止系統事故的發生,或者降低事故的嚴重程度。
預防事故發生和減少損失是開展軟件安全性工作的首要任務。通過對系統危險的識別與分析,從軟件異常導致事故發生和軟件控制事故不發生兩個方向入手,分析系統中存在的與事故發生緊密相關的薄弱環節,分析出軟件在其中的放大或控制作用,從而開展面向過程及面向產品的軟件安全性工作,以便將系統事故發生的概率降低到可以接受的范圍內,或者將事故的危害程度降到足夠低。
(2)面向全生命周期,權衡軟件安全性和成本。
作為軟件質量的重要組成部分,確保軟件安全性的核心目標之一是降低軟件全生命周期成本,提高軟件質量。通過開展面向需求、設計、實現、測試評價、使用、維護、退役全生命周期的軟件安全性定量分析,權衡提高軟件安全性帶來的收益及開展軟件安全性工作的成本,找到全生命周期最優化解決方案,在可承受的范圍內盡可能地防止事故的發生或降低事故的嚴重程度。
(3)提高安全人員技術水平與安全管理水平。
開展軟件安全性工作,提高安全人員技術水平,以及提高協同開發人員與運維人員(軟件研發工程師、軟件測試工程師、軟件質量保證工程師、軟件運維工程師等)的安全意識,在生命周期內全面落實安全措施。開展軟件安全性活動還有利于提高安全管理水平,形成標準、數據、經驗的積累,建立軟件安全數據庫,為后續軟件產品相關安全性指標的制定與安全性需求獲取與驗證提供數據基礎,通過標準的方式固化并貫徹執行。
1.2.2 基本概念
在系統介紹軟件功能安全之前,本節先參考GJB 451A—2005 和GJB 900A—2012 及MIL-STD-882D和GEIA-STD-0010等相關標準,給出系統安全的相關定義。安全被定義為不出現可能造成人員傷亡、職業病發作、設備損壞、財產損失或環境損害的狀態。該定義是指產品在生命周期內,包括試驗、生產和使用等時的狀態,即產品在某一時刻是否安全。安全性指產品所具有的不導致人員傷亡、系統毀壞、重大財產損失或不危及人員健康和環境的能力。安全性和安全的概念非常接近,后者更強調產品瞬時的安全狀態,而前者強調產品在生命周期內維持安全狀態的能力。
簡單來說,軟件安全性可以被認為是軟件所具有的不導致人員傷亡、系統毀壞、重大財產損失或不危及人員健康和環境的能力。然而,由于軟件自身不能直接造成安全事故,和產品安全性相比,這個定義難以直指軟件安全性的本質。為了強調軟件安全性的特性,學術機構、相關學者及標準都提出了軟件安全性的定義。例如,在NASA 8719.13A中,軟件安全性是指在軟件生命周期內,應用安全性工程技術,確保軟件采取積極的措施提高系統安全性,確保降低系統安全性的錯誤已經減少到或控制在一個風險可接受的水平內;Leveson 指出,軟件安全性是指確保軟件在系統上下文中執行時不會發生不可接受的風險;GJB142—2014則將軟件安全性定義為軟件具有的不導致事故發生的能力。
與軟件安全性較為接近的概念是軟件可靠性。在 GJB/Z161—2012 中,軟件可靠性被定義為在規定的條件下和規定的時間內,軟件不引起系統失效的能力。軟件安全性強調軟件不引起系統事故發生,而軟件可靠性強調軟件不引起系統失效。軟件安全性和軟件可靠性的差別主要有以下3點。
(1)軟件安全性不強調量化評估,而軟件可靠性強調量化評估。軟件可靠性的定義強調了“規定的時間”,即通過在一個時間段內考查軟件是否失效來定量衡量軟件的可靠性水平,如采用 MTBF(平均故障間隔時間)、R(可靠度)等可靠性參數來衡量。軟件安全性則主要采用基于軟件安全完整性的分級評估方法來衡量,通常采用安全完整性等級(Safety Integrity Level,SIL)來評價軟件安全性,并具體規定具有不同SIL的軟件需要在生命周期內開展哪些活動及通過哪些評估才能在工程實踐中被認為開發出的軟件足夠可靠。
(2)軟件安全性適用于安全關鍵場景,而軟件可靠性適用范圍更廣泛。軟件安全性聚焦于事故,即可能造成人員傷亡、職業病、設備損壞、財產損失或環境破壞,其應用范圍被限定在安全關鍵領域,如航空、航天、兵器、船舶、核工業、汽車等,分析對象較為明確。軟件可靠性聚焦于失效,因此不局限于事故等安全關鍵場景,分析范圍更大,但考慮到開展軟件可靠性評估工作成本較高,針對非關鍵場景開展軟件可靠性評估工作有時并不能帶來正向收益。
(3)事故并不總是由失效引起的,因此需要在保證軟件可靠性的基礎上開展軟件安全性需求獲取與驗證工作。軟件失效指需求規格說明和軟件行為之間的偏離,軟件失效是導致系統事故的重要因素。然而,即使軟件未發生失效,也可能由于軟件安全性需求獲取不充分而導致系統事故的發生。例如,飛機控制軟件的需求規格說明中未指出飛機起飛后起落架必須收回,則飛機在實際飛行過程中未收回起落架不被認為軟件失效,但此時系統存在嚴重的安全隱患,可能導致重大事故的發生。因此,需要開展軟件安全性需求獲取工作,獲取 “飛機在飛行時起落架必須保持收回狀態”等軟件安全性需求,并驗證該需求實現的正確性、一致性等。
軟件安全性和軟件信息安全也是一組相近的概念。兩者的主要區別在于,軟件安全性主要考查軟件功能是否能可靠實現,而軟件信息安全主要考查軟件是否能抵御入侵者的攻擊,包括后門攻擊、流量攻擊、信息竊取、木馬攻擊等。實際上,由于軟件安全性涉及對安全關鍵功能、指令、數據的防護,而軟件信息安全涉及對功能、指令、數據的入侵、竊取和破壞,因此保障軟件信息安全也是保證軟件安全性不可缺少的一環。當然,我們也需要權衡軟件安全性和軟件信息安全之間的關系。例如,對多個不同來源的關鍵指令采用表決機制檢查其一致性可以有效保障軟件的安全性,但源于多系統的數據融合也容易帶來軟件信息安全問題。
1.2.3 工作內容
開展軟件安全性相關工作主要遵循驗證和確認(Validation&Verification,V&V)瀑布式開發流程,在每個主要階段,如系統需求分析與設計階段、軟件需求分析階段、軟件設計階段、軟件實現階段、軟件測試階段,開展軟件安全性相關工作。主要工作思路是,識別出可能導致系統嚴重事故發生的軟件作為軟件安全性分析對象,在考慮系統已經采取的安全措施的基礎上,通過編制軟件安全性計劃的方式,在軟件生命周期中考慮如何保障軟件安全性,開展軟件安全性分析、評估、驗證等工作,確保軟件足夠安全并最終形成軟件足夠安全的結論。
在軟件生命周期中的各個階段開展的軟件安全性相關工作如下。
(1)在系統需求分析與設計階段,開展軟件安全性等級確定及軟件安全性計劃編制兩項工作。
軟件安全性等級確定工作首先需要確定軟件是否為安全關鍵軟件。如果是,則需要確定軟件安全性等級,并對具有不同安全性等級的軟件選用不同的安全性方法和管理措施,以保障軟件滿足不同的安全性要求。一般來說,當系統/子系統被確認為安全關鍵系統后,需要對該系統/子系統內的所有軟件進行分析。可以從以下方面確認安全關鍵軟件:①軟件實現或控制了系統的安全關鍵功能;②軟件能夠導致或控制危險的發生;③軟件用于處理安全關鍵場景的數據和指令,這些數據和指令可能會導致其他系統出現安全事故或導致決策錯誤并造成嚴重后果;④軟件用于檢測系統的安全狀態,具備告警功能;⑤和其他安全關鍵軟件在同一分區內,無法徹底屏蔽級聯失效的其他軟件。
軟件安全性計劃編制工作能夠從技術和管理的角度,保障軟件中的風險被充分地識別、處理和規避,并為這些技術的落實提供管理支持,為后續時間、人員、資源、成本等的分配提供依據。軟件安全性計劃應包括:①軟件安全性工作要求,如組織結構、活動項(分析對象、分析與測試驗證技術等)、執行方式、預期進度,以及與軟件工程、軟件可靠性工程、系統安全性工程的關系等;②軟件安全性管理要求,如軟件安全性工作的審查節點、審查人員、審查方式、審查通過判據等;③在軟件需求、使用方式與預期存在較大偏差,或者軟件經過了迭代修改時,應及時修改軟件安全性計劃。
(2)在軟件需求分析階段,開展軟件安全性需求獲取工作及軟件安全性需求驗證工作。
軟件安全性需求獲取工作主要以工程經驗、相關標準、分析人員經驗、歷史事故報告、系統安全性需求、系統危險分析等作為輸入,凝練、提取軟件安全性需求,以保證軟件安全性需求的正確性、充分性、一致性等相關屬性。尤其是軟件安全性需求的充分性容易被遺漏,必須通過軟件安全性需求獲取工作保證軟件需求規格說明的安全性。軟件安全性需求獲取工作應保證:①不允許單個功能或操作觸發潛在的危險;②充分識別安全相關的軟件需求,包括軟件在某種模式或狀態下“必須”執行的操作或保持的狀態,以及“禁止”執行的操作或觸發的狀態;③當可能導致事故發生的失效出現時,軟件應能使系統進入安全狀態,即失效安全(Fail-Safe)狀態;④軟件安全性需求應具有雙向可追蹤性,具有唯一標識,做到描述準確、可測試、可驗證。
軟件安全性需求驗證工作以軟件安全性需求作為驗證對象,主要驗證軟件安全性需求的正確性、充分性和一致性等屬性,從而發現軟件需求中存在的前后矛盾、描述不清晰、安全關鍵功能未定義等問題,并發現新的軟件安全性需求問題,提升軟件安全性需求質量。軟件安全性需求驗證工作應保證:①對潛在的失效進行考慮,并提出明確的失效緩解措施,如失效安全機制、關鍵指令保護、關鍵決策表決、對時序約束的檢查與保護、對失效的冗余措施等;②對系統應處于的狀態進行嚴格的限制和約束,以防止系統由于觸發了非預期事件處于非預期狀態,進而引發潛在的事故;③對軟件安全性需求的正確性、充分性和一致性進行檢查;④保證軟件安全性需求的可追溯性。
(3)在軟件設計階段,開展軟件安全性設計和驗證工作。
軟件安全性設計工作主要用于發現軟件設計階段新的危險源,將軟件安全性需求進一步細化到模塊和組件上,并采用一系列工程技術滿足軟件設計的安全性。軟件安全性設計工作主要包括:①進一步細化需求階段的軟件安全性分析,開展軟件故障樹分析(SFTA)、軟件失效模式和影響分析(SFMEA)、數據流分析、信息流分析、軟件復雜網絡分析等工作;②將細化的軟件安全性需求分配到模塊和組件上,并對安全關鍵模塊或組件進行標識;③制定軟件安全性準則,并依據軟件安全性準則開展軟件安全性設計工作。
軟件安全性設計驗證工作主要用于確保軟件安全性設計實現的正確性、充分性和無二義性。軟件安全性設計驗證工作主要包括:①驗證軟件安全性設計是否正確實現;②保障軟件在運行中處于安全狀態,以及出現失效時軟件可以將系統置于安全狀態;③確保軟件在失效時可以被物理隔離或邏輯隔離,防止級聯失效的出現。
(4)在軟件實現階段,開展代碼安全性分析驗證工作。
代碼安全性分析驗證工作主要面向代碼編寫規范、編碼檢查單等,驗證代碼實現與安全性需求、設計的一致性。代碼安全性分析驗證工作主要包括:①代碼實現功能與需求、設計的可追蹤性,保證所有需求項和設計項已實現,并且未引入額外的功能;②開發時遵守代碼編寫規范,按編碼檢查單進行開發,如遵守 MISRA C 開發標準等;③代碼實現沒有引入額外的危險。
(5)在軟件測試階段,開展軟件安全性測試驗證工作。
軟件安全性測試驗證工作主要用于驗證是否所有軟件安全性需求都被正確實現,以及在異常情況下和臨界情況下軟件能否維持在安全運行狀態并保證軟件安全性測試的充分性。軟件安全性測試驗證工作主要包括:①所有可識別的危險都已經消除,或者影響處于可接受的范圍內;②軟件在硬件異常輸入、人員異常操作、通信錯誤等異常情況下仍能使系統安全運行;③在測試階段發現的問題,必須修改后進行問題歸零,并采用回歸測試的方式保證問題修復過程未引入更多的缺陷;④滿足測試覆蓋率要求,所有安全性功能得到了正確的執行。