摘要:介紹了嵌入式軟件在中斷使用中存在的中斷沖突,通過典型案例分析了沖突產生的機制和類型及對軟件造成的影響與危害,針對其中的軟件安全漏洞提出了檢測和分析方法。針對軟件中斷沖突提出了三種解決方案,并分析了三種方案的優缺點,為軟件設計人員提高軟件安全性可靠性提供設計參考。
關鍵詞:嵌入式軟件;中斷沖突;軟件安全漏洞
引言
隨著嵌入式軟件越來越多的應用在工控領域,其承載著越來越多的數據采集和處理、數據通信、自動控制與管理、系統安全保障等重要任務,同時也滿足同步處理、實時處理、突發事件處理等性能要求。嵌入式軟件的復雜性要求中斷技術成為軟件設計中必不可少的組成部分。中斷技術的使用很容易引入中斷資源的使用沖突,這些沖突存在著隨機性、隱蔽性和不可預知性,一旦發生將會造成程序錯誤,甚至導致嚴重軟件故障,尤其對航空航天等對可靠性安全性要求極高的領域,如何發現和消除中斷沖突帶來的安全隱患已經成為一個嚴峻的課題。
一、什么是中斷沖突
沖突體現在代碼針對某個或某些共享資源發生了訪問競爭而造成程序錯誤。如果某個資源在被讀取的過程中被打斷,進行了寫操作,或在被寫的過程中被打斷,進行了讀取或重寫操作,則可能存在訪問沖突?!氨淮驍唷卑ㄖ鞒绦蛑械馁Y源被某個中斷服務子程序打斷、一個中斷服務子程序的資源被某個高級中斷服務子程序打斷等情況。
二、如何識別和判斷中斷沖突是重要前提。
(一)首先通過一個簡單的例子來了解一下什么是中斷沖突:
某嵌入式軟件中包含遙控和遙測兩個任務,由兩個中斷服務程序來實現,遙測任務優先級高于遙控任務,即遙控任務可以被遙測任務搶占,兩個任務中均進行模式設置,模式設置由一對組合變量TM_Mode和NewModeSet實現,遙控任務中代碼如下:
TM_Mode = TM_Mode| 0xC0; (1)
TM_Mode = TM_Mode 0x03; (2)
NewModeSet = (NewModeSet 0x38) | 0xC0; (3)
在遙測中斷中會啟動遙測任務,由于遙測任務優先級高,若遙控任務被遙測任務打斷,遙測任務也對TM_Mode和NewModeSet進行設置,遙測任務中代碼如下:
If(TM_Mode>= 0xC0)
{
TM_Mode = (TM_Mode 0x03) >> 4;
NewModeSet = NewModeSet 0x3F;
}
如果在遙控任務的第(1)句和第(2)句之間被遙測任務打斷,則會改寫TM_Mode和NewModeSet的值,遙測任務執行完成后返回遙控任務繼續處理時則造成TM_Mode和NewModeSet不匹配的錯誤。
(二)再通過一個例子進一步分析中斷沖突:
軟件中設置54字節控制信息數據,控制信息數據存放在buf[0]~buf[53],其中buf[48]為壓力傳感器溫度數據,buf[49]為壓力傳感器壓力數據,buf[53]為前53字節的校驗和。在主函數中采集buf[48]和buf[49],在外部中斷4(采樣中斷高優先級)中依次采集buf[0]~buf[47]和buf[50]~buf[52],讀取主循環中采集的buf[48]和buf[49],并計算校驗和寫入buf[53]。在外部中斷6中(取數中斷,低優先級)發送54,字節控制信息數據。與問題相關的流程圖如下:
從流程圖中分析,產生數據訪問沖突的場景有三個:
場景一:外部中斷4完成累加和計算退出中斷到進入外部中斷6發送數據前的時間段內,若主循環恰好運行到對buf[48]和buf[49]進行寫操作語句,在外部中斷6發送之前buf[48]和buf[49]被改寫,而未重新計算校驗和buf[53],導致外部中斷6發送的控制信息數據校驗和錯誤。
場景二:主程序寫buf[48]和buf[49]之間產生外部中 v 斷4,讀取了buf[48]和buf[49],并對校驗和進行了計算,退出外部中斷4返回主程序后,又對buf[49]進行寫操作,在外部中斷6發送之前buf[49]被改寫,而未重新計算校驗和buf[53],導致外部中斷6發送的控制信息數據校驗和錯誤。
場景三:外部中斷4的優先級高于外部中斷6,若在外部中斷6發送buf[0]~buf[53]的過程中產生外部中斷4,在中斷4中對buf[0]~buf[47]、buf[50]~buf[52]以及校驗和進行了寫操作,待退出外部中斷4返回外部中斷6執行時,由于一部分數據已經被發送,后一部分數據以及校驗和在外部中斷4中被刷新,仍會導致發送出去的控制信息校驗和錯誤。
我們可以通過靜態分析法檢查中斷資源沖突,針對所有中斷服務子程序中訪問資源,逐一分析其在主程序(含其調用的子模塊)、各個中斷服務子程序中的訪問情況,以確定資源訪問過程中是否存在沖突:
表1 中斷屬性表
表2 中斷程序使用資源引用關系總結表
此方法不僅能有效檢測多字節的變量、緩沖區、數組的數據訪問沖突,同時也能夠檢測寄存器訪問沖突,比如主程序給某個寄存器賦值后,被中斷打斷使用該寄存器進行其他賦值,則在中斷返回后主程序使用該寄存器數值時,導致數據被意外改寫。目前北京軒宇信息技術有限公司開發的檢測工具SpacChecker能夠有效檢測此類沖突資源。
三、中斷沖突的分類
中斷沖突包含主程序與中斷服務程序的資源沖突,低優先級中斷服務程序與高優先級中斷服務程序的資源沖突。可導致的故障可分為中斷向量初始化故障,中斷現場保護和現場恢復問題,多級中斷與主程序相互干擾問題,中斷嵌套問題,與時序相關的中斷沖突問題。
四、沖突檢測的意義
嵌入式軟件研制中,廣泛采用中斷服務機制來實現任務需求,但中斷系統的設計和實現過程很容易引入軟件錯誤。導致軟件在運行過程中不定時發生莫名的錯誤或遙測數據錯誤等不可預知的錯誤,影響軟件的正常運行。
由于中斷觸發的隨機性和不確定性,造成軟件測試過程中很難發現和定位該類問題。一旦軟件帶著這些安全漏洞層層闖關并最終烙焊、生產,將會給使用者帶來安全隱患,嚴重的甚至會造成不可估量的損失。
五、解決方法研究
(一)關中斷法:讀/寫過程關中斷是常見的數據訪問沖突預防措施,在可能產生中斷的位置關閉相關中斷,以保證數據不被打斷,尤其是多字節數據和原子操作語句,采用該措施是非常有效的。另外要注意的是在初始化完成前是不能夠打開中斷的,因為如果提前打開了中斷,在初始化工作還未完成前有中斷信號產生,程序允許中斷觸發,此時中斷向量入口還未初始化,則程序將跑飛。關中斷措施在具體實施時,需要特別注意如下兩個方面:一是確認當前關中斷不能意外被打開,如果此時關閉了某一個中斷,但在另一個未被關的中斷服務子程序中打開了該關閉中斷,則造成當前關中斷操作失效。二是需要結合軟件需求確認當前關中斷時間是否影響軟件性能要求,如果關中斷時間太長影響軟件對中斷的響應時間,則造成其他功能失效。
(二)兵乓存儲法:是一種應用于數據流控制的常見處理技巧,輸入數據流通過輸入選擇單元將數據流分配到兩個數據緩沖區,一個模塊對一個數據緩沖區進行讀操作過程中,另一個模塊對另一個數據緩沖區進行寫操作,交替使用,循環進行,避免了數據沖突,提高處理速度。乒乓存儲法占用的內存區相對較多,如果軟件內存較小,或者內存使用率較高時,可酌情考慮。
(三)設置中斷發生標記法:在讀數據之前設置該標記為無效,在中斷服務子程序中寫該數據后置標記為有效,讀寫完成后判斷該標記是否有效,如果有效則表明該數據已被中斷改寫過,需要重新讀取,以保證當前數據是最新的同步數據,而不會出現跳變。此方法可常用于多字節資源訪問的處理,而且常用于資源讀取操作。
另外,中斷沖突是設計引入的,設計時需要對資源、時序進行分析,采用針對性的規避措施。有些時候不好的編碼形式也會引入中斷沖突相關的錯誤,因此改善編碼形式也是一種有效措施。
六、結束語
針對當前嵌入式軟件中常見的中斷沖突,本文基于靜態分析技術進行了分類分析,并針對軟件安全漏洞給出了不同解決方案,可有效地解決中斷沖突問題,提高軟件的可靠性安全性,可在較廣的應用范圍內推廣。如果沖突資源量較大的情況下,沖突分析的工作量將會相對增加,如何快速高效準確地分析沖突則需要進一步優化。此外,解決方案也存在各自的利弊,軟件設計人員需根據軟件實際需求進行選擇。希望本文能為軟件設計人員提供參考。
參考文獻:
[1]楊芳.嵌入式軟件中斷系統資源檢測技術.計算機工程與設計,2010 年
[2]吳萍,陳意云,張健.多線程程序中斷沖突的靜態檢測[J].計算機研究與發展,2006,43(2):329-335.
[3]董麗.航天型號并發軟件測試技術研究 [D].北京: 中國航天第
二研究院碩士學位論文, 2005.
[4]Dennis Brylow, Jens Palsberg. Deadline analysis of interrupt-driven software[J].IEEE Transactions on software engineering,2004,30(10):634-655.
[5]周新蕾,繆崢紅.安全關鍵軟件的可靠性測試.載人航天 2005,06(6)