軟件安全評估之軟件漏洞基礎(chǔ)
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
零 基礎(chǔ)概念 在軟件安全的語境中,漏洞是指軟件中的具體缺陷或疏忽,能夠被攻擊者利用并執(zhí)行一些惡意行為,例如泄露或修改敏感信息、干擾或銷毀系統(tǒng)、接管計算機系統(tǒng)或程序權(quán)限等等。 安全漏洞(Vulnerability)與大眾熟悉的軟件缺陷(Bug)有所不同。軟件缺陷是程序中的錯誤、失誤或疏忽,導(dǎo)致意外或者不希望發(fā)生的情況(即應(yīng)當(dāng)發(fā)生卻沒發(fā)生,結(jié)婚十年一直沒懷上)。籠統(tǒng)的說,安全漏洞可以看作是軟件缺陷的一個子集,是一種特殊的軟件缺陷:惡意用戶可以利用它發(fā)動攻擊,影響軟件及其支持系統(tǒng)。幾乎所有的安全漏洞都可以被看作軟件缺陷,但只有一些軟件缺陷最終成為嚴(yán)格意義上的安全漏洞,意味著這類缺陷必須具有安全屬性相關(guān)的影響,允許攻擊者執(zhí)行通常無法進(jìn)行的操作(即不應(yīng)當(dāng)發(fā)生卻發(fā)生了,外出三年老婆懷上了)。 在談?wù)摪踩耘c可靠性時,有的人會說安全性是可靠性的一個重要組成部分。雖然這種說法不太普遍,但一個可靠性高的軟件基本上是缺陷較少的軟件: 它在用戶使用過程中很少出現(xiàn)故障,能夠妥善處理各種異常情況,并且采用“防御性編程(Defensive Programming)”策略(如減少缺陷、增加代碼可讀性、設(shè)置異常處理)來應(yīng)對不穩(wěn)定的執(zhí)行環(huán)境和錯誤的輸入數(shù)據(jù)。 而一個安全性高的軟件則更像是一個健壯的軟件: 它能夠抵御那些企圖通過篡改環(huán)境和輸入數(shù)據(jù)來利用軟件漏洞以達(dá)到惡意目的的攻擊。 因此,軟件的安全性和可靠性追求的是共同的目標(biāo),這個目標(biāo)需要通過采用專注于消除各種軟件缺陷的開發(fā)策略來達(dá)成。但安全漏洞與軟件缺陷并非總是可以清晰界定。比如:一個允許用戶編輯其不應(yīng)有權(quán)訪問的關(guān)鍵系統(tǒng)文件的程序,可能在規(guī)范和設(shè)計層面上沒有問題,但這無疑是一個嚴(yán)重的安全漏洞。 壹 安全策略 系統(tǒng)的安全性本質(zhì)上是由安全策略(policy)、安全模型(model)、安全控制(control)構(gòu)成,其中最重要的是安全策略,策略定義了系統(tǒng)應(yīng)當(dāng)具備的安全標(biāo)準(zhǔn)以及允許接受的安全損害。因此,任何對軟件系統(tǒng)安全性的侵害都可以被視為是對其安全策略的破壞。 對于一個由軟件、用戶和資源構(gòu)成的系統(tǒng),安全策略本質(zhì)上是一系列關(guān)于允許和禁止行為的規(guī)則。例如,“未經(jīng)驗證的用戶不得訪問系統(tǒng)的A服務(wù)。”如果未經(jīng)驗證的用戶能夠訪問該服務(wù),則違反了既定的安全策略。 每個軟件系統(tǒng)都應(yīng)該具備一定的安全策略。這些策略可能是正式的文件集合,也可能是用戶對系統(tǒng)合理行為非正式的期望。對于許多軟件系統(tǒng),即便沒有明確的書面規(guī)定或描述,人們通常也能認(rèn)識到哪些行為可能構(gòu)成安全風(fēng)險(比如用戶可以看到其他用戶的購物記錄)。因此,“安全策略”通常指的是用戶對于軟件系統(tǒng)行為的允許和禁止方面的共識。 貳 安全期望 為了深入理解軟件安全,我們需要考慮用戶對軟件安全可能抱有的期望。這有助于我們識別哪些行為可能被視為安全違規(guī),或破壞了安全屬性。安全屬性至少涵蓋三個基礎(chǔ)部分:機密性、完整性和可用性。 機密性:機密性關(guān)注的是信息的保護(hù),確保信息能夠持續(xù)保持私密狀態(tài),包括從國家級別的情報秘密、企業(yè)商業(yè)機密到個人敏感信息等各種敏感數(shù)據(jù)。 完整性:完整性關(guān)乎數(shù)據(jù)的可信度和準(zhǔn)確性。人們期望軟件能夠防止數(shù)據(jù)被不當(dāng)篡改,確保數(shù)據(jù)的來源和內(nèi)容都是可信的。 可用性:可用性涉及訪問和使用信息和資源的能力,通常指的是用戶對系統(tǒng)能夠持續(xù)的、正常的訪問的期望。導(dǎo)致軟件崩潰或其他造成用戶不可訪問的問題,包括利用特定輸入或環(huán)境導(dǎo)致的程序中斷,以及耗盡軟件系統(tǒng)資源(如CPU、磁盤空間或網(wǎng)絡(luò)帶寬)的攻擊都屬于破壞可用性。 叁 代碼審計的必要性 用戶的默認(rèn)期望是軟件供應(yīng)商能夠保證其產(chǎn)品的安全性,比如購房、購車的時候不會特別注意和強調(diào)房子的抗震能力或車輛的防側(cè)翻能力,但實際使用中會默認(rèn)其產(chǎn)品具備符合用戶普遍預(yù)期的安全性。然而,現(xiàn)實中供應(yīng)商往往沒有提供足夠的質(zhì)量保證,查看大多數(shù)商業(yè)軟件附帶的最終用戶許可協(xié)議(EULA)便可知。盡管如此,為了保證公司的長遠(yuǎn)利益,供應(yīng)商通常還是會實施一定的質(zhì)量保證措施,這些措施通常集中在市場直接關(guān)注的部分,如功能、用戶體驗和系統(tǒng)穩(wěn)定性,但這種做法往往導(dǎo)致安全問題被忽視或邊緣化。 現(xiàn)在,安全意識的提升促使許多供應(yīng)商采納了更嚴(yán)格的業(yè)務(wù)和開發(fā)流程進(jìn)行安全測試,比如自動代碼掃描、安全漏洞掃描、滲透測試、手動代碼審計(Code Review)等安全測試方法已經(jīng)成為行業(yè)標(biāo)準(zhǔn)。 除了公司開發(fā)內(nèi)部軟件的明顯情況外,代碼安全審計在其他多種情況下也具有重要意義。 如上所見,代碼審核在多種情境下都顯得至關(guān)重要。盡管對于具備這些技能的專業(yè)人員存在顯著需求,但很少有人接受過相應(yīng)的專業(yè)訓(xùn)練或培訓(xùn),并且擁有高標(biāo)準(zhǔn)執(zhí)行代碼審計的實踐、實戰(zhàn)經(jīng)驗。 肆 代碼審計與黑盒測試 黑盒測試是一種通過操作其暴露的接口來評估軟件系統(tǒng)的方法。通常,此過程涉及構(gòu)造特定的輸入,這些輸入可能會導(dǎo)致應(yīng)用程序執(zhí)行某些意外行為,例如軟件崩潰或暴露敏感信息。模糊測試是黑盒測試的一種常見方法,使用模糊測試工具時無需手動測試每種情況,只需運行工具(可能需要對配置進(jìn)行一些修改)并記錄結(jié)果即可。 對應(yīng)用程序進(jìn)行黑盒測試的優(yōu)勢在于測試速度快,幾乎可以立即獲取結(jié)果。然而,黑盒測試也存在一些重大缺點。黑盒測試是將大量數(shù)據(jù)輸入應(yīng)用程序,希望它執(zhí)行一些不應(yīng)該執(zhí)行的操作。由于不知道應(yīng)用程序如何處理數(shù)據(jù),可能存在代碼路徑無法被掃描到,存在未觸發(fā)的路徑。例如,假設(shè)請求的查詢字符串中存在特定關(guān)鍵字,則它可能具有某些內(nèi)部功能。如下圖中的示例代碼: 上述代碼在查詢字符串時具有特殊的行為:如果查詢字符串包含"mode="序列,服務(wù)器則將設(shè)置環(huán)境變量MODE的值為xxx。然而,這段代碼對sprintf()函數(shù)的不慎使用會導(dǎo)致緩沖區(qū)溢出。 上述示例可以通過檢查代碼立即發(fā)現(xiàn)問題,而黑盒測試或模糊測試工具可能會漏掉這個漏洞。這就是為什么代碼審核很重要。 伍 代碼審計和SDLC 鑒于應(yīng)用程序可能遭受惡意利用的風(fēng)險,安全評估顯得至關(guān)重要,確定評估的最佳時機也同樣關(guān)鍵。通常,在開發(fā)生命周期(SDLC)的任何階段,都應(yīng)該開展安全評估和測試。 評估和測試的成本取決于選擇進(jìn)行審核的時間和方法,以及發(fā)現(xiàn)和修復(fù)漏洞可能帶來的成本差異: 可行性研究:此階段確定項目應(yīng)滿足的需求,確定需求在技術(shù)和財務(wù)上的可行性。 需求:在此階段,將對項目需求進(jìn)行更深入的研究,并建立項目目標(biāo)。 設(shè)計:設(shè)計解決方案并就系統(tǒng)如何在技術(shù)上實現(xiàn)做出決策。 編碼:此階段時根據(jù)前一階段的設(shè)計進(jìn)行具體的代碼開發(fā)。 測試:通過質(zhì)量測試方法盡可能捕獲軟件中的任何錯誤。 運維:軟件投入使用后根據(jù)用戶反饋進(jìn)行修訂、更新和更正。 所有軟件的開發(fā)過程和開發(fā)方法都在某種程度上借鑒了軟件開發(fā)生命周期(SDLC)模型。傳統(tǒng)的瀑布模型傾向于嚴(yán)格遵循這一模型,只經(jīng)歷一次生命周期迭代,相較之下,敏捷開發(fā)則傾向于通過重復(fù)迭代SDLC的各個階段來逐步完善應(yīng)用程序。 陸 軟件安全漏洞類別 漏洞類別是對具有相似特征或共同模式的軟件缺陷進(jìn)行分組的一種方法,也是一種幫助理解和交流軟件缺陷的心理工具。沒有完美無缺的分類體系能夠?qū)⒙┒淳_地劃分到互不重疊的類別中,一個漏洞可能同時屬于多個類別,具體的類別歸屬取決于安全人員的主觀意識。 在界定漏洞的類別時,可以從軟件開發(fā)生命周期(SDLC)各階段的看出關(guān)鍵差異。通常漏洞可以分為設(shè)計漏洞和實現(xiàn)漏洞,設(shè)計漏洞主要出現(xiàn)在SDLC的前三個階段,涉及軟件設(shè)計、系統(tǒng)架構(gòu)和規(guī)范中的缺陷,實現(xiàn)漏洞則發(fā)生在SDLC的后兩個階段,通常指軟件實際開發(fā)和構(gòu)建過程中的純粹的技術(shù)缺陷。此外在軟件運行過程中,還存在環(huán)境漏洞或操作漏洞,這類漏洞與軟件在特定環(huán)境中的部署和配置有關(guān)。 設(shè)計漏洞 設(shè)計漏洞是由于軟件設(shè)計的基本錯誤或疏忽導(dǎo)致的問題。這類漏洞使得軟件即使按照設(shè)計目的正常運行也存在安全風(fēng)險,因為其根源在于錯誤的設(shè)計邏輯或設(shè)計方法。本質(zhì)上,設(shè)計漏洞源于設(shè)計人員在設(shè)計過程中對程序運行流程、運行環(huán)境、使用方法的錯誤假設(shè),或者是未充分考慮程序引入的組件存在的安全漏洞和風(fēng)險。設(shè)計漏洞也常被稱為架構(gòu)缺陷,因此此類漏洞的修復(fù)成本和代價在所有類型漏洞中最高,甚至?xí)媾R無法修復(fù)或者沒辦法修復(fù)的情況。 實現(xiàn)漏洞 在實現(xiàn)漏洞中,代碼通常會按照預(yù)期執(zhí)行其功能,但執(zhí)行的方式可能存在安全風(fēng)險。這些問題主要出現(xiàn)在軟件開發(fā)生命周期(SDLC)的開發(fā)階段,但往往也會延續(xù)到集成和測試階段。當(dāng)開發(fā)過程與設(shè)計階段設(shè)定的技術(shù)規(guī)范出現(xiàn)偏差時,就可能出現(xiàn)這類漏洞。在大多數(shù)情況下,可利用的安全漏洞是由于技術(shù)工具、構(gòu)建軟件的平臺以及編程語言環(huán)境的細(xì)微差異所引起的。 環(huán)境(操作)漏洞 環(huán)境(操作)漏洞是指軟件在特定環(huán)境下的操作過程和一般使用中出現(xiàn)的安全問題。這類漏洞的關(guān)鍵特征是它們并不直接存在于軟件的源代碼中,相反,它們源于軟件與其運行環(huán)境的交互方式或者人員操作的方式。具體來說,環(huán)境漏洞可能涉及軟件配置問題、支持軟件和硬件以及系統(tǒng)周圍的自動化和手動流程。此外,環(huán)境漏洞也包括對用戶的社會工程學(xué)攻擊和物理攻擊。這些問題主要在軟件開發(fā)生命周期(SDLC)的運行和維護(hù)階段出現(xiàn)。 柒 漏洞類別區(qū)分 就SDLC而言,設(shè)計漏洞和實現(xiàn)漏洞之間的區(qū)別看似簡單,但區(qū)分起來并不那么容易。許多實施漏洞也可以被解釋為設(shè)計階段沒有充分預(yù)見或解決問題的情況。程序員在實現(xiàn)過程中會涉及大量的組件,包括類、函數(shù)、網(wǎng)絡(luò)協(xié)議、虛擬機,或者可能是一系列巧妙、復(fù)雜的代碼結(jié)構(gòu)。 同樣,環(huán)境漏洞與實現(xiàn)或設(shè)計漏洞之間的界限也不是非常清晰。例如,如果一個程序由于環(huán)境問題而以不安全的方式運行,這也可以被視為設(shè)計或?qū)崿F(xiàn)的問題。理想情況下,應(yīng)用程序的開發(fā)應(yīng)該使其不易受到這些環(huán)境因素的影響。 因此,設(shè)計、實現(xiàn)和環(huán)境漏洞的定義并非是嚴(yán)格劃分的,它們之間存在很大的解釋空間和重疊區(qū)域。 捌 軟件漏洞的成因 控制流與數(shù)據(jù)流是軟件安全的兩大關(guān)鍵要素。眾多軟件漏洞往往是程序處理惡意數(shù)據(jù)時出現(xiàn)的意外行為所觸發(fā)。 大多數(shù)漏洞在利用時,攻擊者通過各種方式將惡意數(shù)據(jù)注入系統(tǒng),以觸發(fā)漏洞的利用。然而,這些數(shù)據(jù)并不總是直接來源于用戶的輸入,它們可能采取更為復(fù)雜的路徑進(jìn)入系統(tǒng)。這些惡意數(shù)據(jù)可能源自眾多不同的來源,并通過多種接口進(jìn)入系統(tǒng)。在到達(dá)能夠觸發(fā)可利用條件的關(guān)鍵位置之前,它們可能會穿越系統(tǒng)的多個模塊,并在這個過程中經(jīng)歷多次轉(zhuǎn)換。 因此,在分析和評審一個軟件系統(tǒng)時,必須關(guān)注的核心屬性是整個系統(tǒng)中各個模塊、組件間的數(shù)據(jù)流,掌握數(shù)據(jù)流的全貌對于確保系統(tǒng)的安全性和防御潛在的攻擊至關(guān)重要。 在軟件系統(tǒng)中,不同組件之間的信任關(guān)系是安全分析的關(guān)鍵方面。這些信任關(guān)系是數(shù)據(jù)流的基礎(chǔ),因為組件間的信任級別往往決定了它們在交換數(shù)據(jù)時所需的驗證程度。 設(shè)計和開發(fā)人員通常假定某些組件或接口是可信的,這意味著他們認(rèn)為這些組件不會受到惡意影響,從而在處理這些組件的數(shù)據(jù)和行為時按照默認(rèn)其安全。然而,一旦這種信任被錯誤賦予,攻擊者就可能利用受信任的實體,導(dǎo)致系統(tǒng)安全性的連鎖反應(yīng)。 在評估信任關(guān)系時,信任的傳遞性同樣不容忽視。例如,如果軟件系統(tǒng)信任某個外部組件,而該組件又信任某個網(wǎng)絡(luò),那么您的系統(tǒng)實際上也間接信任該網(wǎng)絡(luò)。如果這種信任鏈中的任何一環(huán)信任度不足,整個系統(tǒng)都可能成為攻擊的犧牲品,從而將您的軟件置于風(fēng)險之中。 探索軟件缺陷的另一種有效途徑是將其視為開發(fā)者和設(shè)計者在構(gòu)建軟件時做出的未經(jīng)證實的假設(shè)。這些假設(shè)可能涉及軟件的多個層面,包括輸入數(shù)據(jù)的有效性和結(jié)構(gòu)、輔助程序的安全性、操作環(huán)境的安全性、攻擊者和用戶的技能,以及特定API調(diào)用或編程語言特性的行為和細(xì)微差別。 不恰當(dāng)?shù)募僭O(shè)與錯誤信任的概念緊密相連。實際上,對某個組件的過度信任可以被視為對其做出了不切實際的假設(shè)。 以下為這種假設(shè)和過度信任的具體問題類型: - 輸入 - 如前所述,軟件漏洞很大程度上源于攻擊者向系統(tǒng)注入的惡意數(shù)據(jù)。這些數(shù)據(jù)之所以能夠造成麻煩,部分原因在于軟件往往對其通信伙伴持有過度的信任,并對數(shù)據(jù)的來源及其內(nèi)容做出了不切實際的假設(shè)。 在編寫處理數(shù)據(jù)的代碼時,開發(fā)人員常常對數(shù)據(jù)提供者(無論是用戶還是其他軟件組件)持有一定的預(yù)期。例如,在處理用戶輸入時,開發(fā)人員可能會假設(shè)用戶不會輸入包含5,000個字符及不可打印符號的字符。同樣,當(dāng)編寫兩個軟件組件之間的接口代碼時,他們可能默認(rèn)輸入數(shù)據(jù)格式將是正確的,而沒有考慮到程序可能會處理負(fù)長度的二進(jìn)制記錄或接收高達(dá)數(shù)十億字節(jié)的網(wǎng)絡(luò)請求。 然而,攻擊者在審視輸入處理代碼時,會嘗試探索每一個可能的輸入,特別是那些可能導(dǎo)致程序狀態(tài)不一致或意外的輸入。他們致力于測試軟件的每一個接口,尋找開發(fā)人員所做的任何潛在假設(shè)。對于攻擊者來說,任何能夠提供意外輸入的機會都是極具價值的,因為這些輸入可能會在后續(xù)處理中引發(fā)開發(fā)人員未曾預(yù)料的微妙錯誤。 通常,如果攻擊者能夠?qū)浖倪\行時屬性進(jìn)行意外的修改,他們就可能找到方法來放大這種影響,從而利用漏洞對程序造成更嚴(yán)重的后果。 - 接口 - 接口是軟件組件之間以及與外部世界交互的關(guān)鍵機制。眾多漏洞的根源在于開發(fā)人員對這些接口的安全特性理解不足,進(jìn)而錯誤地假設(shè)只有可信節(jié)點會與之交互。當(dāng)程序組件可以通過網(wǎng)絡(luò)或本地計算機上的多種途徑被訪問時,攻擊者就可能直接與這些組件交互,并注入惡意輸入。如果組件在編寫時假設(shè)其通信對方是可信的,那么應(yīng)用程序可能會以易受攻擊的方式處理這些輸入。 加劇這一漏洞的是開發(fā)人員常常對攻擊者訪問接口的難度做出誤判,因此對那些缺乏足夠安全措施的接口賦予了過多的信任。例如,開發(fā)人員可能認(rèn)為他們的應(yīng)用程序非常安全,因為他們使用了包含自定義加密的復(fù)雜且專有的網(wǎng)絡(luò)協(xié)議。他們可能錯誤地假設(shè)攻擊者不太可能獨立構(gòu)建客戶端和加密層,并以非預(yù)期的方式操縱協(xié)議。然而,這種假設(shè)往往是站不住腳的,因為許多攻擊者樂于對專有協(xié)議進(jìn)行逆向工程,尋找可以利用的安全漏洞。 總的來說,開發(fā)人員可能會因為以下幾個原因而對接口的安全性產(chǎn)生疑慮: 1、不充分的保護(hù)措施:開發(fā)人員選擇的接口暴露方式可能無法提供足夠的安全防護(hù),從而無法有效抵御外部攻擊。 2、錯誤的使用或配置:雖然開發(fā)人員可能選擇了可靠的接口公開方法,比如操作系統(tǒng)服務(wù),但他們可能在接口的使用或配置上出現(xiàn)了錯誤。此外,攻擊者還可能利用基礎(chǔ)平臺中的漏洞來非預(yù)期地控制該接口。 3、對訪問難度的誤判:開發(fā)人員可能認(rèn)為某個接口對于攻擊者來說訪問難度過高,這種假設(shè)往往存在風(fēng)險。攻擊者往往會找到方法來克服看似難以訪問的接口。 - 環(huán)境攻擊 - 軟件系統(tǒng)并非孤立運行,而是依賴于一個由多種組件構(gòu)成的計算環(huán)境,這些組件通常包括操作系統(tǒng)、硬件架構(gòu)、網(wǎng)絡(luò)、文件系統(tǒng)、數(shù)據(jù)庫以及用戶等。雖然許多軟件漏洞源于對惡意數(shù)據(jù)的處理不當(dāng),但還有一部分缺陷是由于攻擊者操控軟件的底層環(huán)境而觸發(fā)的。 這些缺陷可被視為開發(fā)人員對軟件運行所依賴的環(huán)境做出的不切實際的假設(shè)所導(dǎo)致。每種支持技術(shù),如操作系統(tǒng)、網(wǎng)絡(luò)或數(shù)據(jù)庫,都有其最佳實踐和復(fù)雜細(xì)節(jié)。如果應(yīng)用開發(fā)人員對這些技術(shù)可能存在的安全問題缺乏全面了解,他們就可能犯下導(dǎo)致安全漏洞的錯誤。 一個典型的漏洞類型是競爭條件,這類漏洞的觸發(fā)并非源自攻擊者提供的數(shù)據(jù),而是由于攻擊者針對程序運行時環(huán)境的操作,導(dǎo)致程序與操作系統(tǒng)之間的交互出現(xiàn)了非預(yù)期的且不安全的方式。 - 特殊條件 - 特殊條件漏洞通常與異常情況的處理緊密相關(guān),并交織著數(shù)據(jù)和環(huán)境漏洞。這類漏洞的基本特征是攻擊者通過外部手段引發(fā)程序正常控制流的非預(yù)期變化。這種變化可能需要程序的非同步中斷,例如信號傳遞,或者通過耗盡全局系統(tǒng)資源來故意觸發(fā)程序中的故障點。 該文章在 2024/3/25 0:33:17 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |