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