1.引言
網絡安全已成爲人們日益關注的重要問題。據CNCERT/CC2007年網絡安全工做報告的統計,近年來漏洞數量呈現明顯上升趨勢,不只如此,新漏洞從公佈到被利用的時間愈來愈短,黑客對發佈的漏洞信息進行分析研究,每每在極短期內就能成功利用這些漏洞。除了利用已知漏洞,黑客們也善於挖掘並利用一些還沒有公佈的漏洞,發起病毒攻擊,或出售漏洞資料,知足經濟目的。相對於黑客,安全研究者們在漏洞研究方面顯得相對被動和滯後。所以,應該加大對漏洞挖掘的研究力度,以便對各種漏洞採起更爲主動合理的處理方式。
2.漏洞挖掘概述
漏洞(vulnerability)是指系統中存在的一些功能性或安全性的邏輯缺陷,包括一切致使威脅、損壞計算機系統安全性的全部因素,是計算機系統在硬件、軟件、協議的具體實現或系統安全策略上存在的缺陷和不足。因爲種種緣由,漏洞的存在不可避免,一旦某些較嚴重的漏洞被攻擊者發現,就有可能被其利用,在未受權的狀況下訪問或破壞計算機系統。先於攻擊者發現並及時修補漏洞可有效減小來自網絡的威脅。所以主動發掘並分析系統安全漏洞,對網絡攻防戰具備重要的意義。
漏洞的研究主要分爲漏洞挖掘與漏洞分析兩部分。漏洞挖掘技術是指對未知漏洞的探索,綜合應用各類技術和工具,儘量地找出軟件中的潛在漏洞;漏洞分析技術是指對已發現漏洞的細節進行深刻分析,爲漏洞利用、補救等處理措施做鋪墊。
國內外多個安全組織及我的都從事漏洞的研究。其中比較權威的兩個漏洞發佈機構是CVE(Common Vulnerabilities and Exposures)和CERT(Computer Emergency Response Team)。此外,國外eEye、LSD等組織也對最新的漏洞進行及時跟蹤分析,並給出相應的漏洞解決方案。綠盟科技、啓明星辰等單位是國內安全研究組織的表明。其中綠盟科技是發佈自主研究安全漏洞最多的國內安全公司,已經完成對RPC、SMB、IIS等多類漏洞的研究,並取得了不錯的成績。
3.現有漏洞挖掘技術分類
根據分析對象的不一樣,漏洞挖掘技術能夠分爲基於源碼的漏洞挖掘技術和基於目標代碼的漏洞挖掘技術兩大類。
基於源碼的漏洞挖掘的前提是必須能獲取源代碼,對於一些開源項目,經過分析其公佈的源代碼,就可能找到存在的漏洞。例如對Linux系統的漏洞挖掘就可採用這種方法。但大多數的商業軟件其源碼很難得到,不能從源碼的角度進行漏洞挖掘,只能採用基於目標代碼的漏洞挖掘技術。對目標碼進行分析涉及編譯器、指令系統、可執行文件格式等多方面的知識,難度較大。
基於目標代碼的漏洞挖掘首先將要分析的二進制目標代碼反彙編,獲得彙編代碼;而後對彙編代碼進行切片,即對某些上下文關聯密切、有意義的代碼進行匯聚,下降其複雜性;最後經過分析功能模塊,來判斷是否存在漏洞。
漏洞挖掘技術從逆向分析的軟件測試角度,又可分爲白箱分析、黑箱分析和灰箱分析三類,這三種方法在文獻中有較詳細介紹。
4.常見的漏洞挖掘分析技術
漏洞挖掘是一個多種漏洞挖掘分析技術相互結合、共同使用和優點互補的過程。目前漏洞挖掘分析技術有多種,主要包括手工測試技術(manual testing)、Fuzzing技術、比對和二進制比對技術(Diff and BinDiff)、靜態分析技術(static analysis)、動態分析技術(runtime analysis)等。
4.1.手工測試
手工測試是經過客戶端或服務器訪問目標服務,手工向目標程序發送特殊的數據,包括有效的和無效的輸入,觀察目標的狀態、對各類輸入的反應,根據結果來發現問題的漏洞檢測技術。手工測試不須要額外的輔助工具,可由測試者獨立完成,實現起來比較簡單。但這種方法高度依賴於測試者,須要測試者對目標比較瞭解。手工測試可用於Web應用程序、瀏覽器及其餘須要用戶交互的程序。
4.2.Fuzzing技術
Fuzzing是一種基於缺陷注入的自動軟件測試技術,它利用黑盒測試的思想,使用大量半有效的數據做爲應用程序的輸入,以程序是否出現異常爲標誌,來發現應用程序中可能存在的安全漏洞。所謂半有效的數據是指對應用程序來講,文件的必要標識部分和大部分數據是有效的,這樣應用程序就會認爲這是一個有效的數據,但同時該數據的其餘部分是無效的,這樣應用程序在處理該數據時就有可能發生錯誤,這種錯誤可以致使應用程序的崩潰或者觸發相應的安全漏洞。Fuzzing技術是利用Fuzzer工具經過徹底隨機的或精心構造必定的輸入來實現的。下圖顯示了Fuzzing技術的通用測試過程。git
Fuzzing測試一般以大小相關的部分、字符串、標誌字符串開始或結束的二進制塊等爲重點,使用邊界值附近的值對目標進行測試。Fuzzing技術能夠用於檢測多種安全漏洞,包括[4]:緩衝區溢出漏洞、整型溢出漏洞、格式化串漏洞、競爭條件漏洞、SQL注入、跨站點腳本、遠程命令執行、文件系統攻擊、信息泄露等。目前公佈的安全漏洞中有許多都是使用Fuzzing技術檢測發現的,而且有許多Fuzzing工具能夠用於測試應用程序的安全性。 與其它技術相比,Fuzzing技術具備思想簡單,容易理解、從發現漏洞到漏洞重現容易、不存在誤報的優勢,固然它也具備黑盒測試的所有缺點,並且它有不通用,構造測試周期長等問題。 4.3.二進制比對技術 二進制比對技術又可稱爲補丁比對技術,它主要是被用以挖掘「已知」的漏洞,所以在必定意義上也可被認爲是一種漏洞分析技術。因爲安全公告中通常都不指明漏洞的確切位置和成因,使得漏洞的有效利用比較困難。但漏洞通常都有相應的補丁,因此能夠經過比較補丁先後的二進制文件,肯定漏洞的位置和成因。 補丁比對技術對於安全人員及黑客都是很是有用的技術,經過補丁比對分析,定位漏洞代碼,再加以數據流分析,最後能夠獲得漏洞利用的攻擊代碼。有經驗的安全專家或黑客甚至能在很短的時間內就完成這個漏洞挖掘與利用的過程。 補丁比對技術有不少,簡單的比較方法有二進制字節比較和二進制文件反彙編後的文本比較,前者只適用於若干字節變化的比較;然後者缺少對程序邏輯的理解,沒有語義分析,適用於小文件和少許的變化。這兩種方法都不適合文件修改較多的狀況。較複雜的方法[4]還有Tobb Sabin提出的基於指令類似性的圖形化比較和Halvar Flake提出的結構化二進制比較,前者能夠發現文件中一些非結構化的變化,如緩衝區大小的改變等,而且圖形化顯示比較直觀。其不足是受編譯器優化的影響較大,且不能在兩個文件中自動發現大量比較的起始點。後者注重二進制可執行文件在結構上的變化,從而在必定程度上消除了編譯器優化對分析二進制文件所帶來的影響,但這種方法不能發現非結構的變化。 經常使用的補丁比對工具備IDefense公司發佈的IDACompare、The eEye Digital Security發佈的Binary Diffing Suite(EBDS)以及Sabre Security的BinDiff。它們都是基於結構化二進制比較技術的補丁比對工具。此外,NCNIPC還於2007年12月發佈了NIPC Binary Differ(NBD)補丁比對工具,大大的擴充了經典算法中簡易簽名,可參見文獻[8]。 4.4.靜態分析 靜態分析是經過詞法、語法、語義分析檢測程序中潛在的安全問題,發現安全漏洞的,其基本思想方法也是對程序源程序的靜態掃描分析,故也歸類爲靜態檢測分析。靜態分析重點檢查函數調用及返回狀態,特別是未進行邊界檢查或邊界檢查不正確的函數調用(如strcpy,strcat等可能形成緩衝區溢出的函數)、由用戶提供輸入的函數、在用戶緩衝區進行指針運算的程序等。 目前流行的軟件漏洞靜態分析技術[9]主要包括源代碼掃描和反彙編掃描,它們都是一種不須要運行軟件程序就能夠分析程序中可能存在的漏洞的分析技術。 源代碼掃描:主要針對開放源代碼的程序,經過檢測程序中不符合安全規則的文件結構、命名規則、函數、堆棧指針等,從而發現程序中可能隱含的安全缺陷。這種漏洞分析技術須要熟練掌握編程語言,並預先定義出不安全代碼的審查規則,經過表達式匹配的方法檢查源代碼。因爲程序運行時是動態變化的,若是不考慮函數調用的參數和調用環境,不對源代碼進行詞法分析和語法分析就沒有辦法準確的把握程序的語義,所以這種方法不能發現程序動態運行過程當中的安全漏洞。 反彙編掃描:對於不公開源代碼的程序來講每每是最有效的發現安全漏洞的辦法。分析反彙編代碼須要有豐富的經驗,也可使用輔助工具來幫助簡化這個過程。但不可能有一種徹底自動的工具來完成這個過程。例如,利用一種優秀的反彙編程序IDA就能夠獲得目標程序的彙編腳本語言,再對彙編出來的腳本語言使用掃描的方法,從而進一步識別一些可疑的彙編代碼序列。經過反彙編來尋找系統漏洞的好處是從理論上講,無論多麼複雜的問題老是能夠經過反彙編來解決的。它的缺點也是顯然的,這種方法費時費力,對人員的技術水平要求很高,一樣不能檢測到程序動態運行過程當中產生的安全漏洞。 靜態分析方法高效快速,可以很快完成對源代碼的檢查,而且檢查者不須要了解程序的實現方式,故很是適合自動化的程序源程序緩衝區溢出檢查。此外,它還可以較全面的覆蓋系統代碼,減小了漏報。 但這種方法也存在很大的侷限性,不斷擴充的特徵庫或詞典,形成了檢測的結果集大、誤報率高;靜態分析方法,重點是分析代碼的「特徵」,而不關心程序的功能,不會有針對功能及程序結構的分析檢查。 4.5.動態分析技術 動態分析技術是一種動態的檢測技術,在調試器中運行目標程序,經過觀察執行過程當中程序的運行狀態、內存使用情況以及寄存器的值等以發現潛在問題,尋找漏洞。它從代碼流和數據流兩方面入手:經過設置斷點動態跟蹤目標程序代碼流,以檢測有缺陷的函數調用及其參數;對數據流進行雙向分析,經過構造特殊數據觸發潛在錯誤並對結果進行分析。動態分析須要藉助調試器工具,SoftIce、OllyDbg、WinDbg等是比較強大的動態跟蹤調試器。 常見動態分析方法有:輸入追蹤測試法、堆棧比較法、故障注入分析法。 動態分析是在程序運行時進行分析,找到的漏洞即表現爲程序錯誤,所以具備較高的準確率;它可以有針對性的對目標系統進行檢查,從而可以準確的肯定目標系統相應功能或模塊的系統表現。此外,動態分析技術與黑盒測試很是類似,無須源代碼,能夠經過觀察程序的輸入和輸出來分析,並對其進行各類檢查,以驗證目標程序是否有錯誤。如由輸入引起的緩衝區溢出漏洞,可使用此方法。動態分析能夠知足某些安全檢測的須要,可是仍是有較大的侷限性,它效率不高,不容易找到分析點,須要熟悉目標系統且有豐富經驗,技術複雜,對分析人員要求高,難以實現自動化發現。在大規模項目的檢查中,動態分析技術都受到較大的制約。5 結束語 軟件漏洞挖掘是網絡攻防技術的重要組成部分。本文重點研究了幾種常見的漏洞挖掘技術,各類方法都有其優缺點,爲了準確挖掘軟件漏洞,在實際測試時能夠綜合使用。好比,將手工測試和Fuzzing技術相結合,同時藉助於Debugger(IDA Pro、Ollydbg等)進行分析調試就是一種很好的漏洞挖掘思路。經過手工測試,可以瞭解目標的一些基本信息,找出該程序可能出現脆弱點的線索,從而有針對性的利用Fuzzing技術設計並實現具體的fuzzer工具。在使用fuzzer對目標的某些脆弱點進行測試的同時,用一個Debugger工具將目標掛起,從而當有錯誤發生時,將會被Debugger捕捉到,這樣就能夠藉助於Debugger具體調試目標程序。