近來,在我負責的公司某軟件產品的最后測試工作,常常被問到這樣一個問題:在做測試過程中,我們的軟件產品在安全性方面考慮了多少?應該如何測評一個軟件到底有多安全?
這個軟件因為涉及客戶商業(yè)上重要的信息資料,因此用戶關心的核心問題始終圍繞“這個軟件安全嗎”。一個由于設計導致的安全漏洞和一個由于實現(xiàn)導致的安全漏洞,對用戶的最終影響都是巨大的。我的任務就是確保這個軟件在安全性方面能滿足客戶期望。
一、什么是軟件安全性測試
(1)什么是軟件安全
軟件安全屬于軟件領域里一個重要的子領域。在以前的單機時代,安全問題主要是操作系統(tǒng)容易感染病毒,單機應用程序軟件安全問題并不突出。但是自從互聯(lián)網(wǎng)普及后,軟件安全問題愈加顯加突顯,使得軟件安全性測試的重要性上升到一個前所未有的高度。
軟件安全一般分為兩個層次,即應用程序級別的安全性和操作系統(tǒng)級別的安全性。應用程序級別的安全性,包括對數(shù)據(jù)或業(yè)務功能的訪問,在預期的安全性情況下,操作者只能訪問應用程序的特定功能、有限的數(shù)據(jù)等。操作系統(tǒng)級別的安全性是確保只有具備系統(tǒng)平臺訪問權限的用戶才能訪問,包括對系統(tǒng)的登錄或遠程訪問。
本文所講的軟件安全主要是應用程序層的安全,包括兩個層面:①是應用程序本身的安全性。一般來說,應用程序的安全問題主要是由軟件漏洞導致的,這些漏洞可以是設計上的缺陷或是編程上的問題,甚至是開發(fā)人員預留的后門。②是應用程序的數(shù)據(jù)安全,包括數(shù)據(jù)存儲安全和數(shù)據(jù)傳輸安全兩個方面。
(2)軟件安全性測試
一般來說,對安全性要求不高的軟件,其安全性測試可以混在單元測試、集成測試、系統(tǒng)測試里一起做。但對安全性有較高需求的軟件,則必須做專門的安全性測試,以便在破壞之前預防并識別軟件的安全問題。
安全性測試(Security Testing)是指有關驗證應用程序的安全等級和識別潛在安全性缺陷的過程。應用程序級安全測試的主要目的是查找軟件自身程序設計中存在的安全隱患,并檢查應用程序對非法侵入的防范能力, 根據(jù)安全指標不同測試策略也不同。注意:安全性測試并不最終證明應用程序是安全的,而是用于驗證所設立策略的有效性,這些對策是基于威脅分析階段所做的假設而選擇的。例如,測試應用軟件在防止非授權的內部或外部用戶的訪問或故意破壞等情況時的運作。
二、軟件安全性測試過程
(1)安全性測試方法
有許多的測試手段可以進行安全性測試,目前主要安全測試方法有:
①靜態(tài)的代碼安全測試:主要通過對源代碼進行安全掃描,根據(jù)程序中數(shù)據(jù)流、控制流、語義等信息與其特有軟件安全規(guī)則庫進行匹對,從中找出代碼中潛在的安全漏洞。靜態(tài)的源代碼安全測試是非常有用的方法,它可以在編碼階段找出所有可能存在安全風險的代碼,這樣開發(fā)人員可以在早期解決潛在的安全問題。而正因為如此,靜態(tài)代碼測試比較適用于早期的代碼開發(fā)階段,而不是測試階段。
②動態(tài)的滲透測試:滲透測試也是常用的安全測試方法。是使用自動化工具或者人工的方法模擬黑客的輸入,對應用系統(tǒng)進行攻擊性測試,從中找出運行時刻所存在的安全漏洞。這種測試的特點就是真實有效,一般找出來的問題都是正確的,也是較為嚴重的。但滲透測試一個致命的缺點是模擬的測試數(shù)據(jù)只能到達有限的測試點,覆蓋率很低。
③程序數(shù)據(jù)掃描。一個有高安全性需求的軟件,在運行過程中數(shù)據(jù)是不能遭到破壞的,否則就會導致緩沖區(qū)溢出類型的攻擊。數(shù)據(jù)掃描的手段通常是進行內存測試,內存測試可以發(fā)現(xiàn)許多諸如緩沖區(qū)溢出之類的漏洞,而這類漏洞使用除此之外的測試手段都難以發(fā)現(xiàn)。例如,對軟件運行時的內存信息進行掃描,看是否存在一些導致隱患的信息,當然