近來,在我負責的公司某軟件產品的最後測試工做,經常被問到這樣一個問題:在作測試過程當中,咱們的軟件產品在安全性方面考慮了多少?應該如何測評一個軟件到底有多安全?算法
這個軟件由於涉及客戶商業上重要的信息資料,所以用戶關心的核心問題始終圍繞「這個軟件安全嗎」。一個因爲設計致使的安全漏洞和一個因爲實現致使的安全漏洞,對用戶的最終影響都是巨大的。個人任務就是確保這個軟件在安全性方面能知足客戶指望。數據庫
什麼是軟件安全性測試編程
(1)什麼是軟件安全安全
軟件安全屬於軟件領域裏一個重要的子領域。在之前的單機時代,安全問題主要是操做系統容易感染病毒,單機應用程序軟件安全問題並不突出。可是自從互聯網普及後,軟件安全問題越發顯加突顯,使得軟件安全性測試的重要性上升到一個史無前例的高度。服務器
軟件安全通常分爲兩個層次,即應用程序級別的安全性和操做系統級別的安全性。應用程序級別的安全性,包括對數據或業務功能的訪問,在預期的安全性狀況下, 操做者只能訪問應用程序的特定功能、有限的數據等。操做系統級別的安全性是確保只有具有系統平臺訪問權限的用戶才能訪問,包括對系統的登陸或遠程訪問。工具
本文所講的軟件安全主要是應用程序層的安全,包括兩個層面:①是應用程序自己的安全性。通常來講,應用程序的安全問題主要是由軟件漏洞致使的,這些漏洞可 以是設計上的缺陷或是編程上的問題,甚至是開發人員預留的後門。②是應用程序的數據安全,包括數據存儲安全和數據傳輸安全兩個方面。單元測試
(2)軟件安全性測試測試
通常來講,對安全性要求不高的軟件,其安全性測試能夠混在單元測試、集成測試、系統測試裏一塊兒作。但對安全性有較高需求的軟件,則必須作專門的安全性測試,以便在破壞以前預防並識別軟件的安全問題。編碼
安全性測試(Security Testing)是指有關驗證應用程序的安全等級和識別潛在安全性缺陷的過程。應用程序級安全測試的主要目的是查找軟件自身程序設計中存在的安全隱患,並 檢查應用程序對非法侵入的防範能力, 根據安全指標不一樣測試策略也不一樣。注意:安全性測試並不最終證實應用程序是安全的,而是用於驗證所設立策略的有效性,這些對策是基於威脅分析階段所作的假 設而選擇的。例如,測試應用軟件在防止非受權的內部或外部用戶的訪問或故意破壞等狀況時的運做。加密
軟件安全性測試過程
(1)安全性測試方法
有許多的測試手段能夠進行安全性測試,目前主要安全測試方法有:
①靜態的代碼安全測試:主要經過對源代碼進行安全掃描,根據程序中數據流、控制流、語義等信息與其特有軟件安全規則庫進行匹對,從中找出代碼中潛在的安全 漏洞。靜態的源代碼安全測試是很是有用的方法,它能夠在編碼階段找出全部可能存在安全風險的代碼,這樣開發人員能夠在早期解決潛在的安全問題。而正由於如 此,靜態代碼測試比較適用於早期的代碼開發階段,而不是測試階段。
②動態的滲透測試:滲透測試也是經常使用的安全測試方法。是使用自動化工具或者人工的方法模擬黑客的輸入,對應用系統進行攻擊性測試,從中找出運行時刻所存在 的安全漏洞。這種測試的特色就是真實有效,通常找出來的問題都是正確的,也是較爲嚴重的。但滲透測試一個致命的缺點是模擬的測試數據只能到達有限的測試 點,覆蓋率很低。
③程序數據掃描。一個有高安全性需求的軟件,在運行過程當中數據是不能遭到破壞的,不然就會致使緩衝區溢出類型的攻擊。數據掃描的手段一般是進行內存測試, 內存測試能夠發現許多諸如緩衝區溢出之類的漏洞,而這類漏洞使用除此以外的測試手段都難以發現。例如,對軟件運行時的內存信息進行掃描,看是否存在一些導 致隱患的信息,固然這須要專門的工具來進行驗證,手工作是比較困難的。
(2)反向安全性測試過程
大部分軟件的安全測試都是依據缺陷空間反向設計原則來進行的,即事先檢查哪些地方可能存在安全隱患,而後針對這些可能的隱患進行測試。所以,反向測試過程 是從缺陷空間出發,創建缺陷威脅模型,經過威脅模型來尋找入侵點,對入侵點進行已知漏洞的掃描測試。好處是能夠對已知的缺陷進行分析,避免軟件裏存在已知 類型的缺陷,可是對未知的攻擊手段和方法一般會無能爲力。
①創建缺陷威脅模型。創建缺陷威脅模型主要是從已知的安全漏洞入手,檢查軟件中是否存在已知的漏洞。創建威脅模型時,須要先肯定軟件牽涉到哪些專業領域,再根據各個專業領域所遇到的攻擊手段來進行建模。
②尋找和掃描入侵點。檢查威脅模型裏的哪些缺陷可能在本軟件中發生,再將可能發生的威脅歸入入侵點矩陣進行管理。若是有成熟的漏洞掃描工具,那麼直接使用漏洞掃描工具進行掃描,而後將發現的可疑問題歸入入侵點矩陣進行管理。
③入侵矩陣的驗證測試。建立好入侵矩陣後,就能夠針對入侵矩陣的具體條目設計對應的測試用例,而後進行測試驗證。
(3)正向安全性測試過程
爲了規避反向設計原則所帶來的測試不完備性,須要一種正向的測試方法來對軟件進行比較完備的測試,使測試過的軟件可以預防未知的攻擊手段和方法。
①先標識測試空間。對測試空間的全部的可變數據進行標識,因爲進行安全性測試的代價高昂,其中要重點對外部輸入層進行標識。例如,需求分析、概要設計、詳細設計、編碼這幾個階段都要對測試空間進行標識,並創建測試空間跟蹤矩陣。
②精肯定義設計空間。重點審查需求中對設計空間是否有明肯定義,和需求牽涉到的數據是否都標識出了它的合法取值範圍。在這個步驟中,最須要注意的是精確二字,要嚴格按照安全性原則來對設計空間作精確的定義。
③標識安全隱患。根據找出的測試空間和設計空間以及它們之間的轉換規則,標識出哪些測試空間和哪些轉換規則可能存在安全隱患。例如,測試空間愈複雜,即測 試空間劃分越複雜或可變數據組合關係越多也越不安全。還有轉換規則愈複雜,則出問題的可能性也愈大,這些都屬於安全隱患。
④創建和驗證入侵矩陣。安全隱患標識完成後,就能夠根據標識出來的安全隱患創建入侵矩陣。列出潛在安全隱患,標識出存在潛在安全隱患的可變數據,和標識出安全隱患的等級。其中對於那些安全隱患等級高的可變數據,必須進行詳盡的測試用例設計。
(4)正向和反向測試的區別
正向測試過程是以測試空間爲依據尋找缺陷和漏洞,反向測試過程則是以已知的缺陷空間爲依據去尋找軟件中是否會發生一樣的缺陷和漏洞,二者各有其優缺點。反 向測試過程主要的一個優勢是成本較低,只要驗證已知的可能發生的缺陷便可,但缺點是測試不完善,沒法將測試空間覆蓋完整,沒法發現未知的攻擊手段。正向測 試過程的優勢是測試比較充分,但工做量相對來講較大。所以,對安全性要求較低的軟件,通常按反向測試過程來測試便可,對於安全性要求較高的軟件,應以正向 測試過程爲主,反向測試過程爲輔。
常見的軟件安全性缺陷和漏洞
軟件的安全有不少方面的內容,主要的安全問題是由軟件自己的漏洞形成的,下面介紹常見的軟件安全性缺陷和漏洞。
(1)緩衝區溢出
緩衝區溢出已成爲軟件安全的頭號公敵,許多實際中的安全問題都與它有關。形成緩衝區溢出問題一般有如下兩種緣由。①設計空間的轉換規則的校驗問題。即缺少 對可測數據的校驗,致使非法數據沒有在外部輸入層被檢查出來並丟棄。非法數據進入接口層和實現層後,因爲它超出了接口層和實現層的對應測試空間或設計空間 的範圍,從而引發溢出。②局部測試空間和設計空間不足。當合法數據進入後,因爲程序實現層內對應的測試空間或設計空間不足,致使程序處理時出現溢出。
(2)加密弱點
這幾種加密弱點是不安全的:①使用不安全的加密算法。加密算法強度不夠,一些加密算法甚至能夠用窮舉法破解。②加密數據時密碼是由僞隨機算法產生的,而產 生僞隨機數的方法存在缺陷,使密碼很容易被破解。③身份驗證算法存在缺陷。④客戶機和服務器時鐘未同步,給攻擊者足夠的時間來破解密碼或修改數據。⑤未對 加密數據進行簽名,致使攻擊者能夠篡改數據。因此,對於加密進行測試時,必須針對這些可能存在的加密弱點進行測試。
(3)錯誤處理
通常狀況下,錯誤處理都會返回一些信息給用戶,返回的出錯信息可能會被惡意用戶利用來進行攻擊,惡意用戶可以經過分析返回的錯誤信息知道下一步要如何作才 能使攻擊成功。若是錯誤處理時調用了一些不應有的功能,那麼錯誤處理的過程將被利用。錯誤處理屬於異常空間內的處理問題,異常空間內的處理要儘可能簡單,使 用這條原則來設計能夠避免這個問題。但錯誤處理每每牽涉到易用性方面的問題,若是錯誤處理的提示信息過於簡單,用戶可能會一頭霧水,不知道下一步該怎麼操 做。因此,在考慮錯誤處理的安全性的同時,須要和易用性一塊兒進行權衡。
(4)權限過大
若是賦予過大的權限,就可能致使只有普通用戶權限的惡意用戶利用過大的權限作出危害安全的操做。例如沒有對能操做的內容作出限制,就可能致使用戶能夠訪問 超出規定範圍的其餘資源。進行安全性測試時必須測試應用程序是否使用了過大的權限,重點要分析在各類狀況下應該有的權限,而後檢查實際中是否超出了給定的 權限。權限過大問題本質上屬於設計空間過大問題,因此在設計時要控制好設計空間,避免設計空間過大形成權限過大的問題。
作好安全性測試的建議
許多軟件安全測試經驗告訴咱們,作好軟件安全性測試的必要條件是:一是充分了解軟件安全漏洞,二是評估安全風險,三是擁有高效的軟件安全測試技術和工具。
(1)充分了解軟件安全漏洞
評估一個軟件系統的安全程度,須要從設計、實現和部署三個環節同時着手。咱們先看一下Common Criteria是如何評估軟件系統安全的。首先要肯定軟件產品對應的Protection Profile(PP)。一個PP定義了一類軟件產品的安全特性模板。例如數據庫的PP、防火牆的PP等。而後,根據PP再提出具體的安全功能需求,如用 戶的身份認證明現。最後,肯定安全對象以及是如何知足對應的安全功能需求的。所以,一個安全軟件的三個環節,哪一個出問題都不行。
(2)安全性測試的評估
當作完安全性測試後,軟件是否可以達到預期的安全程度呢?這是安全性測試人員最關心的問題,所以須要創建對測試後的安全性評估機制。通常從如下兩個方面進 行評估。①安全性缺陷數據評估。若是發現軟件的安全性缺陷和漏洞越多,可能遺留的缺陷也越多。進行這類評估時,必須創建基線數據做爲參照,不然評估起來沒 有依據就沒法獲得正確的結論。②採用漏洞植入法來進行評估。漏洞植入法和可靠性測試裏的故障插入測試是同一道理,只不過這裏是在軟件裏插入一些有安全隱患 的問題。採用漏洞植入法時,先讓不參加安全測試的特定人員在軟件中預先植入必定數量的漏洞,最後測試完後看有多少植入的漏洞被發現,以此來評估軟件的安全 性測試作得是否充分。
(3)採用安全測試技術和工具
可以使用專業的具備特定功能的安全掃描軟件來尋找潛在的漏洞,將已經發生的缺陷歸入缺陷庫,而後經過自動化測試方法來使用自動化缺陷庫進行轟炸測試。例如,使用一些可以模擬各類攻擊的軟件來進行測試。
安全測試是用來驗證集成在軟件內的保護機制是否可以在實際中保護系統免受非法的侵入。一句通俗的話說:軟件系統的安全固然必須可以經受住正面的攻擊——可是它也必須可以經受住側面的和背後的攻擊。
轉載:http://www.uml.org.cn/Test/200906258.asp