林偉欣, 胡源, 李梅
(卡斯柯信號(hào)有限公司, 上海 200070)
隨著鐵路信號(hào)系統(tǒng)復(fù)雜程度和智能化的提高,系統(tǒng)中需要軟件實(shí)現(xiàn)的能力越來越多,規(guī)模和復(fù)雜性持續(xù)增加,軟件在整個(gè)系統(tǒng)中的作用也越來越重要,保障軟件的安全性成為保證系統(tǒng)安全性的關(guān)鍵環(huán)節(jié)。軟件是邏輯思維的產(chǎn)物,軟件錯(cuò)誤的本質(zhì)是設(shè)計(jì)者思維邏輯的錯(cuò)誤。軟件的失效主要是系統(tǒng)性失效,難以用定量的方法進(jìn)行評(píng)估,這給軟件安全分析帶來了難度。同時(shí),軟件階段的設(shè)計(jì)和實(shí)現(xiàn)人員一般是軟件需求或者編程方面的專家,而對(duì)功能安全方面的知識(shí)關(guān)注略少,使得安全需求在軟件設(shè)計(jì)和具體實(shí)現(xiàn)的落地存在一些不確定性,除了加強(qiáng)人員能力要求外,在軟件安全保障過程中,需要有系統(tǒng)性的分析流程來保證軟件設(shè)計(jì)符合其預(yù)定的安全目標(biāo)。
在軌道交通信號(hào)系統(tǒng)領(lǐng)域,EN50128標(biāo)準(zhǔn)對(duì)鐵路控制和保護(hù)系統(tǒng)防護(hù)軟件保證其研發(fā)等級(jí)(SIL0-SIL4)的方法、技術(shù)和軟件生命周期進(jìn)行了系統(tǒng)性描述[1]。該標(biāo)準(zhǔn)明確指出,對(duì)于復(fù)雜的軟件,現(xiàn)階段諸如故障避免、故障檢測(cè)和故障容錯(cuò)的方法都不能保證我們?cè)诙x和設(shè)計(jì)軟件過程中不出現(xiàn)任何錯(cuò)誤。為保證開發(fā)的軟件達(dá)到相應(yīng)的研發(fā)等級(jí),需要有與軟件全生命周期相對(duì)應(yīng)的完整的開發(fā)流程來避免和減少系統(tǒng)性失效。該流程中,對(duì)安全關(guān)鍵軟件在各個(gè)階段展開安全分析和驗(yàn)證工作,是發(fā)現(xiàn)軟件缺陷,保證軟件質(zhì)量,保證系統(tǒng)功能安全的重要手段。EN50128中給出了在軟件生命周期內(nèi)進(jìn)行安全需求的確定、設(shè)計(jì)和驗(yàn)證的流程圖。
EN50128中推薦的軟件開發(fā)V模型包括軟件需求、架構(gòu)設(shè)計(jì)、組件設(shè)計(jì)、組件實(shí)現(xiàn)、單元測(cè)試、繼承測(cè)試、確認(rèn)測(cè)試和軟件維護(hù)8個(gè)階段,涵蓋了軟件開發(fā)的整個(gè)生命周期,各個(gè)階段通過標(biāo)準(zhǔn)化的文檔進(jìn)行信息傳遞。軟件安全保證是流程貫穿在軟件開發(fā)生命周期的各個(gè)階段中的,是軟件開發(fā)生命周期的有機(jī)組成部分。
本文基于EN50128標(biāo)準(zhǔn)的要求,從軟件安全需求的獲取和驗(yàn)證、基于軟件需求和結(jié)構(gòu)規(guī)格說明的軟件失效影響分析、對(duì)軟件安全代碼的驗(yàn)證3個(gè)方面,給出了安全關(guān)鍵軟件的一種安全性保證的途徑,可以作為軌道交通領(lǐng)域通信信號(hào)和處理系統(tǒng)的鐵路控制和防護(hù)軟件全生命周期安全保證的實(shí)用流程。
隨著安全關(guān)鍵領(lǐng)域軟件的復(fù)雜度和重要性的增加,近年來對(duì)軟件安全性評(píng)價(jià)和保障方法的研究也越來越多。文獻(xiàn)[2]針對(duì)航空機(jī)載軟件安全性評(píng)價(jià)的難題,給出59種評(píng)價(jià)元素將軟件每個(gè)階段的關(guān)鍵活動(dòng)進(jìn)行量化,在軟件整個(gè)生命周期采用分類模糊綜合評(píng)價(jià)方法,建立了評(píng)價(jià)模型,得出軟件安全分值,為軟件總體質(zhì)量的評(píng)價(jià)和軟件安全性的改進(jìn)方向提供支撐。文獻(xiàn)[3]針對(duì)航空電子機(jī)載軟件的安全性、完整性和可追溯性要求,提出了在軟件生命周期各研發(fā)階段增加具體安全性相關(guān)活動(dòng)提高軟件安全性的過程保障方法。文獻(xiàn)[4]介紹了安全關(guān)鍵軟件中同樣的軟件安全性分析技術(shù)和流程,并對(duì)其在CBTC車載子系統(tǒng)中的應(yīng)用進(jìn)行了介紹。文獻(xiàn)[5]依據(jù)面向軟件安全需求分析過程建立安全相關(guān)信息完整的雙向追蹤過程,構(gòu)建軟件安全需求分析的過程追蹤模型,分析其中的重要實(shí)體和關(guān)聯(lián)。文獻(xiàn)[6]和文獻(xiàn)[7]將形式化方法和建模引入到軟件的安全性分析過程中。其中,文獻(xiàn)[6]借助OCL表達(dá)式對(duì)安全相關(guān)的約束關(guān)系建模,并將其融入到UML模型,進(jìn)行軟件失效模式的識(shí)別,以求提供軟件安全分析的效率,降低分析工作量。文獻(xiàn)[7]將系統(tǒng)理論過程分析(STPA)方法應(yīng)用到軟件安全性驗(yàn)證過程中來,構(gòu)建帶有軟件過程模型變量的過程模型,生成軟件安全性需求,并采用模型檢驗(yàn)技術(shù)對(duì)軟件安全性進(jìn)行驗(yàn)證,以失敗軟件潛在危險(xiǎn)控制路徑,減少對(duì)人工分析的依賴。
目前,這些研究大部分集中在航空航天領(lǐng)域安全相關(guān)軟件生命周期某些環(huán)節(jié)的安全保障研究,一些量化或者形式化的軟件安全保障方法,存在標(biāo)準(zhǔn)確定困難或者全生命周期形式化建模驗(yàn)證的困難。針對(duì)鐵路信號(hào)系統(tǒng)安全關(guān)鍵軟件的全流程安全保障研究集中在流程研究,缺乏具體的實(shí)現(xiàn)措施,特別是針對(duì)軟件本身衍生的安全性需求的分析方法較少討論。本文基于信號(hào)系統(tǒng)鐵路控制和防護(hù)軟件的開發(fā)V模型,給出了在軟件需求、軟件架構(gòu)設(shè)計(jì)和軟件編碼階段實(shí)現(xiàn)軟件安全分析的要點(diǎn),可操作性強(qiáng)。
對(duì)軟件而言,需要考慮的是軟件在生命周期內(nèi)如何減少和避免系統(tǒng)性失效。針對(duì)軌道交通信號(hào)系統(tǒng)中的安全關(guān)鍵軟件,本文提出的軟件安全分析流程集中在軟件需求,軟件架構(gòu)設(shè)計(jì)和軟件代碼實(shí)現(xiàn)3個(gè)階段,上一階段的輸出作為下一階段的輸入,構(gòu)成了完整的安全分析流程。
軌旁設(shè)備安全控制平臺(tái),是我公司開發(fā)的2取2安全架構(gòu)的嵌入式安全平臺(tái)。使用的軟件是基于國(guó)產(chǎn)自主高可信嵌入式操作系統(tǒng)開發(fā)。其軟件開發(fā)流程遵循V模型,開發(fā)、測(cè)試活動(dòng)和對(duì)應(yīng)的安全活動(dòng)如圖1所示。
軟件需求階段的安全保障工作主要是獲取安全相關(guān)需求,并對(duì)安全需求的可追溯性和完整性進(jìn)行驗(yàn)證。軟件與系統(tǒng)密不可分,軟件的安全需求的源頭和軟件的安全完整性等級(jí)是在系統(tǒng)級(jí)確定和分配的。軟件的安全性需求是對(duì)系統(tǒng)級(jí)安全需求在軟件層級(jí)的細(xì)化。比如,在安全平臺(tái)控制系統(tǒng)中,系統(tǒng)需求提到,當(dāng)軟件出現(xiàn)異常時(shí),系統(tǒng)進(jìn)入安全狀態(tài)。則軟件安全需求細(xì)化為當(dāng)軟件出現(xiàn)任務(wù)堆棧溢出、任務(wù)超時(shí)、輸入值超范圍、返回值超范圍時(shí),應(yīng)進(jìn)入安全狀態(tài)模式。這種細(xì)化可以由軟件需求工程師完成,并由軟件安全工程師根據(jù)需求標(biāo)簽建立系統(tǒng)安全需求和軟件安全相關(guān)需求的追蹤關(guān)系,對(duì)系統(tǒng)級(jí)安全工程師提出的系統(tǒng)安全需求在軟件層級(jí)的繼承展開可追溯性和完整性驗(yàn)證,確保軟件層級(jí)的需求規(guī)范文檔完整、正確地繼承了這些安全需求,并將這些安全需求與分配到軟件的系統(tǒng)危害關(guān)聯(lián)起來,以便進(jìn)行危害管理。
圖1 安全控制平臺(tái)所使用的開發(fā)過程模型
另一方面,是在軟件實(shí)現(xiàn)的過程中,由設(shè)計(jì)方案、軟件架構(gòu)的選取,或者執(zhí)行決策產(chǎn)生的附加安全性需求。在安全控制平臺(tái)系統(tǒng)開發(fā)中,該系統(tǒng)采用2取2的架構(gòu),通過我們的安全分析,應(yīng)避免共因失效,因此在每個(gè)通道的軟件需求上有相異性的要求。比如,通道A的CRC采用查表法計(jì)算獲得,通道B的CRC采用多項(xiàng)式除法獲得。同時(shí),在軟件需求階段,可以針對(duì)一些關(guān)鍵功能和數(shù)據(jù)接口定義,采用FMECA方法,結(jié)合公司級(jí)的軟件失效模式庫,開展軟件失效模式危害影響分析。這類附加的安全需求可能影響系統(tǒng)層級(jí)的安全需求,形成軟件到系統(tǒng)的需求反饋回路,并形成新的系統(tǒng)安全需求,再向軟件層級(jí)進(jìn)行迭代分配。整個(gè)需求獲取和驗(yàn)證過程如圖2所示。
這一階段的重點(diǎn)是軟件安全需求可追溯性和完整性驗(yàn)證,對(duì)軟件需求的FMECA分析不是必須的,可以由項(xiàng)目安全人員根據(jù)項(xiàng)目需要確定分析范圍,選擇性開展。在對(duì)軟件安全需求進(jìn)行驗(yàn)證的過程中,利用公司級(jí)的軟件失效模式庫,可以有效指導(dǎo)我們進(jìn)行安全關(guān)鍵軟件功能模塊的確定,對(duì)影響較大的功能展開快速有效的影響分析,提高分析效率。
在這一過程中,我們得到了完整的軟件安全需求、安全關(guān)鍵功能、安全相關(guān)的接口和全局?jǐn)?shù)據(jù)定義,作為我們下一階段安全分析的輸入。
圖2 軟件安全需求的獲取
軟件架構(gòu)描述的是直接構(gòu)成系統(tǒng)的抽象模塊以及各模塊之間的通訊,一個(gè)傳統(tǒng)的軟件架構(gòu)包括與硬件的接口、服務(wù)層(包括操作系統(tǒng)和調(diào)度器)以及運(yùn)行在系統(tǒng)上的各個(gè)功能模塊。軟件運(yùn)行在相應(yīng)的硬件上(比如CPU、板卡等),如圖3所示。軟件的架構(gòu)模型與系統(tǒng)的硬件架構(gòu)的選取息息相關(guān),有必要從系統(tǒng)軟件運(yùn)行的物理架構(gòu)對(duì)軟件進(jìn)行解剖,可以得到軟件運(yùn)行在不同硬件上或者同一硬件上不同分區(qū)的限制條件和衍生的非功能性安全需求。比如,安全平臺(tái)的計(jì)算單元采用的是二取二結(jié)構(gòu)的板卡,軟件運(yùn)行在不同的CPU上,雙通道通過雙口RAM接口進(jìn)行交互,則對(duì)其中一些全局變量、接口(組件之間、軟件和硬件之間)展開安全分析進(jìn)行安全分析時(shí),就會(huì)產(chǎn)生軟件交互需要保證雙通道獨(dú)立性的安全需求(雙通道之間交互不采用明文、不使用對(duì)方通道的控制信息、設(shè)置超時(shí)等待機(jī)制等等)。在軟件實(shí)現(xiàn)的過程中,因技術(shù)的選取可能有不同于系統(tǒng)的運(yùn)行模式,對(duì)各模式之間轉(zhuǎn)換條件的分析,可以得到因軟件本身引入的功能安全需求。而對(duì)軟件數(shù)據(jù)流、控制流、時(shí)序等邏輯的分析,既可以得到因軟件本身引入的功能安全需求,也可以對(duì)絕大部分系統(tǒng)分配的安全需求進(jìn)行驗(yàn)證,保證這些需求在軟件架構(gòu)設(shè)計(jì)的過程中被正確實(shí)現(xiàn)。這一過程其實(shí)是系統(tǒng)安全需求在軟件級(jí)進(jìn)行細(xì)化的過程。比如,在安全平臺(tái)開發(fā)的軟件安全分析過程中,通過進(jìn)行軟件本身架構(gòu)的安全分析,我們發(fā)現(xiàn)90%以上的軟件安全需求可以和系統(tǒng)級(jí)的系統(tǒng)安全需求相對(duì)應(yīng),形成追溯關(guān)系。
在我司安全平臺(tái)的主控系統(tǒng)軟件設(shè)計(jì)時(shí),軟件有初始化、限制模式、更新模式和正常模式;二取二每個(gè)通道軟件運(yùn)行依賴于不同的操作系統(tǒng)、使用不同的編譯器和編譯選項(xiàng),對(duì)于安全關(guān)鍵變量和常量設(shè)計(jì)保護(hù)模式并采取訪問控制措施;對(duì)執(zhí)行安全功能的模塊采用了最小化設(shè)計(jì)理念。這一階段從軟件實(shí)現(xiàn)邏輯、軟件運(yùn)行模式、軟件運(yùn)行依賴的物理架構(gòu)和數(shù)據(jù)定義4個(gè)維度對(duì)軟件展開錯(cuò)誤影響分析,對(duì)執(zhí)行安全功能的模塊執(zhí)行邏輯進(jìn)行驗(yàn)證確認(rèn),得到軟件相關(guān)的安全需求,與繼承自系統(tǒng)的安全需求進(jìn)行對(duì)比,保證了系統(tǒng)級(jí)安全需求在軟件層面的落地。
圖3 軟件架構(gòu)
同時(shí),對(duì)軟件需求的實(shí)現(xiàn)和架構(gòu)設(shè)計(jì)過程中用到的技術(shù)措施要求進(jìn)行驗(yàn)證。分析過程和方法如圖4所示。
圖4 軟件架構(gòu)階段安全分析驗(yàn)證流程
安全架構(gòu)的驗(yàn)證,主要集中在2個(gè)方面:一是采用檢查單的形式對(duì)各個(gè)軟件模塊在設(shè)計(jì)的過程中符合EN50128 A.3表格中對(duì)應(yīng)SIL等級(jí)的開發(fā)技術(shù)使用要求進(jìn)行驗(yàn)證;另一方面,需要基于軟件需求階段整理的安全需求,按照軟件安全功能對(duì)軟件模塊的分配對(duì)照表,保證那些需要在軟件層級(jí)進(jìn)行細(xì)化驗(yàn)證的安全需求在軟件架構(gòu)設(shè)計(jì)的各個(gè)模塊中被正確、完整實(shí)現(xiàn)。
從多個(gè)方面對(duì)軟件架構(gòu)進(jìn)行安全分析:①對(duì)軟件運(yùn)行模式分析,保證軟件設(shè)計(jì)正確性的過程中,可以采用結(jié)構(gòu)化的論證的方法,證明軟件的最終的危險(xiǎn)狀態(tài)不可達(dá),說明其符合預(yù)期的安全功能要求。采用這種方法,可以僅關(guān)注最終對(duì)系統(tǒng)輸出產(chǎn)生危害的那些條件,極大減少了分析的工作量。②對(duì)軟件所依賴的硬件的物理架構(gòu)和使用分配的分析,需要結(jié)合2種分析方法:一是從資源視圖的角度,分析關(guān)鍵臨界資源被哪些進(jìn)程或者模塊調(diào)用,安全關(guān)鍵的臨界資源有哪些;二是從時(shí)序圖的角度,分析關(guān)鍵臨界資源在何時(shí)被什么進(jìn)程或模塊調(diào)用,從而得出需要在什么時(shí)候?qū)δ男┡R界資源施加保護(hù)和監(jiān)控措施。③對(duì)軟件的邏輯和數(shù)據(jù)定義分析可以采用傳統(tǒng)的數(shù)據(jù)流和控制流分析,檢查軟件功能的執(zhí)行次序和依賴性,分析識(shí)別遺漏的以及和軟件需求規(guī)定不一致的功能。④利用??旎蛘呓M件之間的數(shù)據(jù)流圖,可以根據(jù)變量的用途,確定關(guān)鍵變量(特別是模塊間共享的全局變量),說明對(duì)數(shù)據(jù)的約束,確定數(shù)據(jù)的來源、處理及目的地。基于這些信息,確認(rèn)重要數(shù)據(jù)在使用前后是否進(jìn)行了檢查,確定變量的存儲(chǔ)和訪問方式,防止變量未經(jīng)許可的讀寫。
軟件錯(cuò)誤影響分析階段,可能產(chǎn)生一些衍生的安全需求,需要反饋到系統(tǒng)級(jí),由系統(tǒng)級(jí)向下分配。同時(shí),有可能產(chǎn)生一些需要在軟件代碼安全驗(yàn)證階段進(jìn)行細(xì)化檢查的安全相關(guān)項(xiàng)。在安全平臺(tái)軟件開發(fā)階段對(duì)架構(gòu)的驗(yàn)證過程中,將自檢功能中需要檢測(cè)的項(xiàng)和在在測(cè)試計(jì)劃中不是采用測(cè)試的方法進(jìn)行驗(yàn)證的項(xiàng)分配到了代碼級(jí),需要在最底層進(jìn)行進(jìn)一步確認(rèn)。
另外,對(duì)于一些特殊算法的驗(yàn)證,可以采用仿真的方法進(jìn)行,參見文獻(xiàn)[8]。
代碼走查對(duì)于發(fā)現(xiàn)軟件開發(fā)過程中的安全缺陷十分有效,在這一階段,驗(yàn)證代碼實(shí)現(xiàn)的正確性比進(jìn)行代碼級(jí)的安全分析更有意義。安全關(guān)鍵代碼走查采用靜態(tài)分析的方法為主,其檢查主要集中在3個(gè)方面:
(1) 檢查上級(jí)分配的安全功能點(diǎn)是被哪個(gè)模塊的哪個(gè)函數(shù)實(shí)現(xiàn)的,是否正確實(shí)現(xiàn)了分配的功能;
(2) 追蹤實(shí)現(xiàn)功能的函數(shù)被哪些模塊在什么時(shí)間點(diǎn)被調(diào)用,分析調(diào)用的時(shí)間點(diǎn)是否正確,是否存在應(yīng)該調(diào)用該函數(shù)而未被調(diào)用的情況;
(3) 分析非安全模塊與安全模塊之間的交互,檢查非安全模塊對(duì)安全模塊是否有非預(yù)期的影響,非安全模塊和安全模塊之間的交互是否有足夠的防護(hù)措施。
安全代碼走查的實(shí)施可以分為4步,如圖5所示。
圖5 軟件安全代碼走查流程圖
(1) 根據(jù)安全性需求和上一階段輸出的需求進(jìn)行安全確認(rèn)項(xiàng),選取關(guān)鍵模塊的代碼作為審查對(duì)象。
(2) 根據(jù)代碼編寫需要遵循的安全規(guī)則和需求描述,驗(yàn)證代碼實(shí)現(xiàn)的正確性(包括輸入驗(yàn)證、錯(cuò)誤處理代碼、復(fù)雜代碼和進(jìn)行驗(yàn)證、監(jiān)視的代碼),針對(duì)安全性問題對(duì)安全性相關(guān)的代碼進(jìn)行檢查;同時(shí),需要在各個(gè)模塊接口層面驗(yàn)證非安全功能模塊是否對(duì)安全功能模塊有負(fù)面的影響。
(3) 根據(jù)第二階段的審查結(jié)果,向上追溯檢查軟件架構(gòu)的安全問題,并重新確定檢查范圍,再次展開安全相關(guān)代碼走查,直到審查的代碼達(dá)到規(guī)定的安全標(biāo)準(zhǔn)。
(4) 對(duì)于安全關(guān)鍵軟件的編寫,EN50128標(biāo)準(zhǔn)還要求遵循相應(yīng)的編碼規(guī)范,比如對(duì)參數(shù)使用前的檢查,對(duì)指針使用的限制,對(duì)前置條件和后置條件的驗(yàn)證等,避免因軟件錯(cuò)誤的傳播導(dǎo)致系統(tǒng)發(fā)生危險(xiǎn)的失效。這部分檢查可以采用單元測(cè)試分析自動(dòng)化工具完成,能極大提高效率,避免漏檢。在鐵路信號(hào)系統(tǒng)行業(yè),一般每個(gè)公司會(huì)參照標(biāo)準(zhǔn)和行業(yè)規(guī)范,結(jié)合公司實(shí)際,制定公司級(jí)的編碼規(guī)范,并開發(fā)自動(dòng)化工具完成規(guī)則符合性檢查。安全平臺(tái)軟件的規(guī)則檢查就是采用工具實(shí)現(xiàn)的。
在實(shí)際工程應(yīng)用中,要保證本文設(shè)計(jì)的軟件安全保障流程的落地,需要從2個(gè)方面考慮:一是該流程符合EN50128行業(yè)標(biāo)準(zhǔn),確保在軟件生命周期內(nèi)的各項(xiàng)活動(dòng)到達(dá)標(biāo)準(zhǔn)中規(guī)定的安全完整性等級(jí)的要求,確保設(shè)計(jì)的軟件和相關(guān)系統(tǒng)能獲得第三方獨(dú)立評(píng)估機(jī)構(gòu)的證書。這是我們?cè)O(shè)計(jì)的軟件和系統(tǒng)能夠獲準(zhǔn)上道運(yùn)行的必要條件。同時(shí),該保障流程需要具有可復(fù)制性和高效率。表1給出了EN50128標(biāo)準(zhǔn)中軟件保證流程要求和本文的軟件安全保障流程的對(duì)應(yīng)關(guān)系。
該軟件安全保障流程應(yīng)用到了我司的軌旁安全平臺(tái)軟件開發(fā)的過程中,能使安全人員按時(shí)完整安全分析、驗(yàn)證和確認(rèn)各項(xiàng)安全活動(dòng),順利確保了該產(chǎn)品通過第三方獨(dú)立評(píng)估機(jī)構(gòu)的評(píng)估,并獲得了EN50128 SIL4(安全完整度最高等級(jí))證書。該產(chǎn)品目前已經(jīng)廣泛應(yīng)用于我國(guó)城軌線路中。
軌道交通信號(hào)系統(tǒng)中的軟件安全分析是個(gè)系統(tǒng)工程,需要按照EN50128等準(zhǔn)的安全要求,從不同的維度、貫穿軟件生命開發(fā)的各個(gè)周期進(jìn)行分析和驗(yàn)證。本文結(jié)合所開發(fā)的安全控制平臺(tái)的軟件開發(fā)過程提出了軟件開發(fā)需求、設(shè)計(jì)和編碼階段的軟件安全分析和驗(yàn)證流程,并給出了具體的實(shí)現(xiàn)方法,具有較強(qiáng)的可操作性,可以和V模型右邊的軟件測(cè)試確認(rèn)和質(zhì)量保障一起構(gòu)成完整的軟件安全保障流程。
表1 軟件安全保障流程階段對(duì)照表