鄭昌偉



摘 要:信息安全中的各種問題的產生原因之一就是軟件漏洞。所以對于軟件安全漏洞的分析慢慢成為信息安全研究部門及其相關領域非常關注的問題。本文以此為切入點,先闡述了軟件安全漏洞的各種分析方法,并對其中的一些具體分析方法的利弊進行詳細地闡述,然后根據實際情況介紹了軟件安全漏洞分析中的核心問題,最后根據這些核心問題針對性地提出了軟件安全漏洞分析方法的未來發展趨勢,以期為研究本課題的學者們提供理論參考。
關鍵詞:信息安全;軟件漏洞;漏洞分析;發展趨勢
DOI:10.16640/j.cnki.37-1222/t.2017.03.230
1 軟件安全漏洞的分析方法
為了更好地保證軟件質量和提高信息安全力度,就需要對軟件漏洞進行嚴格地分析,軟件漏洞分析內容一般和軟件的生命周期息息相關:軟件設計時期,需要對軟件的整體架構進行分析,以此避免設計架構中的錯誤風險;軟件開發時期,需要對軟件的源代碼進行分析,以便及時發現編碼中的錯誤并進行修改;軟件測試時期,需要對軟件的執行代碼進行分析,以發現其中或許會出現的運行故障,及時對其使用特別措施。
1.1 漏洞分析方法類別
參考軟件的特征和漏洞形式以及固有的軟件分析技術,軟件漏洞分析被分為架構分析、靜態分析、動態分析、動靜結合以及漏洞定位等五種技術方法,如圖1所示。
由圖1的漏洞分析技術體系可以看出,軟件架構分析過程中,一旦發現架構和設計中的錯誤,應立即反饋給設計人員進行修改;靜態分析和動態分析的目標就是保證源代碼和可執行代碼的正確性,根據分析規范來找出其或許會出現的安全漏洞,二者合在一起使用可以更好地提高查詢和分析效率;漏洞定位方法通過對于漏洞的定位追蹤來分析出漏洞的各種屬性。以上幾種方法可以發現和分析軟件各種形式的漏洞。
1.2 軟件架構分析
研究表明,軟件中有二分之一到四分之三的問題都發生在設計時期,發現的時間越晚,就需要投入更多的資金對其進行修復,所以對設計時期的軟件架構進行分析顯得至關重要,具體分析原理如圖2所示。
根據圖2可以發現,在分析軟件架構時,要先對架構建模,檢查其模型能否符合相關的安全要求,對于不滿足要求的架構需要按照要求重新設計。一般情況下會使用一樣的規范來構造軟件架構和安全需求,以便更加快速地通過檢查。
國內外對于軟件架構的分析原理研究主要總結出形式化和工程化兩個類別,形式化分析根據形式化的技術來分析安全規范和軟件架構,這種方法可以實現自動化的分析結果且比較精確,但是沒有一定的實用性;而工程化分析站在攻擊者的視角來分析軟件的各種風險,比較實用但是不能完全自動化。
1.3 靜態分析
在軟件不運行的時候對其進行分析就是代碼靜態分析,其分析內容一般是可執行代碼和源代碼。靜態分析能夠非常具體地根據執行路徑的提示來找出安全漏洞。具體原理如圖3所示。
根據圖3可以發現,模型構造、根據軟件和漏洞來進行的模式匹配以及模式提取等模塊構成了代碼靜態分析的全部內容。經過長時間的研究和探索,各種靜態分析方法都有了非常大的發展。其中,詞法分析的方法可以非常迅速和精準地找到軟件里面的危險函數,但是因為其不分析語義層面的內容,所以最終不能很好地發現更多復雜的安全漏洞;數據流分析的方法可以用來分析像常數傳播和存訪問越界這類操作相對單一的問題,而對于一些操作復雜的問題則顯得不太實用;符號執行的方法可以找出軟件中難以發現的邏輯問題,相對其他靜態漏洞分析技術來說更加有效率,但是執行程序的路徑也會因為程序的規模大而隨之增加,一定程度上會造成空間爆炸的現象,同時,符號執行的方法雖然能夠發現問題,但是沒有解決問題的能力,需要借助相應的求解工具來對其進行解決;模型檢查的方法可以自動并精準地分析出軟件的狀態和路徑,但是因為詳細地羅列了所有或許會出現的狀態,在數據密集度比較大的情況下也增加了分析的工作量;定理證明的方法因為采用了非常嚴密的推理來控制整個分析過程,所以在以上靜態分析方法中是效率最高的方法,但是定理證明方法的自動化能力還需要進一步提高,執行過程中需要浪費大量的人力,同時對于各種漏洞沒有一定的延展性,所以在比較大型的軟件程序中不適合采用此種方法;污點傳播方法可以把攻擊的全部過程完整地模擬和展現出來,但是它只能用在輸入驗證類的漏洞分析之中。
1.4 動態分析
代碼的動態分析是參考運行程序中的內部形態和輸出信息來確認和發現軟件性質問題的過程,動態分析的內容是可執行代碼。因為得到了運行中的實際信息,所以發現的漏洞相對來說比較精準。代碼動態分析的原理就是根據特殊的運行軟件來運行其程序,如果出現崩潰和死機則證明了存在漏洞的風險,具體原理如圖4所示。
分析圖4可知,軟件的運行環境對于待分析軟件有著非常直接的影響,軟件的停止、啟動以及輸出獲取都能使得待分析軟件出現相應的漏洞,根據輸出數據來發現和找出相應的運行故障,如果輸入數據比較多,則應該為留下漏洞有關的信息而過濾掉其他的輸出信息,現階段的代碼動態分析方法涵蓋了模糊測試、智能模糊測試以及動態污點分析等幾種方法。其中,模糊測試對于漏洞的查找和分析非常有用,可以幫助設計者找到很多潛在的漏洞,缺點就是該種方法在分析數據的時候具有一定的隨機性,沒有充分覆蓋所有的代碼,所以在很多情況下會出現錯報和漏報的情況,如果測試數據相對獨立,這種方法則更難找出復雜的漏洞;智能模糊測試相對其他方法來說更加具有針對性,所以分析的精準度會更加高,不足之處是因為靜態分析的加入導致了分析的難度也隨之加大,所以是否使用該方法,就要先考慮效率重要還是準確率重要的問題;動態污點分析被非常普遍地用在隱私泄露分析、漏洞分析以及惡意代碼的分析之中,但是這種分析方法一般需要可執行代碼分析方法的互相配合才能使用,而可執行代碼的分析技術又有類型信息和應用語義信息不全等各種問題。
1.5 動靜結合分析
動態分析方法因為得到了實際運行中的信息,所以發現的漏洞相對來說更加正確,沒有誤報和錯報的情況;靜態分析方法因為非常具體地執行了各種路徑,所以其錯報和漏報的可能性比動態分析方法少。一些特殊情況下,分析者會為了各取所長而使用動靜結合的方法對漏洞進行發現和分析,現在使用比較多的動靜結合漏洞分析方法主要涵蓋了三大類別:第一類是通過靜態的方法分析源代碼來找出其中或許會存在的漏洞,后根據輸入數據來動態地檢驗這些漏洞是否真實存在。這類技術的使用頻率比較高,但是因為其過分關注靜態分析方法對于動態分析方法的指引作用,經常會導致了動態分析方法中出現的有用的運行內容被忽略的情況發生;第二類是反匯編可執行的代碼,通過靜態分析匯編代碼的詳細資料來執行動態漏洞分析內容。這種方法調整和完善了已有的污點分析方法,不足之處就是其對可執行代碼反匯編得到的匯編代碼沒有全面的語義信息,使得其不能非常好地對可執行代碼進行跟蹤處理;第三類是動態運行待分析軟件的同時查找其運行內容,在匯編代碼的基礎上執行靜態分析方法。這種方法非常全面地關注到了運行內容,但是其發展時間太短,現在還處于被研究的時期。
1.6 漏洞定位
在代碼之中找出和確認漏洞出現的地方,根據漏洞的發生原因來正確評價可用的利用方法和風險級別的過程叫做漏洞定位。上面描述過的各種方法中也涵蓋了漏洞定位的分析內容。在架構分析的過程中,應該對找出的設計漏洞進行追溯跟蹤,以此找出產生問題的軟件信息和不正確的結構內容;在靜態分析方法中,對找出的漏洞采用一些方法對其進行確定,目前使用的靜態漏洞查找工具一般都能夠自動生成出發路徑和輔助查找的相關圖形,以此更加方便地對漏洞的產生原因進行追溯分析;在動態分析方法中,可以從很多的軟件運行狀態內容和輸出數據信息中找出相對應的漏洞,然后根據動態分析原理對其進行過濾和追溯。現階段的漏洞定位方法一般在可執行代碼中使用,涵蓋了動態調試、逆向分析以及指令追蹤等方法。其中,動態調試一般用來查找和定位漏洞,其分析內容是可執行的代碼,動態調試方法通過觀察調試器中運行軟件的內存使用、寄存器值以及軟件運行狀態等信息來完成,在調試的過程中,用特定的輸入信息來跟蹤和分析出運行時寄存器狀態、函數調用路徑以及堆棧可能會出發的漏洞信息,以此來精準定位軟件中的漏洞,目前使用得非常多的一個動態調試工具是OllyDbg;逆向分析方法需要先反匯編可執行代碼,以此來得到匯編代碼,后掃描這些匯編代碼來找出可能會出現問題的代碼序列,從而精準地找出漏洞位置,非常有名的分析工具是IDA Pro;指令追蹤方法能夠實現精準和快速定位漏洞的目的,運用該方法時,應該按照正常情況來運行軟件,把軟件執行的全部指令序列一一記錄下來,后使用一些方法來觸發漏洞,把漏洞被觸發時所執行的指令序列詳細記錄下來,把兩次記錄的指令序列進行對比,從對比中找到兩次執行過程中出現的不同代碼區并對其進行逆向分析,再對這些不同代碼區的代碼進行動態運行和調試跟蹤,以此來發現漏洞函數。現在用得非常多的指令追蹤工具有Valgrind和PIN等。
2 軟件安全漏洞分析中的核心問題
經過一段時間的探索和研究,軟件漏洞分析方法有了非常大的發展,但是還有一些非常核心的問題需要分析和解決,筆者根據調查研究及查閱相關資料和文獻,找出了軟件漏洞分析領域中存在的典型問題,下面從技術難題、科學難題和工程實現三個方面對其進行分析和研究。
2.1 技術難題
首先,對于精確度的判斷問題,相關研究人員應該找到更多精準的分析方法來提高對于漏洞的分析能力。比如,現在常用的漏洞分析的簡單技術就是按照分析精度來分類的,從單一的語法匹配、流敏感分析以及流不敏感分析方法慢慢演變為路徑敏感的分析方法,這些分析方法的不斷變化和改進也提高了漏洞分析的深度和精度。而因為核心算法的時間空間復雜度的提升速度非常迅速,這就一定程度上導致了計算機資源消耗量呈現幾何級別的趨勢不斷增加,比如路徑敏感分析所導致的路徑爆炸現象。所以,持續提高漏洞分析的深度和精度的能力的同時,也應該在條件允許的時間和資源中達到資源消耗和漏洞分析程度之間的平衡,這一點是漏洞分析中亟待解決的技術難題。
其次,智能化的提升是另外一個技術難題。軟件安全漏洞分析工作對于技術程度和智力水平都有非常高的要求。現階段的漏洞分析領域也有很多的相關方法和工具,讓人們享受軟件自動化的同時也解放了雙手和大腦,而因為這些漏洞分析方法的智能水平還需要一定程度的提高和優化,很多情況下更多的是分析人員對其分析結果和漏洞定位結果進行反復地核查和檢驗,這就浪費了更多的人力和時間。比如靜態分析方法一般會根據已找出的漏洞的特點來進行分析,而動態分析方法一般根據漏洞的異常輸入和攻擊信息來進行分析。提取和總結這些分析結果需要耗費更多的時間和人力,只有完全提升漏洞分析工具的智能程度,才能完全解決這些問題。
2.2 科學問題
首先,軟件模型的構建問題。軟件漏洞分析的內容一般是可執行代碼和源代碼,對這些代碼進行分析的前提是先對他們進行建模,也就是把軟件轉變為中間表示,然后在其基礎上進行半自動和自動的分析。分析者一般會使用圖型和樹型的結構來構建軟件模型。需要根據不同的漏洞分析方法來使用不同的模型結構,比如控制流和抽象語法樹等模型在以前的漏洞分析中比較常見,而近期的分析者一般會采用統一中間表示來對軟件的可執行代碼和源代碼進行建模。而現階段的軟件建模技術一般根據程序編譯優化方法來構造,所以很多中間表示不是針對某一種漏洞進行分析的。因此,相關人員應該更加具體地研究和分析出針對漏洞分析的軟件建模技術,讓其模型可以更加具體地表現出軟件以安全特性為代表的各種屬性,最終使得漏洞分析的準確度得到大大的提高。
其次,漏洞模式提取問題。漏洞的分析效果通常用漏洞模式提取作為評價指標來進行判斷。現在見得比較多的漏洞模式有適合危險函數調用分析的語法結構模式、適合污點傳播分析的格與不動點模式以及適合類型安全分析的類型約束模式等,同時,在檢驗模型的時候,漏洞模式一般被說成是時序邏輯公式,現在常用的漏洞模式具有非常粗的描述力度,不能具體全面地描述漏洞性質和其運行的上下文內容,因此會出現非常多的誤報現象。所以,相關研究人員應該分析和找出更實用的漏洞模式提取技術,讓漏洞模式可以非常精準地表示出漏洞的靜態和動態屬性,以此幫助分析者更準確地找出漏洞的構成原理,最終使得漏洞分析自動化的同時能夠提高漏洞分析的精準度。
最后,技術極限求解問題。無論是軟件漏洞分析領域還是其他的研究領域,在研究到一定程度的時候都會出現極限問題,也就是在能夠接受的空間、成本以及時間范圍內,可以發現和分析出的漏洞特點和類型、漏洞分析的精準度和覆蓋范圍以及可以達到漏洞分析檢驗標準的安全特點和種類等問題。通過歸納和分析現有漏洞分析方法來尋找出現有的不全面的技術體系和技術極限之間的關聯,然后通過結合各種分析方法、運用具有一定限制性的程序語言、調整分析軟件的架構等各種方法,找出以上描述的極限問題相關的解決辦法。
2.3 工程實現
首先,大規模軟件漏洞分析的實現問題。現階段的軟件漏洞分析工具并沒有因為軟件的規模和復雜性不斷增加而隨之進步,大部分的軟件漏洞分析工具都是傳統的根據單一引擎和單機來進行分析的,其速度不快且效率不高。使用分布式并行的分析方法可以非常顯著地提高漏洞分析效果,比如現在的使用非常多的分布式并行方法的模糊測試工具、采用了并行化的符合執行系統以及并行化過程的程序分析工具等,都很好地體現了其漏洞分析的能力,但是因為此方法的應用時間比較短,現在還在研究和探索的時期,所以不能非常具體地體現出工程應用的效果,所以,相關的研究者應該投入更多的經歷來調整和改進漏洞分析的算法,力求在短時間內構建出針對漏洞分析的分布式算法,以此根據分布式系統和多核硬件架構的性能特點來協調各種算法模塊在運行時出現的動態協同等問題,以此提高對于復雜類型的軟件的漏洞分析能力。
其次,新型平臺上的漏洞分析的實現問題。數字時代的迅猛發展衍生出了以IOS和Android操作系統為代表的移動終端平臺的迅速發展。在這些操作系統的基礎上構建出了網銀、支付寶、電子商務、各類社交軟件、在線游戲以及影音咨詢等應用軟件,這些應用軟件也慢慢變成漏洞分析的重要部分。這些應用軟件的開發和設計一般是基于Dalvik虛擬機和ARM架構來實現的,而現在用的比較多的漏洞分析工具是針對Linux和Windows操作系統以及X86和X64結構的程序軟件,二者是兩條平行線,不能拿來使用。所以,應該在云服務平臺和智能操作系統等相關領域中找尋到其能適用的漏洞分析方法,并通過這些方法來開發和設計出相對應的漏洞分析工具。
最后,安全測評中的漏洞分析問題。國內現階段的安全測評主要是根據國家通用的信息安全測評準則來進行的,準則中很多內容都涉及到系統功能的安全性以及如何實現這些安全性等部分,而對于系統功能安全性的具體測試方法和工具沒有詳細的說明,沒有實際的操作意義,而對于軟件安全漏洞類的分析內容幾乎沒有,所以,國內的信息安全部門應該根據實際情況來制定軟件漏洞的安全評測規范,以此指導相關分析者對漏洞進行預防、發現以及彌補。比如對幾個有類似安全需求的軟件系統的各種變體中,在特殊的上下文條件下,通過漏洞分析方法找出其可能具有的漏洞的特點并對比他們的安全性。實現這一點的基礎就是具有漏洞分析相關的具體度量規范,使相關分析者能夠根據規范來客觀全面地體現軟件的安全性,也以此來表現軟件安全測評的重要性。
3 軟件安全漏洞分析方法的未來發展趨勢
(1)研究核心技術問題來突破現有的漏洞分析方法。相關技術研究人員應該根據實際情況,采用一切能夠使用的方法來找出合適的算法以提高漏洞分析的精確度,只有漏洞分析方法更加精確和高效,才能從根本上減少人力和時間成本。可能調整和完善了的漏洞分析技術還是無法從根本上達到資源消耗和分析精確度之間的平衡,但是相關技術人員可以把分析的對象放在安全敏感范圍以內研究,盡量在不影響分析精確度的同時,最大限度地降低資源損耗。除此之外,大力展開對于漏洞分析智能化水平的研究和探索,找出合適的漏洞分析的自動獲取辦法,以此來完全解決人工在漏洞查詢中出現的不準確性和復雜性問題的現象。
(2)分析更深層次的科學問題來實現漏洞分析技術的變革和創新。相關技術人員應該與時俱進,及時地學習和掌握最前沿的科學方法,加強研究漏洞提取模式和漏洞分析的程序建模等內容,力求在短期內建造出統一的建模來全面具體地表現和描述漏洞模式,以此幫助構建規范的漏洞查找規則,同時也方便展開對于漏洞分析自動化技術的研究。同時,相關技術人員應該根據實際情況來探索和找出漏洞分析技術體系的極限問題,將現有分析技術的不足之處和技術極限聯系起來進行分析,以此找到產生技術極限的根本原因,為實現漏洞分析技術的變革和創新奠定基礎。
(3)分析和解決工程問題來實現漏洞分析技術的實際應用。現在的漏洞分析領域中亟待解決的工程難題就是實現漏洞分析方法的規模化和自動化。建議相關技術人員根據現有的并行算法來研究和探索分布式并行化漏洞分析方法,以期在最短的時間內實現可靠的漏洞分析技術,以此來實現工程應用的規模化。同時,為了跟上數字化時代背景下迅猛發展的信息技術,對于漏洞分析方法的研究應該更加具有針對性,可以針對云計算和互聯網在內的新型平臺來研究具體的漏洞分析方法,并根據其方法來設計和開發對應的漏洞分析工具。除此之外,保證安全漏洞分析方法和技術的順利施行的關鍵在于安全度量規范,可以建立完善的安全評測方法來保證漏洞分析方法和技術的正常實現和運行。
4 小結
綜合以上描述內容,筆者參考軟件的生命周期各個階段的特性和其分析內容,把現有的漏洞分析技術劃分為軟件架構分析、靜態分析、動態分析、動靜結合分析以及漏洞定位方法等五類,表明了漏洞定位方法在整個漏洞分析技術體系中的核心位置,同時具體分析了每一個方法的優點和不足,以期為相關技術人員在選擇漏洞分析方法時提供具體的理論參考。文中也提出了軟件漏洞分析領域中存在的技術難題、科學難題以及工程問題等,以期相關技術人員能夠在未來的研究和探索中以此為重點研究對象,盡快找到軟件安全漏洞分析技術中關于這些核心難題的解決辦法。
參考文獻:
[1]和亮,蘇璞睿.軟件漏洞自動利用研究進展[J].中國教育網絡,2016(Z1).
[2]劉紅霞.新形勢下計算機網絡安全與漏洞掃描技術分析[J].信息與電腦(理論版),2015(24).
[3]趙喜明.計算機網絡安全與漏洞掃描技術研究[J].網絡安全技術與應用,2014(01).
[4]韋韜,王貴駟,鄒維.軟件漏洞產業:現狀與發展[J].中國信息安全,2010(01).
[5]劉崯杰.試談軟件漏洞的分類[J].電腦編程技巧與維護,2011(12).
[6]鄭晶.計算機軟件漏洞與防范措施的研究[J].吉林農業科技學院學報,2010(02).
[7]曾霞,周四清.軟件漏洞發現概率及最優投入水平的研究[J].計算機工程,2010(12).
[8]陳鑫,崔寶江,范文慶,鈕心忻.軟件漏洞的攻擊與防范[J].電信科學,2009(02).
[9]韋韜,王貴駟,鄒維.軟件漏洞產業:現狀與發展[J].清華大學學報(自然科學版).2009(S2).
[10]王穎,李祥和.軟件漏洞的分類研究[J].計算機系統應用,2008(11).
[11]李淼,吳世忠.軟件漏洞起因的分類研究[J].計算機工程,2006(20).