解決常見軟件漏洞
以下漏洞只是MITRE的 2019年CWE最危險的25個最嚴重軟件錯誤列表中列出的幾個漏洞。盡管攻擊者已廣為人知并使用了許多此類問題,但它們仍繼續(xù)包含在軟件中。
緩沖區(qū)溢出
當您的程序試圖讀取或寫入超出范圍的緩沖區(qū)時,就會發(fā)生緩沖區(qū)溢出。它可能導致覆蓋或在現(xiàn)有代碼中附加數(shù)據(jù)。緩沖區(qū)溢出可使攻擊者執(zhí)行代碼,更改程序流,讀取敏感數(shù)據(jù)或使系統(tǒng)崩潰。
緩沖區(qū)溢出漏洞的示例包括:
· 接受長度不受限制的輸入
· 允許從無效索引對數(shù)組進行讀取操作
緩沖區(qū)溢出漏洞的包含通常發(fā)生在體系結構和設計,實施或操作階段。這些漏洞最常見于C,C ++和Assembly程序,但可以以任何缺少內存管理支持的語言出現(xiàn)。
緩沖區(qū)溢出的漏洞預防措施
盡可能選擇一種防止或降低此漏洞風險的語言,例如Java或Perl。如果這是一個選項,請不要禁用溢出保護,例如在C#中。此外,請記住,與環(huán)境中的易受攻擊的本機代碼交互時,即使是“免疫”語言也可能會產(chǎn)生錯誤。
為了防止利用緩沖區(qū)溢出漏洞,可以使用包含功能或擴展名以限制輸入的編譯器。例如,Visual Studio或StackGuard。您還可以使用工具在內存中隨機排列程序組件。這使得地址更難以識別或預測,從而使攻擊者難以利用特定組件。
創(chuàng)建代碼時,請確保正確分配了緩沖區(qū)空間。另外,請使用允許您限制輸入大小的方法和功能。
輸入驗證不正確
當用戶輸入在接受時未得到驗證或驗證不足時,就會發(fā)生輸入驗證不當。不正確的驗證可以使攻擊者執(zhí)行惡意代碼,更改程序流,訪問敏感數(shù)據(jù)或濫用資源分配。
驗證不當?shù)氖纠ǎ?/div>
· 假設攻擊者無法訪問隱藏的表單字段
· 僅驗證輸入的長度而不是內容
包含不正確的驗證通常發(fā)生在架構,設計和實施階段。它可以在任何接受外部數(shù)據(jù)的語言或系統(tǒng)中發(fā)生。
輸入驗證不當?shù)穆┒搭A防措施
您應該對任何用戶應用“零信任”原則,并假設所有輸入都是有害的,直到證明安全為止。使用白名單以確保輸入內容僅包含可接受的格式和內容。
在驗證輸入時,請評估長度,類型,語法和對邏輯的符合性(即輸入具有語義意義)。您可以使用多種工具來確保進行充分的驗證,例如OWASP ESAPI驗證API和RegEx。使用這些工具來驗證所有輸入源,包括環(huán)境變量,查詢,文件,數(shù)據(jù)庫和API調用。
確保在客戶端和服務器端都執(zhí)行檢查??梢岳@過客戶端驗證,因此您需要仔細檢查。如果繞過客戶端驗證,則在服務器端捕獲輸入可以幫助您識別攻擊者的操縱。在進行任何必要的組合或轉換后,請驗證輸入。
信息公開
當有意或無意將數(shù)據(jù)提供給潛在攻擊者時,就會發(fā)生信息泄露。數(shù)據(jù)可以包含敏感信息,也可以向攻擊者提供有關可以在攻擊中利用的軟件或環(huán)境的信息。
信息公開的示例包括:
· 顯示文件或程序完整路徑的錯誤
· 錯誤消息暴露了數(shù)據(jù)庫中用戶的存在
包含信息公開漏洞通常發(fā)生在開發(fā)的體系結構和設計或實施階段。任何語言都可能發(fā)生這些漏洞。
信息暴露的漏洞預防措施
為防止信息泄露,您應設計程序體系結構以將敏感信息包含在具有明確信任邊界的區(qū)域中。確保使用訪問控制來保護和限制“安全”區(qū)域與端點之間的連接。
為了很大程度地利用漏洞,請驗證錯誤消息和用戶警告中是否包含不必要的信息。您還應該限制來自URL和通信標頭的敏感信息。例如,模糊完整的路徑名或API密鑰。
特權或認證不當
如果未正確分配,跟蹤,修改或驗證用戶權限和憑據(jù),則會發(fā)生不正確的權限或身份驗證。這些漏洞可使攻擊者濫用特權,執(zhí)行受限任務或訪問受限數(shù)據(jù)。
不當特權或身份驗證的示例包括:
· 不可逆轉的臨時特權升級。
· 通過黑名單而不是白名單來限制特權。
· 允許較低的特權級別影響較高的特權帳戶,例如重置管理員密碼。
· 無限制的登錄嘗試或會話限制。
特權或身份驗證漏洞通常在開發(fā)的體系結構和設計,實施或操作階段引入。任何語言都可能發(fā)生這些漏洞。
特權或身份驗證的漏洞預防措施
您應將最小特權原則應用于與您的軟件和系統(tǒng)交互的所有用戶和服務。通過在整個程序和環(huán)境中應用訪問控制來限制用戶和實體的功能。您應該將權限限制為僅用戶或服務所需的那些資源。
如果可能,將高級特權分成多個角色。分離有助于限制“高級用戶”,并降低攻擊者濫用訪問權限的能力。您還可以應用多因素身份驗證方法來防止攻擊者繞過系統(tǒng)或獲得輕松的訪問權限。
減少一般漏洞的優(yōu)秀實踐
除了采取針對特定漏洞的措施外,您還應該采取一些措施來總體上減少漏洞。您可以從以下做法開始。
向威脅情報來源學習
監(jiān)視和應用來自漏洞數(shù)據(jù)庫和獨立監(jiān)督組(例如OWASP或NIST)的信息。這些資源可以在發(fā)現(xiàn)漏洞后為您提供有關漏洞的信息。這些資源通常包括有關如何解決或緩解當前存在的問題的信息。您可以應用此信息來確保正確修補了系統(tǒng)和組件。
仔細包括依賴性
確保僅在需要時才使用經(jīng)過審查和信任的庫和框架。這些工具中的漏洞會傳輸?shù)侥能浖⑶铱梢詾楣粽咛峁┖箝T訪問。使用庫和框架時,請確保您了解可用的功能,并且知道任何已知的利用或漏洞。
進行漏洞評估
即使您遵循任何已知的優(yōu)秀做法,也不要假定您的程序是安全的。您需要在運行時靜態(tài)測試代碼,以確保不會遺漏漏洞。將自動測試工具集成到您的開發(fā)環(huán)境中可以幫助您盡早發(fā)現(xiàn)漏洞。這些工具可以幫助您確保不會因時間限制而跳過測試,也不會因人為錯誤而忽略測試。
結論
軟件漏洞似乎是不可避免的,但大多數(shù)漏洞可以消除或至少減少。通過了解如何引入漏洞,您可以調整自己的做法和測試以在產(chǎn)品發(fā)布之前發(fā)現(xiàn)問題。
希望本文能幫助您了解一些最常見的漏洞。通過應用此處介紹的實踐和方法,可以減少攻擊者利用軟件中這些問題的機會。