導致安全問題的軟件缺陷主要有兩種:部署中的漏洞和設計中的缺陷。現在軟件安全市場中的大部分重點都放在發現和修復漏洞上,這主要是因為自動代碼審查工具讓這個過程變得很簡單。但其實軟件設計和架構中的缺陷問題也占據很大比率,它占所有安全問題的50%。
在這篇文章中,我們將探討漏洞和缺陷之間的差異。更重要的是,我們將介紹架構風險分析(ARA)程序,經證明,該程序能夠很好地發現和修復漏洞。
那么,漏洞和缺陷的區別是什么?也許我們可以從一些例子中得出結論。
什么是漏洞
漏洞存在于軟件代碼(源代碼或二進制)中。一個最經典的漏洞是緩沖區溢出漏洞,這個漏洞根本上涉及濫用C中某些字符串處理函數功能。其中最臭名昭著的函數功能是gets,這是一個系統調用,它從用戶獲取輸入直到用戶決定點擊回復。我們把一個固定大小的緩沖區想象成一個空水杯,然后想像一下,你設置了方法來從杯中取水以避免滿杯(攻擊者則在不斷“倒水”)。如果倒太多水到杯子里,水溢出來,就回灑在臺面上。在C中的緩沖區溢出的情況下,太多輸入會覆蓋堆,或者甚至覆蓋堆棧,從而破壞程序的堆棧,造成程序崩潰或使程序轉而執行其它指令以進行攻擊。簡單的漏洞,可怕的后果。面對gets()的問題,我們特別容易在源代碼中找到漏洞。
C中有數以百計的系統調用,如果使用不當的話,它們可能會導致安全漏洞,包括從字符串處理功能到整數溢出和整數下溢等問題。當然,在Java和其他語言中也有一樣多的錯誤。另外,在Web應用程序(例如跨站腳本或者跨站請求偽造)中也有常見漏洞以及與數據庫相關的漏洞(例如SQL注入漏洞)。
面對這么多可能存在的漏洞,我們有必要部署和使用一些工具來查找它們。現在市面上有很多商業源代碼審查工具,比如惠普的Fortify、IBM的AppScan Source、Coverity公司的Quality Advisor,以及Klocwork的Clocwork Insight。目前源代碼審查的最新突破是直接整合漏洞查找到每個開發人員的集成開發環境(IDE)中,這樣我們就能盡可能在最開始發現漏洞。比如,Cigital的SecureAssist就是這種原理。
什么是缺陷
除了漏洞之外,我們還會看到缺陷問題。缺陷存在于軟件架構和設計中。這里有一個非常簡單的缺陷的例子:忘記驗證用戶。這種錯誤通常無法在代碼審查中被發現,但這是一個極其嚴重的問題。你的進程是以root身份運行嗎?最好確定誰在使用它!
其它關于缺陷的例子包括“中間攻擊人”問題,它使得攻擊者能在組件、網絡層、機器或者網絡之間進行篡改或者竊聽;另外,還有與糟糕協議有關的“重放攻擊”問題。
為了更好地說明缺陷,我們在這里列出了一些常見的與Java相關的缺陷問題:錯誤使用密碼系統、設計中的分區問題、特權塊保護故障(DoPrivilege())、災難性安全故障(脆弱性)、類別安全混淆錯誤、不安全的審計、損壞或不合邏輯的訪問控制(網絡層上的RBAC)、方法覆蓋問題(子類問題)、對不該信任的組件給予太多信任(客戶端)。
缺陷問題與漏洞一樣常見。事實上,大多數研究表明,漏洞和缺陷各占50%。當然,本文中我們討論的是這二者的統一體。還有一些棘手的情況可能被同時歸類為漏洞和缺陷,這就取決于你如何看待它。但是,在一般情況下,學習區分漏洞和缺陷對你很有意義。