-
1 # 數智風
-
2 # getfull
漏洞
漏洞存在於軟體程式碼(原始碼或二進位制)中。一個最經典的漏洞是緩衝區溢位漏洞,這個漏洞根本上涉及濫用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)、方法覆蓋問題(子類問題)、對不該信任的元件給予太多信任(客戶端)。(關於這些問題的更多資訊,請參閱McGraw的《保護Java》一書)。
缺陷問題與漏洞一樣常見。事實上,大多數研究表明,漏洞和缺陷各佔50%。當然,本文中我們討論的是這二者的統一體。還有一些棘手的情況可能被同時歸類為漏洞和缺陷,這就取決於你如何看待它。但是,在一般情況下,學習區分漏洞和缺陷對你很有意義。
回覆列表
簡單得說:軟體缺陷就是軟體bug。軟體漏洞屬於軟體缺陷的一類。可以歸類為軟體安全方面的缺陷。
①、軟體缺陷
在計算機行業常常叫它Bug,指計算機軟體或程式存在某種破壞正常執行能力的問題、錯誤,或者隱藏的功能缺陷。
②、軟體漏洞
是指軟體在設計、實現、配置策略及使用過程中出現的缺陷,它可能導致攻擊者在未授權的情況下訪問或破壞系統。
從概念上看:其實缺陷就是軟體會出故障的點,而漏洞是,軟體被攻擊者攻擊才會出故障的點。後者明顯範圍小一些,需要被人利用了才會導致軟體被破壞。而前者包括了程式執行使用過程中自己出錯的點。
①、軟體缺陷產生的根源
軟體缺陷產生的根源主要包括:測試策略,過程、工具和方法,團隊/人,缺乏組織和通訊,硬體,軟體,工作環境等。
測試策略:主要是測試範圍不足,測試目標偏離引起。
過程,工具和方法:主要是需求收集無效,專案管理過程不夠(比如:沒有做變更控制,未做風險管理)。
團隊/人:主要是專案團隊職責不清(要麼交叉職責,要麼出現空缺),人員缺乏培訓(尤其是沒有經驗的人員),士氣低下或動機不純。
缺乏組織和通訊:矇頭開發導致和使用者溝通不夠,團隊管理失敗。
硬體:主要是對硬體配置不對,硬體韌體本身存在缺陷,處理器本身的缺陷。
軟體:主要是軟體配置不對,對作業系統的資源的獲取和釋放控制不好,編譯器錯誤。
工作環境:主要是團隊變動,預算削減,環境惡劣(比如:噪音很大)
②、軟體漏洞產生的根源
軟體漏洞產生根源也包括在軟體缺陷產生之中。但相對範圍較小,上面有一些過程就不會產生漏洞,只會產生缺陷。
需求收集不足:只會導致使用者使用功能不足,不會產生漏洞。
和使用者溝通不夠:這也只會導致軟體使用缺陷,不會產生漏洞。
無論是軟體公司、軟體開發人員,還是使用者都不希望軟體出現缺陷。然而軟體只要是人設計的,都有可能出現缺陷。那我們該如何來防範呢?
①、從源頭堵
前面講了缺陷產生的根源,我們可以根據根源產生的原因,進行有效的管控。
進行有效團隊管理、專案管理,做好計劃,監督,檢查,改進的工作。
對測試過程進行嚴格的管控,做到不偏不漏。
做好有效的缺陷分析,找出軟硬體和程式碼的缺陷並修正。
做好程式碼安全審計,不能讓程式碼中存在安全漏洞。
②、全生命週期跟蹤
軟體開發完成到釋出使用,只是軟體生命週期的開始。在使用者使用過程中依然會發現軟體公司未發現的軟體缺陷。所以,我們要對軟體的全生命週期(設計、開發、運營、更新、停止)進行跟蹤,一旦發現缺陷,立即進行補丁修補。
軟體開發過程中可以吸取之前軟體發生過的缺陷的經驗教訓。我們在自己的軟體過程中儘量避免犯同類的錯誤。否者,我們的軟體註定是一個失敗的開始。
④、藉助安全系統
在計算機系統運營過程中,黑客們的攻擊手段眾多。我們需要利用計算機網路安全的安全系統來對軟體進行邊界的安全保護。
總結產生軟體的缺陷(含軟體漏洞)對軟體來說都是一件不好的事情。我們除了認識他們的區別之外,更重要是認清的它們的根源,然後儘量減少他們的發生。