來源:本站日期:2013-2-22
如今的Web應(yīng)用程序可能會包含危險的安全缺陷。這些應(yīng)用程序的全球化部署使其很容易遭受攻擊,這些攻擊會發(fā)現(xiàn)并惡意探測各種安全漏洞。Web環(huán)境中兩個主要的風(fēng)險在于:注入——也就是SQL注入,它會讓黑客更改發(fā)往數(shù)據(jù)庫的查詢
如今的Web應(yīng)用程序可能會包含危險的安全缺陷。這些應(yīng)用程序的全球化部署使其很容易遭受攻擊,這些攻擊會發(fā)現(xiàn)并惡意探測各種安全漏洞。
Web環(huán)境中兩個主要的風(fēng)險在于:注入——也就是SQL注入,它會讓黑客更改發(fā)往數(shù)據(jù)庫的查詢——以及跨站腳本攻擊(XSS),它們也是最危險的(Category:OWASP_Top_Ten_Project)。注入攻擊會利用有問題代碼的應(yīng)用程序來插入和執(zhí)行黑客指定的命令,從而能夠訪問關(guān)鍵的數(shù)據(jù)和資源。當(dāng)應(yīng)用程序?qū)⒂脩籼峁┑臄?shù)據(jù)不加檢驗或編碼就發(fā)送到瀏覽器上時,會產(chǎn)生XSS漏洞。
盡管2009年OWASP(Open Web Application Security Project)的一個報告表明安全方面的投資在增加(Category:OWASP_Security_Spending_Benchmarks),但是NTA Monitor的2010 Web應(yīng)用安全報名表明Web的安全性跟前一年相比實際在下降。實際上,Web應(yīng)用的漏洞給公司和組織帶來了很多的問題。按照WhiteHat Security最新的Web站點安全性數(shù)據(jù)報告所示,被評估網(wǎng)站的63%是有漏洞的,每個平均有六個未解決的缺陷。(WhiteHat Website Security Statistics Report)。這些漏洞創(chuàng)建并維持了一個基于攻擊竊取數(shù)據(jù)和資源的地下經(jīng)濟鏈。
Web應(yīng)用程序需要有深度防御的措施來避免和減少安全性漏洞。1這種方式假設(shè)所有的安全預(yù)防措施都可能失敗,所以安全性依賴于多層的機制從而能夠覆蓋其他層的失敗。為了減少成功攻擊的可能性,軟件工程師團隊必須做出必要的努力來引入適當(dāng)?shù)陌踩苑雷o措施。要達到這一點必須使用各種技術(shù)和工具來確保安全性涵蓋軟件產(chǎn)品開發(fā)生命周期的所有階段。
軟件開發(fā)生命周期中的安全性
盡管軟件開發(fā)的生命周期有多種不同的劃分方式,但正如圖1所示,它通常包含如下的階段:初始化、規(guī)范和設(shè)計、實現(xiàn)(編碼)、測試、部署以及停用,這些階段應(yīng)用開發(fā)人員可以不斷地重復(fù)迭代。2
盡管開發(fā)人員應(yīng)該在產(chǎn)品的整個生命周期中都關(guān)心代碼安全性,3但是他們應(yīng)該特別關(guān)注三個關(guān)鍵階段:1
實現(xiàn)。在編碼過程中,軟件開發(fā)人員必須使用特定應(yīng)用領(lǐng)域內(nèi)避免關(guān)鍵漏洞的最佳實踐。這種實踐的例子包括輸入和輸出校驗、識別惡意字符以及使用參數(shù)化的命令。4 盡管這些技術(shù)在避免大多數(shù)安全漏洞方面很有效,但因為缺乏安全相關(guān)的知識,開發(fā)人員通常并不使用它們或者使用得不正確。邊欄“為什么開發(fā)人員不使用安全編碼實踐?”更詳細地討論了這個問題。
測試。有很多技術(shù)可以在測試階段使用,包括滲透測試(目前最流行的技術(shù))、靜態(tài)分析、動態(tài)分析以及運行時的異常檢測。4 問題在于開發(fā)人員通常會關(guān)注需求功能的測試而忽略安全方面。另外,現(xiàn)有的自動化工具要么在漏洞探測覆蓋度方面比較差要么產(chǎn)生太多的誤報。
部署。在運行時環(huán)境中,會有不同的攻擊探測機制。這些機制可以按照不同的級別運行并使用不同的探測方式。它們的使用障礙在于性能開銷以及不準(zhǔn)確的結(jié)果會打亂系統(tǒng)的正常行為。
開發(fā)安全的代碼
為了編寫沒有漏洞的安全代碼,4 基于Web基礎(chǔ)設(shè)施的關(guān)鍵業(yè)務(wù)開發(fā)人員就要遵循編碼實踐,這個實踐包括了深度防御的措施,它假設(shè)所有的安全性預(yù)防措施都會失敗。在實現(xiàn)階段依賴多層的安全機制是特別重要的,使用一個預(yù)防或保護措施來避免安全漏洞是不夠的。
Web應(yīng)用程序的特征在于需要三層不同的安全防線:輸入校驗、熱點保護以及輸出校驗。
輸入校驗
大多數(shù)的安全漏洞是因為目標(biāo)應(yīng)用程序沒有正確地校驗輸入數(shù)據(jù)。1所以,應(yīng)用程序要考慮到所有惡意的輸入直到能證明其合法,這要涵蓋不可信環(huán)境中的所有數(shù)據(jù)。
輸入校驗是第一道防線,總體來講就是縮小應(yīng)用程序允許輸入的范圍,它會直接作用在用戶提供的數(shù)據(jù)上。這種類型的防御要依賴輸入?yún)?shù)在一個合法的范圍內(nèi),或者如果用戶提供了超出了范圍的值就會停止執(zhí)行。在Web應(yīng)用程序中,這首先要標(biāo)準(zhǔn)化輸入將其轉(zhuǎn)換到基線字符集和編碼。接下來,應(yīng)用程序必須對標(biāo)準(zhǔn)化的輸入使用過濾策略,拒絕那些值在合法范圍之外的輸入。這種方式能夠避免很多Web應(yīng)用程序中的問題,在執(zhí)行輸入校驗時會使用正向模式匹配或正向校驗。在這種情況下,開發(fā)人員建立規(guī)則來識別那些可接受的輸入而不是識別有什么輸入是不可接受的。盡管開發(fā)人員不能預(yù)測所有類型的攻擊,但他們應(yīng)該能夠說明所有類型的合法輸入。
關(guān)鍵問題在于,輸入校驗通常使用地并不充分,這是因為輸入?yún)?shù)的數(shù)據(jù)域允許存在惡意數(shù)據(jù),這是與校驗執(zhí)行相獨立的。例如,在SQL注入漏洞中,大多數(shù)的SQL語句使用引號作為字符串分隔符,這就意味著黑客可以使用它來執(zhí)行SQL注入攻擊。4但是,在有些情況下,字符串輸入域必須允許存在引號值,所以應(yīng)用程序不能排除所有包含引號的值。
熱點防護
為了應(yīng)對輸入校驗的局限性,有必要采用第二道防線
任何類型的攻擊都是以熱點為目標(biāo)的,熱點指的就是應(yīng)用程序中可能會有某種類型漏洞的代碼。通用的輸入校驗會在應(yīng)用程序中進行或者在整個Web應(yīng)用程序上下文中修改輸入,與之相比,第二道防線關(guān)注于保護重要的熱點,例如保護那些真正使用輸入域值的代碼行。
一個具體的例子就是SQL注入攻擊,它們大多數(shù)會使用單引號或雙引號。有些編程語言提供了對這些字符的轉(zhuǎn)碼機制,這樣它們就能用在SQL語句中了,但是只能用來在語句中分隔值。4但是這些技術(shù)有兩個問題。第一,更高級的注入技術(shù),例如聯(lián)合使用引號和轉(zhuǎn)義字符,可以繞過這些機制。第二,引入轉(zhuǎn)義字符會增加字符串的長度,如果結(jié)果字符串的長度超過數(shù)據(jù)庫限制的話,可能會導(dǎo)致數(shù)據(jù)截斷。
正確使用參數(shù)化命令是預(yù)防注入攻擊最有效的方式。1在這種情況下,開發(fā)人員定義命令的結(jié)構(gòu),并使用占位符來代表命令的變量值。稍后,當(dāng)應(yīng)用程序?qū)?yīng)的值關(guān)聯(lián)到命令上時,命令解釋器會正確地使用它們而不會涉及到命令的結(jié)構(gòu)。
這種技術(shù)最著名的用法是數(shù)據(jù)庫的預(yù)處理語句,也被稱為參數(shù)化查詢。4 當(dāng)應(yīng)用程序創(chuàng)建預(yù)處理語句時,語句發(fā)送到了數(shù)據(jù)庫端。應(yīng)用程序使用占位符來表示查詢的可變部分,占位符通常會是問號或標(biāo)簽。隨后,每次查詢執(zhí)行時,應(yīng)用程序都要往對應(yīng)的可變部分綁定值。不管數(shù)據(jù)的內(nèi)容是什么,應(yīng)用程序會一直使用這個表達式作為一個值而并沒有SQL代碼。因此,不可能修改查詢的結(jié)構(gòu)。
為了確保正確使用數(shù)據(jù),很多語言允許類型綁定。但是預(yù)處理語句本身并不能修復(fù)不安全的語句——開發(fā)人員必須正確地使用它們。例如,像傳統(tǒng)語句一樣使用預(yù)處理語句——也就是使用字符串拼接來綁定SQL查詢——而不是對查詢的可變部分使用占位符會導(dǎo)致類似的漏洞。
輸出校驗
在將一個進程的輸出發(fā)送之前進行校驗?zāi)軌虮苊庥脩羰盏剿麄儾粦?yīng)該看到的信息,例如應(yīng)用程序內(nèi)部的異常細節(jié),這些信息有助于發(fā)起其他的攻擊。在輸出校驗的另一個例子當(dāng)中,保護系統(tǒng)會搜索應(yīng)用程序輸出的關(guān)鍵信息,如信用卡號,并在發(fā)送給前端之前用星號代替。將信息編碼是能夠避免XSS漏洞的一種輸出校驗方式。4如果發(fā)送給瀏覽器的數(shù)據(jù)要顯示在Web頁面上,它應(yīng)該進行HTML編碼或百分號編碼,這取決于它在頁面的位置。通過這種方式,XSS所用的惡意字符不再具有破壞性,而且編碼會保留數(shù)據(jù)的原來意義。
探測漏洞
識別安全的問題要求不僅測試應(yīng)用程序的功能還要尋找代碼中可能被黑客利用的隱藏的危險缺陷。5探測漏洞的兩個主要方式是白盒分析和黑盒測試。
白盒分析
白盒分析需要在不執(zhí)行的情況下檢查代碼。開發(fā)人員可以按照以下兩種方式中的某一種來進行:在代碼的審查或評審時以手動方式進行或者借助自動分析工具自動化進行。
代碼審查(Code inspection)指的是程序員的同伴系統(tǒng)檢查交付的代碼,查找編碼錯誤。6安全審查是減少應(yīng)用程序中漏洞最有效的方式;當(dāng)為關(guān)鍵的系統(tǒng)開發(fā)軟件時,這是重要的過程。但是,這種審查方式通常是很費時間的、代價昂貴并需要深入了解Web的安全知識。
代碼檢查(Code review)是代價稍為低廉的替代方案,6它是一種簡化版本的代碼審查適用于分析不像前面那么重要的代碼。檢查也是手動進行的,但是它不需要正式的審查會議。幾個專家分別進行檢查,然后由主持人過濾和合并結(jié)果。盡管這是一個有效的方式,但代碼檢查的成本依舊是很高的。
為了減少白盒法分析的成本,開發(fā)人員有時依賴自動化工具,如靜態(tài)代碼分析器。靜態(tài)代碼分析工具會檢查軟件代碼,要么是源碼格式要么是二進制格式,并試圖識別出常見的編碼級別缺陷。4 使用現(xiàn)有工具所執(zhí)行的分析會因為它們的復(fù)雜性而有所不同,這種差異體現(xiàn)在考慮單條語句和命令或考慮代碼行之間的依賴。除了模型檢查和數(shù)據(jù)流分析等功能之外,這些工具還會自動關(guān)注可能的編碼錯誤。它的主要問題在于細致的分析是很困難并且因為源碼的復(fù)雜性和缺乏動態(tài)(運行時)的視角有很多安全缺陷很難被發(fā)現(xiàn)。
盡管使用靜態(tài)代碼分析工具很重要,但是它有時會降低開發(fā)人員的生產(chǎn)效率,這主要是因為誤報,這會導(dǎo)致沒有用處的額外工作。7為了避免這種情況,除了要有足夠的時間學(xué)習(xí)怎樣使用這些工具以外,開發(fā)人員需要一些策略來保證正確使用這些工具。例如,有必要指定規(guī)則來分類和選擇開發(fā)人員應(yīng)該處理的警告信息。同時,開發(fā)人員還要配置分析工具只報告那些與當(dāng)前開發(fā)上下文相關(guān)的警告。沒有接受怎樣使用靜態(tài)分析訓(xùn)練的開發(fā)人員最終會低估它的真正效益并且通常不能發(fā)揮它的所有功能。
黑盒測試
黑盒測試指的是從外部的視角分析程序的執(zhí)行。簡而言之,它會比較軟件執(zhí)行的輸出與期望的結(jié)果。5 對于軟件的檢驗和確認(rèn)來說,測試可能是最常用的技術(shù)了。
對于黑盒測試來講,有多種級別,從單元測試到集成測試再到系統(tǒng)測試。測試方式可以是正式的(基于模型和定義良好的測試規(guī)范)也可以不那么正式(被稱為“冒煙測試”,一種粗糙的測試目的是快速暴露簡單的缺陷)。
健壯性是黑盒測試一種特殊形式,它的目標(biāo)是查看系統(tǒng)在錯誤輸入條件下的行為。滲透測試是特殊類型的健壯性測試,它會分析在遇到惡意輸入時的代碼執(zhí)行并查找潛在的漏洞。在這種方式中,測試人員使用模糊技術(shù),這包含通過HTTP請求,提交意料之外的或非法的數(shù)據(jù)項到Web應(yīng)用程序上并檢查它的響應(yīng)。4測試人員不需要了解實現(xiàn)細節(jié)——他們在用戶的角度來測試應(yīng)用程序的輸入。對于每種漏洞類型,可能會有上百次甚至上千次的測試。
滲透測試工具會自動搜索漏洞,這避免了手工為每種類型的漏洞構(gòu)建上百個甚至上千個測試所帶來的重復(fù)和乏味的工作。Web應(yīng)用的常見自動化安全測試工具一般會稱為Web應(yīng)用或Web安全掃描器。這些掃描器可以很容易地測試應(yīng)用程序以發(fā)現(xiàn)漏洞。對于目標(biāo)應(yīng)用,它們會有一些預(yù)定義的測試用例,所以用戶只需要配置一下掃描器并讓它測試應(yīng)用即可。一旦掃描器完成測試,它會報告所探測到的漏洞。大多數(shù)的掃描器都是商業(yè)產(chǎn)品,盡管也有免費的應(yīng)用程序掃描器,但是與商用版本相比,它們?nèi)鄙俅蠖鄶?shù)的功能所以用的很有限。