[摘 要] 軟件的安全問題是安全的軟件產品在軟件生命周期的各個環節都必須解決的技術問題。本文詳細分析了軟件開發的設計、編寫代碼、安全性測試和維護等各個階段存在的安全問題,并提出了相應的解決方案。
[關鍵詞] 威脅建模 安全性測試 漏洞響應
一、軟件設計階段威脅建模
安全從設計開始。軟件在設計階段達到的安全性能將是軟件整個生命周期的基礎,如果在設計階段出了安全問題,那將成為致命的缺陷,所以設計要盡可能完善。在軟件設計階段應該明確安全方面有哪些目標需要達到、軟件可能遇到的攻擊和安全隱患等。威脅建模是在軟件設計階段加入安全因素的好辦法。威脅建模除了和設計階段的其他建模工作類似的地方外,更加關心安全問題,如在模型中應當指明安全邊界、指明哪些數據是可信的、哪些輸入接口應當被假設為攻擊目標、列舉所有潛在的攻擊方式等。常見的威脅建模一般會包括以下幾方面內容:
1.Description:對系統的簡短描述。一般要求突出數據流穿越安全邊界、身份驗證發生在哪里,哪些操作應當被假設為攻擊等。
2.DFD:數據流圖描述。它關注的是數據的走向,一般需要表明系統安全邊界和所有出入安全邊界的數據,系統安全邊界以外的所有輸入都將被假設為潛在的攻擊性輸入,在其穿越安全邊界進入系統之前應當經過嚴格的格式檢查或身份驗證。
3.Check and Balances:一般是一組表,需要列舉出系統所有的輸入點,并標明這些接口的數據來源是否可信等。
4.Threats:這部分應該列舉出系統可能遇到的所有潛在安全風險和攻擊方式。
二、安全代碼的編寫
在軟件的代碼編寫階段,同樣有許多安全問題需要注意,因為因為程序員往往會在不經意間使用一些不安全的函數。見下面一段代碼:
function demo(char *a)
{
char b[100];
…
strncpy(b,a,strlen(a));
…
}
在這一段代碼中,當傳入的字符串a的長度大于100字節的時候,將發生溢出。
再如下面一段修改demo函數的代碼:
function demo (char *a) {
char *b;
…
int len=strlen(a);
b=malloc(len+1);
strncpy(b,a,stlen(a));
…
}
仔細考慮一下里面的安全問題,其實這并不能絕對確保程序里傳入的字符a不是一個NULL指針,另外還需要考慮在哪里free堆空間,否則將會造成內存泄露。
可見,做到真正安全的使用這些字符串操作函數并不是一件非常簡單的事情。Visual Studio 2005在編譯時可以自動警告堆strcpy、strcat等不安全函數的調用,我們可以使用VS2005提供的一套新的安全字符串操作函數,如strcpy_s()、strncpy_s()、stncat_s()等。
軟件的代碼編寫階段的安全除了要求程序員提高編程質量之外,使用GS安全編譯選項也能大大提高軟件的安全水平。
三、軟件的安全性測試
測試作為軟件發布前重要的一步工作,肩負著軟件可用性和安全性等諸多任務,所以也決定著軟件的質量。而安全性測試和普通的功能性測試主要目的不同,前者是“確保軟件不會去完成沒有預先設計的功能”,而前者只是“確保軟件能夠完成預先設計的功能”。安全性測試是安全的軟件生命周期中一個重要的環節。進行安全測試需要精湛的攻擊技術、敏銳的黑客思維和豐富的開發經驗。一次安全性測試實際上就是一輪多角度、全方位的攻擊,其目的就是要搶在攻擊者之前盡可能多的找到軟件中的“所有”漏洞,以減少軟件遭到攻擊的可能性。
安全性測試非常靈活,需要像黑客一樣思考,有時甚至需要一點靈感,因此沒有固定的步驟可以遵循。測試方案中通常使用使用畸形的文件結構、發送畸形的數據包、用戶輸入的驗證、驗證資源之間的依賴關系、偽造程序輸入和輸出時使用的文件、古怪的路徑表達方式、異常處理、訪問控制與信息泄露和對程序反匯編等方法。
四、漏洞響應和產品的維護
即使在設計、代碼編寫和測試過程中加入了安全因素,最終的軟件產品仍可能存在漏洞。當漏洞被發現后,迅速確認、響應、修復漏洞是非常重要的。所以,軟件的維護和跟蹤要及時持續。大型的軟件公司都會有自己的安全響應隊伍專職處理安全事件,在發現漏洞后的第一時間采取措施,以保護客戶的利益不被侵害。
一般來說,正常的漏洞響應可以大致分為以下4個階段:
1.發現漏洞通知廠商:漏洞首先被報告給安全響應中心,經過初步的鑒定,安全響應隊伍回想漏洞上報者確認已經收到漏洞報告,此刻正在進行分析。
2.確認漏洞和風險評估:安全響應隊伍會聯系上報者和相關產品的開發部門,以獲得更多的技術細節,有時甚至會將上報者和開發團隊召集在一起進行討論。當漏洞被成功重現后,為漏洞定一個威脅等級。
3.修復漏洞:安全響應隊伍和開發隊伍協商決定解決方案,并確定響應工作的時間表。開發部門開始修復漏洞,補丁完成后,進行嚴格的測試。
4.發布補丁及安全簡報:對外公布安全補丁,通知所有用戶patch漏洞,在網站上發布安全簡報,其中會特別感謝上報漏洞和協助修復漏洞的安全研究人員。
參考文獻:
[1]李 昕 陳智李俐:開源軟件安全問題與對策[J].計算機安全,2008.4
[2]宋吉廣:軟件世界[J].中國期刊全文數據庫,2007.21