今天小溪暢流簡(jiǎn)單為大家說下一些最為常見的軟件漏洞,以及如何避免它們的方法。
一、緩沖區(qū)溢出
當(dāng)您的程序試圖讀取或?qū)懭氤龇秶木彌_區(qū)時(shí),就會(huì)發(fā)生緩沖區(qū)溢出的錯(cuò)誤。其直接的危害是:可能導(dǎo)致數(shù)據(jù)覆蓋,或是在現(xiàn)有的代碼中附加不該出現(xiàn)的數(shù)據(jù)。因此,緩沖區(qū)溢出可以使得攻擊者通過執(zhí)行代碼,來更改程序流,進(jìn)而讀取某種敏感數(shù)據(jù),或造成系統(tǒng)的崩潰。
緩沖區(qū)溢出漏洞的典型示例包括:接受各種長(zhǎng)度不受限制的輸入;允許從無效的索引處對(duì)數(shù)組進(jìn)行讀取操作;緩沖區(qū)溢出漏洞通常潛藏在軟、硬件體系架構(gòu)的設(shè)計(jì)、實(shí)施、以及操作階段。這些漏洞最常見于C、C++和Assembly程序中。當(dāng)然,它也可能出現(xiàn)在缺乏對(duì)內(nèi)存管理提供支持的任何一種編程語言里。
預(yù)防措施:應(yīng)當(dāng)盡量選擇諸如:Java或Perl等具有防范,或降低此類漏洞風(fēng)險(xiǎn)機(jī)制的語言。而在C#之類的編程語言中,我們千萬不要禁用溢出保護(hù)的選項(xiàng)。即便如此,那些具有“免疫”功能的編程語言,也可能會(huì)在運(yùn)行環(huán)境中的易受攻擊的、原生代碼交互時(shí),產(chǎn)生不可預(yù)期的錯(cuò)誤。
另外,請(qǐng)創(chuàng)建代碼時(shí)確保正確地分配緩沖區(qū)空間,并使用各種方法和功能來限制輸入的大小。
二、不當(dāng)?shù)妮斎腧?yàn)證
如果我們不能夠在接收端對(duì)用戶的輸入采取驗(yàn)證,或驗(yàn)證不足,那么就會(huì)產(chǎn)生所謂的“輸入驗(yàn)證不當(dāng)”。而不當(dāng)?shù)尿?yàn)證則會(huì)使得攻擊者通過執(zhí)行惡意代碼,來更改程序流,訪問敏感數(shù)據(jù),以及濫用現(xiàn)有的資源分配。
預(yù)防措施:我們應(yīng)該對(duì)任何用戶采取“零信任”的原則,并假設(shè)所有的輸入都是可疑的,直到它們被證明是安全的為止。同時(shí),我們可以使用白名單機(jī)制,來確保輸入的內(nèi)容僅包含了可接受的格式與信息。
此外,我們應(yīng)當(dāng)確保在客戶端和服務(wù)器端都執(zhí)行相應(yīng)的檢查。為了避免出現(xiàn)客戶端驗(yàn)證被繞過的情況,我們需要重點(diǎn)在服務(wù)器端捕獲各項(xiàng)輸入,以識(shí)別攻擊者的潛在操縱。同時(shí),在程序代碼進(jìn)行任何必要的組合或轉(zhuǎn)換后,也請(qǐng)您再次驗(yàn)證其輸入。
三、信息泄露
數(shù)據(jù)被有意或無意地提供給潛在攻擊者,被稱為信息泄露。除了泄露敏感的數(shù)據(jù)信息,向攻擊者提供可能被利用的軟、硬件環(huán)境信息也是一種泄露。
預(yù)防措施:為防止信息的泄露,您應(yīng)當(dāng)在設(shè)計(jì)程序架構(gòu)時(shí),針對(duì)明確的信任邊界區(qū)域,來保護(hù)敏感的信息;通過使用訪問控制,來保護(hù)和限制“安全”區(qū)域與各個(gè)端點(diǎn)之間的連接。
為了最大程度地避免該漏洞,請(qǐng)?jiān)诔绦蛑序?yàn)證各類錯(cuò)誤的提示消息,以及用戶警告信息中是否包含有不必要暴露的內(nèi)容。同時(shí),您還應(yīng)該限制在URL和通信包的頭部(header)出現(xiàn)的敏感信息。例如:您可以隱藏完整的路徑名稱,以及API密鑰。
四、特權(quán)或認(rèn)證不當(dāng)
如果未能正確地分配,跟蹤,修改或驗(yàn)證用戶的相關(guān)權(quán)限和憑據(jù),那么就可能發(fā)生特權(quán)或身份驗(yàn)證不當(dāng)?shù)那闆r。此類漏洞可以讓攻擊者濫用特權(quán),執(zhí)行受限的任務(wù),以及訪問受限的數(shù)據(jù)。
預(yù)防措施:您應(yīng)當(dāng)將“最小特權(quán)原則”,應(yīng)用于與目標(biāo)軟件和系統(tǒng)交互的所有用戶和服務(wù)之中。只給真正需要某些資源和操作的用戶或服務(wù),完成所需任務(wù)的最少權(quán)限。我們需要通過在整個(gè)程序和環(huán)境中使用訪問控制,來限制用戶和實(shí)體的權(quán)限。
如有可能,我們也可以將高級(jí)特權(quán)分給多個(gè)角色。通過分離,我們可以有效地削弱“高級(jí)用戶”,并降低攻擊者濫用其訪問權(quán)限的能力。此外,您還可以運(yùn)用多因素身份驗(yàn)證的方法,來防止攻擊者繞過系統(tǒng)的檢查機(jī)制,輕松地獲得訪問權(quán)限。
軟件漏洞可謂層出不窮,我們能做的只有通過了解漏洞的原理和防范的措施,來及時(shí)地調(diào)整自己的實(shí)現(xiàn)方式,并開展全面的測(cè)試,在產(chǎn)品發(fā)布之前,盡可能多地發(fā)現(xiàn)并解決潛在的漏洞與問題。