隨著數(shù)據(jù)泄露事件的頻繁發(fā)生,創(chuàng)建和維護安全的軟件產(chǎn)品對于每一個組織來說,都變得越來越重要了。盡管并非所有的攻擊都可以被預(yù)期或防范,但是我們至少可以通過消減軟件的漏洞,來避免攻擊的暴露面。
在本文中,您將了解一些最為常見的軟件漏洞,以及如何避免它們的方法。此外,您還會學(xué)習(xí)到如何采用一些通用的優(yōu)秀實踐,來確保軟件和數(shù)據(jù)的安全。
常見的軟件漏洞
2019年,MITRE.org的CWE(Common Weakness Enumeration,通用缺陷列表)推出了25項最危險的軟件錯誤列表。盡管攻擊者的手法五花八門,但實際上卻是萬變不離其宗地組合了各種常見的攻擊方式。在此我們將重點討論其中的幾個常見軟件漏洞。
緩沖區(qū)溢出(Buffer Overflow)
當(dāng)您的程序試圖讀取或?qū)懭氤龇秶木彌_區(qū)時,就會發(fā)生緩沖區(qū)溢出的錯誤。其直接的危害是:可能導(dǎo)致數(shù)據(jù)覆蓋,或是在現(xiàn)有的代碼中附加不該出現(xiàn)的數(shù)據(jù)。因此,緩沖區(qū)溢出可以使得攻擊者通過執(zhí)行代碼,來更改程序流,進而讀取某種敏感數(shù)據(jù),或造成系統(tǒng)的崩潰。
緩沖區(qū)溢出漏洞的典型示例包括:
接受各種長度不受限制的輸入允許從無效的索引處對數(shù)組進行讀取操作緩沖區(qū)溢出漏洞通常潛藏在軟、硬件體系架構(gòu)的設(shè)計、實施、以及操作階段。這些漏洞最常見于C、C ++和Assembly程序中。當(dāng)然,它也可能出現(xiàn)在缺乏對內(nèi)存管理提供支持的任何一種編程語言里。
針對緩沖區(qū)溢出漏洞的預(yù)防措施
如上文所述,我們應(yīng)當(dāng)盡量選擇諸如:Java或Perl等具有防范,或降低此類漏洞風(fēng)險機制的語言。而在C#之類的編程語言中,我們千萬不要禁用溢出保護的選項。即便如此,那些具有“免疫”功能的編程語言,也可能會在運行環(huán)境中的易受攻擊的、原生代碼交互時,產(chǎn)生不可預(yù)期的錯誤。
為了防止緩沖區(qū)溢出漏洞被利用,您可以使用諸如Visual Studio或StackGuard之類的編譯器,來針對函數(shù)或擴展名進行輸入的限制。同時,您還可以使用各種工具,在內(nèi)存中隨機地排列程序的不同組件,以使得地址更難以被識別與預(yù)測,進而使攻擊者難以利用到這些特定的組件。
另外,請創(chuàng)建代碼時確保正確地分配緩沖區(qū)空間,并使用各種方法和功能來限制輸入的大小。
不當(dāng)?shù)妮斎腧炞C(Improper Input Validation)
如果我們不能夠在接收端對用戶的輸入采取驗證,或驗證不足,那么就會產(chǎn)生所謂的“輸入驗證不當(dāng)”。而不當(dāng)?shù)尿炞C則會使得攻擊者通過執(zhí)行惡意代碼,來更改程序流,訪問敏感數(shù)據(jù),以及濫用現(xiàn)有的資源分配。
不當(dāng)驗證的典型示例包括:
自認為攻擊者無法訪問到隱藏的表單字段僅驗證輸入的字段的長度,而不是具體內(nèi)容不當(dāng)?shù)尿炞C同樣會潛藏在軟、硬件體系架構(gòu)的設(shè)計和實施階段。它可以發(fā)生在任何接受外部數(shù)據(jù)的編程語言或系統(tǒng)中。
不當(dāng)驗證漏洞的預(yù)防措施
我們應(yīng)該對任何用戶采取“零信任(zero trust)”的原則,并假設(shè)所有的輸入都是可疑的,直到它們被證明是安全的為止。同時,我們可以使用白名單機制,來確保輸入的內(nèi)容僅包含了可接受的格式與信息。
因此,在驗證輸入時,請評估其長度、類型、語法、以及邏輯上的符合性(即:輸入是否具有語義)。您可以使用多種工具來確保完成了充分的驗證,例如:OWASP ESAPI Validation API和RegEx(RegularExpression,正則表達式)。這些工具可以幫助我們驗證所有的輸入源,包括:環(huán)境變量、查詢、文件、數(shù)據(jù)庫、以及API調(diào)用。
此外,我們應(yīng)當(dāng)確保在客戶端和服務(wù)器端都執(zhí)行相應(yīng)的檢查。為了避免出現(xiàn)客戶端驗證被繞過的情況,我們需要重點在服務(wù)器端捕獲各項輸入,以識別攻擊者的潛在操縱。同時,在程序代碼進行任何必要的組合或轉(zhuǎn)換后,也請您再次驗證其輸入。
信息泄露(Information Exposure)
數(shù)據(jù)被有意或無意地提供給潛在攻擊者,被稱為信息泄露。除了泄露敏感的數(shù)據(jù)信息,向攻擊者提供可能被利用的軟、硬件環(huán)境信息也是一種泄露。
信息泄露的典型示例包括:
錯誤地暴露文件或程序的完整路徑程序的錯誤、異常消息中暴露了數(shù)據(jù)庫中用戶的相關(guān)信息信息泄露漏洞依然會潛藏在軟、硬件體系架構(gòu)的設(shè)計和實施階段。它跟編程語言無關(guān),更大程度上取決于編程的習(xí)慣。
信息泄露漏洞的預(yù)防措施
為防止信息的泄露,您應(yīng)當(dāng)在設(shè)計程序架構(gòu)時,針對明確的信任邊界區(qū)域(,來保護敏感的信息;通過使用訪問控制,來保護和限制“安全”區(qū)域與各個端點之間的連接。
為了最大程度地避免該漏洞,請在程序中驗證各類錯誤的提示消息,以及用戶警告信息中是否包含有不必要暴露的內(nèi)容。同時,您還應(yīng)該限制在URL和通信包的頭部(header)出現(xiàn)的敏感信息。例如:您可以隱藏完整的路徑名稱,以及API密鑰。
特權(quán)或認證不當(dāng)(Improper Privileges or Authentication)
如果未能正確地分配,跟蹤,修改或驗證用戶的相關(guān)權(quán)限和憑據(jù),那么就可能發(fā)生特權(quán)或身份驗證不當(dāng)?shù)那闆r。此類漏洞可以讓攻擊者濫用特權(quán),執(zhí)行受限的任務(wù),以及訪問受限的數(shù)據(jù)。
特權(quán)或身份驗證不當(dāng)?shù)牡湫褪纠ǎ?/SPAN>
未及時回收臨時的提權(quán)僅通過黑名單、而不是白名單來限制特權(quán)允許較低的特權(quán)級別去影響較高的特權(quán)帳戶,例如:重置管理員的密碼限制登錄嘗試的次數(shù)或會話空閑時間特權(quán)或身份驗證漏洞仍然可能發(fā)生在軟、硬件體系架構(gòu)的設(shè)計、實施、以及操作階段。它同樣不限于某一種編程語言。
特權(quán)或身份驗證漏洞的預(yù)防措施
您應(yīng)當(dāng)將“最小特權(quán)原則”,應(yīng)用于與目標(biāo)軟件和系統(tǒng)交互的所有用戶和服務(wù)之中。只給真正需要某些資源和操作的用戶或服務(wù),完成所需任務(wù)的最少權(quán)限。我們需要通過在整個程序和環(huán)境中使用訪問控制,來限制用戶和實體的權(quán)限。
如有可能,我們也可以將高級特權(quán)分給多個角色。通過分離,我們可以有效地削弱“高級用戶”,并降低攻擊者濫用其訪問權(quán)限的能力。此外,您還可以運用多因素身份驗證的方法,來防止攻擊者繞過系統(tǒng)的檢查機制,輕松地獲得訪問權(quán)限。
減少一般性漏洞的優(yōu)秀實踐
除了采取針對特定漏洞的措施之外,我們還應(yīng)該利用一些通用的措施,在總體上減少漏洞的暴露面。您可以從如下方面入手:
從威脅情報中學(xué)習(xí)
持續(xù)監(jiān)控和使用來自漏洞數(shù)據(jù)庫(vulnerability databases)和獨立監(jiān)督組(如:OWASP或NIST)的消息。這些資源可以在出現(xiàn)漏洞后,及時地為您提供該漏洞的相關(guān)信息,并能夠指導(dǎo)您如何解決或緩解當(dāng)前存在的問題。據(jù)此,您可以根據(jù)實際情況,準(zhǔn)確地修補目標(biāo)系統(tǒng)及其組件。
謹慎地包含依賴性
請確保僅在需要時才去使用那些已經(jīng)過審核、且值得信任的庫和框架。某些不知名的工具會將其自身的漏洞傳遞到您的軟件中,并且會給攻擊者提供潛在的訪問后門。而且,在使用選定的庫和框架時,請確保您已經(jīng)充分了解了可用的功能,以及那些已知的漏洞與缺陷。
執(zhí)行漏洞評估
永遠不要盲目地認為自己的程序已經(jīng)“固若金湯”,請不斷通過靜態(tài)代碼和動態(tài)運行時(runtime)的測試,以確保各種遺留的漏洞能夠得到及時的評估。只有將自動測試工具集成到現(xiàn)有開發(fā)環(huán)境中,您才能盡早地發(fā)現(xiàn)漏洞。據(jù)此,您可以確保自己不會因為時間的限制而跳過某些重要的測試,也不會因為人為的錯誤而忽略掉應(yīng)有的測試。
總結(jié)
綜上所述,軟件漏洞可謂層出不窮,顯然無法趕盡殺絕。我們能做的只有通過了解漏洞的原理和防范的措施,來及時地調(diào)整自己的實現(xiàn)方式,并開展全面的測試,盡量在產(chǎn)品發(fā)布之前,盡可能多地發(fā)現(xiàn)并解決潛在的漏洞與問題。希望本文在上面所介紹到的各種最常見漏洞,以及在軟件開發(fā)中推薦采用的實踐和方法,能夠幫助您減少攻擊者乘虛而入的機會。