序
網絡空間安全已是世界各國關注的重要戰略問題,各國政府、學術界、產業界都投入了大量的資源來改善網絡空間安全狀況,發展網絡空間安全防護手段。為適應網絡技術和應用的快速發展,各種新的安全技術、安全產品、安全方案層出不窮。當前網絡系統中,從不同層次、不同角度實現的安全產品已廣泛應用,但從近年來曝光的各類安全事件來看,各種攻擊手段仍然防不勝防。究其原因,軟件漏洞及其利用是攻擊成功的關鍵,也是系統防御的難點。
“千丈之堤,以螻蟻之穴潰;百尺之室,以突隙之煙焚。”縱然我們有完美的安全模型和設計方案,但在這些方案的實現中,開發人員的疏忽或個別技術的缺陷都可能引入軟件漏洞,讓整個方案失效,甚至直接威脅整個系統的安全。2010年,震網蠕蟲利用7個軟件漏洞成功突破了伊朗核電站的物理隔離網絡,造成嚴重破壞;2011年,攻擊者利用漏洞成功滲透進入了著名的安全公司RSA公司的內部網絡,并竊取了大量敏感信息;2015年,以擅長攻擊著稱的黑客團隊Hacking Team的內部網絡遭受攻擊,大量的漏洞利用代碼、內部研討資料等敏感數據泄露。這些案例都給我們敲響了警鐘,無論多么安全的防護方案都有可能因為“小小的”軟件缺陷而被徹底突破。
近年來,各類安全事件的曝光讓人們越來越關注軟件的安全性問題。各類軟件漏洞挖掘的高手也成為業界的寵兒,但隨著軟件復雜性的增加以及漏洞和漏洞利用模式的變化,僅僅依賴于少量有個人天賦的高手已經遠遠不能滿足現實的需求。利用先進的技術方法來解決軟件安全問題,一直是學術界、產業界共同關注的焦點問題,也是當前的一大難點問題。
2016年,美國國防部組織的DARPA CGC比賽(Cyber Grand Challenge)更是將軟件漏洞的自動化發掘、分析、利用、防御技術研究推向高潮,DARPA組織該比賽的初衷之一也是為了吸引更多的社會資源關注、參與該問題的技術研究工作。這次比賽吸引了眾多高校、科研機構和企業團隊的關注。最終,來自卡耐基·梅隆大學的ForAllSecure團隊獲得第一。雖然CGC比賽中的場景設定與實際情況有很大差距,但這次比賽驗證了自動化攻防的技術可能性,代表了未來的技術發展方向。隨著未來軟件技術的發展和廣泛應用,軟件安全問題將越來越突出,因此,發展新的軟件安全技術是未來的主要發展方向。
我國是軟件產業大國,也是軟件應用大國。在軟件安全方面面臨的問〖1〗軟件安全分析與應用題尤為突出。究其原因,一方面是由于我國大量的軟件產品,尤其是操作系統、數據庫等基礎軟件產品依賴于國外廠商,我們不得不面對軟件廠商不可信的現實問題;但更重要的是我們目前在軟件產品安全方面的審查能力仍很薄弱,缺乏有效的技術手段對軟件產品的安全問題實施監管。針對軟件安全問題,我國相關部門和機構做了大量的部署,取得了一系列的成果和突破。在軟件安全檢測、軟件漏洞分析等方面形成了一系列成果,大量成果也已經成功轉化,為提升我國網絡空間安全保障能力發揮了重要作用。
但軟件安全問題是典型的對抗性問題,面對我國軟件產業的快速發展,當前軟件安全技術和成果仍遠無法滿足現實的需求。高技術對抗需要高技術手段支撐,從2016年的DARPA CGC比賽可以看出,污點傳播分析、符號執行等以前主要在學術研究工作中采用的方法和技術已逐步可支撐一系列軟件安全分析實踐工作,如何進一步推進相關方法和技術的實用化是當前學術界和工業界共同關注的焦點問題。
本書作者蘇璞睿研究員及其團隊十多年來一直從事軟件安全研究工作,曾主持了國家863計劃、國家自然科學基金、國家科技支撐計劃等一系列國家重點任務的攻關工作,在軟件安全方面取得了一系列技術突破,在動態污點傳播分析、惡意軟件分析與檢測、軟件漏洞分析與利用等方面有重大創新與積累,主持研制了惡意軟件分析檢測系統、軟件漏洞分析系統等多項成果,在軟件安全方面具有豐富的研究和實踐經驗。
本書由他和他的團隊根據多年的研究積累和實踐凝練而成,從基本概念、方法原理、重要工具系統和關鍵應用場景等不同層面對目前國內外的軟件安全分析相關技術和方法進行了系統的總結和梳理。本書兼顧了學術研究前沿技術方法和相關技術方法在工程實踐中的應用,既剖析了軟件安全分析中常用的動態污點分析、符號執行等基礎方法,也結合真實應用場景和實際案例,闡述了相關技術方法在軟件漏洞分析與利用、惡意軟件分析、協議逆向分析等多個具體問題中的應用。
本書是軟件安全分析方面一本難得的理論與實踐緊密結合的書籍,我愿意把它推薦給從事軟件安全研究與實踐的科研人員、研究生和技術人員。
2017年9月于北京前言軟件的應用已經滲透到社會的方方面面,承載著重要的社會價值。軟件開發過程無法做到完美,軟件問題與漏洞難以避免,軟件也成為攻擊者的重要目標。當前曝光的各類網絡安全事件中,絕大部分都與軟件安全問題相關,軟件安全問題已成為關乎個人利益、社會穩定、國家安全的重要問題。
軟件安全問題中的軟件漏洞和惡意軟件是兩大經典問題,前者是由于軟件設計開發過程中的缺陷帶來的安全隱患,后者則是攻擊者有意設計的具有破壞性的軟件工具。軟件自身越來越復雜,規模越來越龐大,軟件漏洞模式、利用方式也越來越多樣化,這就對軟件漏洞的發現、分析與評估等工作帶來了一系列的挑戰;而惡意軟件自身的技術也在不斷發展,出現了各種自我保護技術、隱蔽通信手段等,這也對惡意軟件的分析和處置提出了新的要求。無論是軟件漏洞分析還是惡意軟件分析,軟件自身的復雜性已經超越一般技術人員的分析能力和理解能力,復雜軟件的深度分析能力是軟件漏洞分析和惡意軟件分析共同面臨的瓶頸問題。
如何提高對復雜軟件的深度分析能力,并針對具體的應用場景,設計相關的分析、檢測方法,一直是軟件分析領域乃至信息安全領域關注的焦點問題。特別是考慮到很多軟件系統無法獲得源代碼的現實,如何實現不依賴于源代碼的軟件深度分析是近年來的研究熱點。
面向軟件安全問題,本書總結了一系列軟件分析基礎性方法,并重點介紹了軟件安全分析工作中的典型場景和相關技術手段。考慮到技術內容的完整性,書中也對當前常見的成熟工具(如反匯編工具、調試工具等)和相關基礎知識(如Intel指令集、操作系統內核等)進行了簡單介紹。
本書的寫作主要由中國科學院軟件研究所可信計算與信息保障實驗室(TCA實驗室)的信息對抗與網絡保障團隊共同完成,本書的撰寫也是該團隊對相關技術方法和研究進展的總結。該團隊于2004年由馮登國研究員創建,后來由我組織。2004年底,團隊開始關注基于硬件虛擬化的惡意軟件分析;2005年底,組織開發了第一個基于開源系統QEMU的惡意軟件分析系統,當時命名為WooKon(取音“悟空”);2010年,面向惡意軟件檢測需求,在WooKon系統的基礎上推出了基于硬件虛擬化的APT(Advanced Persistent Threat)攻擊檢測引擎,并在多個部門和機構成功應用,2017年我們根據新的需求與新的形勢又推出了金剛惡意軟件智能分析系統;從2006年起,開始關注將動態污點分析應用于惡意軟件分析和漏洞分析的相關研究,〖1〗軟件安全分析與應用前言[3]〖3〗經過多年研發和逐步完善,2010年研制了第一套基于硬件虛擬化的動態污點分析系統——AOTA系統(ApplicationOriented Analysis System),并成功應用于漏洞利用自動生成研究;2013年構建了一個多樣性漏洞利用自動生成系統——PolyAEG系統。
我們的工作也得到了一系列國家科技項目的支持。團隊在最初建立的很長時間內沒有得到相關項目的支持,在此要感謝時任信息安全國家重點實驗室主任馮登國研究員的大力支持,保證了團隊研究工作的持續發展。2006年團隊的工作獲得了第一個國家863計劃項目“惡意代碼機理分析與特征提取技術研究”,此后得到了國家自然科學基金、國家科技支撐計劃、國家信息安全產業化專項等一系列項目的支持,也在相關項目的支持下完成了從基礎方法、關鍵技術、原型系統到成果轉化的科研過程。
軟件分析理論博大精深,軟件安全問題錯綜復雜,因作者能力和精力所限,難于對相關技術和方法進行全面、系統的總結。因此,本書主要對使用較多的程序切片、污點分析、模糊測試、符號執行等方法進行了介紹,并對惡意軟件分析、協議逆向分析、軟件漏洞分析、Android應用安全性分析等方法和技術進行了總結。
團隊多位同事和同學參與了本書的寫作或給予了支持和幫助。第1章黃樺烽提供了一系列案例素材;第2、3章由黃樺烽主要負責編寫;第4章由閆佳博士主要負責編寫;第5章由王衍豪博士主要負責編寫,賈相堃博士負責修改校對;第6章由聶楚江博士主要負責編寫;第7章由和亮博士主要負責編寫;第8章主要由應凌云博士負責編寫,聶眉寧博士協助提供素材;第9章主要由楊軼博士負責編寫,閆佳博士協助修改校對;第10章由閆佳博士負責編寫,閆佳博士協助修改校對;第11章由應凌云博士、谷雅聰博士、路曄綿博士及婧二霞共同完成。
本書的編寫得到了國家自然科學基金項目“安全協議實現的逆向分析與安全評估方法研究”(NSFC: 61572483)、“面向應用商店的移動智能終端惡意軟件檢測關鍵技術研究”(NSFC: 61502468)、“虛擬化混淆代碼逆向分析方法研究”(NSFC: 61502469)等項目的支持,在此表示感謝!
本書的編寫得到了馮登國研究員的指導和幫助,馮老師不僅對書稿內容的組織、編寫大綱等給予了指導,還審閱了全部書稿,提出了寶貴的修改意見。同時,本書最終得以出版,與馮老師長期對我們團隊發展的支持是分不開的,在此對馮老師長期的支持和幫助表示衷心感謝!
多位專家、同行的真知灼見也對本書的形成提供了重要參考,在此一并表示感謝!另外,本書初稿曾作為中國科學院大學2016年春季課程講義,課上多位同學也對講義提出了寶貴的修改意見,在此一并表示感謝!
由于本書涉及內容較多,編寫時間倉促,書中難免存在疏漏和不足之處,懇請廣大讀者提出寶貴的意見和建議,以便我們不斷改進和完善本書的內容。
蘇璞睿于中國科學院軟件研究所
2017年8月
第5章符 號 執 行符號執行技術在1976年由Jame C.King提出\[1\]。20世紀70年代,關于軟件正確性測試的研究工作都基于一個原則: 選擇合適的測試用例對程序運行狀態進行測試,如果對于提供的輸入都能產生正常的結果輸出,則認為程序是可靠的。其中的方法可分為兩大類。一類是以模糊測試為代表的隨機性測試,雖然模糊測試等隨機測試方法至今仍活躍在軟件安全測試的一線,但其具有的盲目性和隨機性使其無法提供完整可靠的測試結果。另一類是以模型檢測為代表的形式化證明方法,通過歸納法來證明程序是否具有期望的性質,證明過程的復雜性使其在面對大規模程序的時候幾乎不可用。正是在這樣的背景下,James C.King提出了符號執行方法,可以將其看成是上述兩類傳統方法的折中。King希望在無法獲取程序特性說明等信息的情況下,仍舊能夠對其進行快速全面的自動化安全性檢測。本章將對符號執行的基本方法進行介紹。
5.1符號執行基本模型〖*4/5〗5.1.1基本思想符號執行的基本思想是: 使用符號變量代替具體值作為程序或函數的參數,并模擬執行程序中的指令,各指令的操作都基于符號變量進行,其中操作數的值由符號和常量組成的表達式來表示。
對于任意程序,其執行流程是由指令序列的執行語義控制的,執行語義包括: 變量定義語句對數據對象的描述,聲明語句對程序數據對象的修改,條件語句對程序執行流程的控制。當程序的輸入參數確定時,其指令序列被固定下來,因此程序執行語義和控制流也就得到確定。如果不用具體數值,而是用符號值作為程序的輸入參數,則指令序列的操作對象就從具體數值變為了符號值,程序的執行語義和控制流程也變成了和符號變量相關的符號表達式。讀者可以將符號執行視為程序具體執行的自然擴展,符號變量使得程序執行語義變得不確定,這也使得符號執行技術在理想情況下可以遍歷程序執行樹的所有路徑。也可以將程序的一次具體執行視為符號執行的一個實例,當需要對某條程序路徑進行遍歷分析時,只需根據符號執行方法對該路徑的分析結果,就可以引導控制流遍歷該路徑的程序輸入。
King\[1\]在提出符號執行技術的同時,也為其限定了理想的使用場景:(1) 理想模型中程序只處理有符號整數,在實際測試中這種情況不會出現。〖1〗軟件安全分析與應用第5章符號執行[3]〖3〗(2) 理想模型中假定程序“執行樹”的規模是有限的,在實際測試中,由于程序中存在的循環等原因,很多程序的“符號執行樹”可能是無窮大的。
(3) 理想模型中符號執行技術可以處理程序內所有if條件語句中的約束表達式,在實際測試中,約束表達式中通常會出現符號執行引擎無法處理的操作和變量類型。
5.1.2程序語言定義基于符號執行技術的理想場景對程序語言做如下定義。
(1) 程序變量類型: 程序中只包括有符號整數類型。
(2) 程序語句類型: 簡單的聲明語句,例如,a=3。
if條件語句(包括then和else),例如if(a<0),假定程序內所有if條件語句中的表達式都可以化簡為{arith.expr.}≥0的形式,例如-a-1≥0。
無條件跳轉語句,例如goto語句。
變量操作語句,例如讀操作(read)。變量處理操作符中只包含基本的整數運算操作,例如加、減、乘(+、-、*)。