田楠++蒲江



摘 要:軟件動態防御技術是指通過動態更改軟件自身及其執行環境,改變軟件同質化現象,減少攻擊者利用軟件漏洞造成大規模攻擊的一種技術手段。論文綜述了目前常見的軟件動態防御技術,包括地址空間隨機化技術、指令集隨機化技術和多變體執行技術等,介紹了各技術手段的研究現狀和技術原理,分析了針對各類攻擊的效能和存在的不足,最后對各種技術手段進行總結,并對軟件動態防御技術的發展提出展望。
關鍵詞:軟件漏洞;軟件動態防御;技術原理
中圖分類號:TP311.5 文獻標識碼:A
1 引言
在信息安全攻防對抗中,軟件始終處于重要位置。由于軟件漏洞不可避免,導致軟件防御相對于攻擊存在嚴重的不對等性,而軟件的同質化現象更加劇了這一不利局面。現有的主流防護技術仍以靜態的、被動的防護為主,難以應對日新月異、快速變化的攻擊技術。
軟件動態防御作為一種新興的安全理念,其主要思想是以密碼技術、編譯技術、動態運行時技術等為基礎,對程序代碼在控制結構、代碼布局、執行時內存布局以及執行文件的組織結構等多層面進行隨機性、多樣性和動態性的處理,增加攻擊者發現漏洞、利用漏洞的成本,有效抵御針對代碼缺陷的外部代碼攻擊。
軟件動態防御技術可以應用于軟件生命周期的各個階段。在編譯與鏈接階段,主要通過修改編譯器實現動態化,通過添加、變換和去除現有指令,產生具有相同運行效果的程序變體。在載入階段,可以通過動態加載機制實現軟件動態化,目前主要有地址空間隨機化、指令集隨機化等技術。在運行階段,主要通過構建二進制動態執行環境實現軟件動態化。本文將分別對地址空間隨機化技術,指令集隨機化技術和多變體執行技術進行介紹,最后做了總結和展望。
2 地址空間隨機化技術
2.1 基本原理
地址空間隨機化技術是為了解決緩沖區溢出攻擊而提出的,也是目前最成功且使用最廣泛的軟件動態化技術[1,2]。緩沖區溢出攻擊時,攻擊者需獲知進程的地址空間,然后通過計算,利用溢出操作將程序的執行流程跳轉到攻擊代碼處[3,4]。地址空間隨機化技術的基本思想是對進程組件和對象的內存地址空間分布進行隨機化,使進程空間不可預測,導致攻擊者無法計算出準確的跳轉位置,從而阻斷攻擊。
如圖1所示是地址空間隨機化技術的示意(以棧溢出攻擊為例),若緩沖區地址固定,攻擊者可以預先得出攻擊代碼的地址,將其覆蓋到某函數返回地址的位置,使函數返回時跳轉到攻擊代碼的位置執行,采用地址空間隨機化技術,使攻擊代碼的地址偏移隨機長度,攻擊者無法準確跳轉到攻擊代碼的位置發起攻擊。
2.2 技術手段
棧、堆、字符串等空間常作為緩沖區溢出攻擊的對象,對這些緩沖區進行隨機化,發展出多種地址空間隨機化技術。
棧空間隨機化主要是隨機改變程序中每個函數棧幀的大小和位置。改變棧幀的大小是通過在編譯時定位出函數,并在函數頭部增加一段隨機填充棧幀的代碼實現。改變變量位置則是通過在編譯或加載時隨機調整函數中變量的順序,使變量地址隨機改變。棧空間隨機化效果如圖2所示。
2.3 研究現狀
2000年,地址空間隨機化率先在Linux內核PaX補丁中得到成功應用[5],通過為Linux內核打補丁,實現了對棧基地址、主程序基地址以及共享庫加載地址隨機化。此后,在大部分主要操作系統中都有所使用,包括Windows(2007年首先使用于Windows Vista,后來用于Windows Server 2008和Windows 7)、Linux(2005年以后在Linux內核中包含了一部分,在后來的Linux加強版中有更完整的實現)及MacOS(OSX 10.5之后版本)。
2.4 效能與不足
地址空間隨機化技術可以有效增加緩沖區溢出攻擊的難度,是阻止內存攻擊一種實用、有效的防御技術,但其自身仍存在一些局限。
地址猜測。隨機化的范圍受CPU數據總線寬度、對象組件特點等因素制約,一些組件的位置變化有限,隨機化范圍不大,攻擊者可以采用暴力猜測的方法猜測跳轉地址。
隨機化粒度。隨機化的粒度應該盡可能細,以抵御基于相對地址的攻擊。僅隨機化進程各模塊加載的基地址遠遠不夠,還需對各個模塊內部元素間的間隔進行進一步隨機化。
3 指令集隨機化技術
3.1 基本原理
指令集隨機化技術主要應用于防御代碼注入攻擊[6]。指令集隨機化的思想最早由Thimbleby于1991年提出[7];哥倫比亞大學的Stephen等人對Bochs模擬器進行了修改[8],構建了指令集隨機化驗證系統,并證明了指令集隨機化對Perl、SQL等解釋性語言的可行性;David H.Ackley等人基于開源的二進制翻譯工具Valgrind開發了隨機指令集模擬器[9];Wei Hu、Jason Hiser等人基于Strata虛擬機開發了能夠實用的指令集隨機化原型系統[10];哥倫比亞大學的Georgios等人基于二進制插裝工具PIN[11]為運行于Linux上的x86軟件實現了指令隨機化運行環境
3.2 編譯型語言隨機化
編譯型語言指令集隨機化的對象是二進制可執行文件。如圖3所示,描述了編譯型語言程序指令集隨機化的基本流程。編譯型語言指令隨機化一般是通過引入加密、解密機制,對二進制代碼指令進行加密操作,生成隨機化指令集,在指令執行前進行譯碼操作。指令集隨機化系統一般包括兩個部分:一是對應用二進制文件進行加密操作,生成隨機化指令集;二是構建執行環境,一般是在系統取指令后,執行前利用密鑰對隨機化指令進行譯碼,然后由處理器執行。
3.3 解釋型語言隨機化
解釋型語言隨機化的對象可以是腳本中的關鍵字、操作數、功能調用等。如圖3所示,描述的是SQL指令隨機化系統。SQL指令在數據庫中間件被隨機化處理,由數據庫服務器中代理對收到的經隨機化處理的SQL語句進行譯碼,然后把它送給數據庫,從而阻止非法表達式的攻擊。endprint
3.4 效能與不足
理論上,指令集代碼隨機化能夠防范各種代碼注入攻擊,但其自身也存在缺陷。
為了實現指令集隨機化,需要構建基于硬件或者軟件的隨機指令執行環境。對于硬件環境需要修改處理器,對于軟件的環境則對性能影響較大;
指令集隨機化重點防范代碼注入攻擊,但如果攻擊者能夠訪問本地磁盤,得到二進制文件和對應的隨機化文件,指令集隨機化系統很容易被破解。
4 多變體執行技術
4.1 基本原理
多變體執行技術是一種能夠在運行時防止惡意代碼執行的技術[12],其原理是通過同時運行多個語義上等價的變體,并在同步點比較其行為,在同樣輸入的前提下一旦發現有不一樣的行為,則可以通過監控程序來判斷是否存在攻擊行為。
4.2 多變體執行環境
多變體執行分為變體生成和監控執行兩個部分。變體生成基于編譯器實現,在源代碼中為需要重點保護的程序核心算法或關鍵控制過程添加多變體生成編譯指令,編譯生成多樣化代碼的變體;多變體執行環境運行多個變體,在系統調用上同步并監控各個變體行為,通過比較行為的一致性,發現潛在的惡意代碼攻擊。
多變體執行環境由動態運行支撐環境和多變體監視器組成,其架構如圖5所示。
多變體監視器用于控制變體的執行狀態,同時驗證它們是否符合預先定義的規則。在用戶啟動程序時,執行環境運行程序的多個變體,只要變體不訪問其進程空間之外的數據或者資源,監視器就不會中斷變體的執行;當變體請求系統調用時,監視器會攔截請求并暫停變體執行,嘗試同步其它變體的系統調用,所有變體需要在短時間內執行功能相同且參數等價的系統調用;當某個變體因攻擊導致執行結果不同或執行超時,監視器根據所配置的策略采取相應動作,默認將終止并重啟所有變體,也可以根據多數原則剔除不一致變體。
4.3 效能與不足
多變體執行中,同一程序必須同時執行多個變體,監控程序要實時監控每個變體的運行結果,對系統性能要求較高,特別是對于細粒度的監控,性能影響更大。
5 結束語
本文總結了目前主流的軟件動態防御技術。目前,軟件動態防御技術針對特定攻擊都有很好的防御效果,如何將各項技術進行有機整合,建立完整的軟件動態防御系統是下一步的研究方向。
參考文獻
[1] SHACHAM H, PAGE M, PFAFF B. On the effectiveness of address space randomization [A]. ACM Conference on Computer and Communications Security (CCS), Washington D.C.[C].2004.298-307.
[2] BHATKAR S, SEKAR R, DUVAMEY D C. Efficient techniques for eomprehensive protection from memory error exploits [A].Proceedings of the 14th USENIX Security Symposium, Baltimore, MD[C].2005.
[3] 王清.0day 安全:軟件漏洞分析技術(第二版)[M].北京:電子工業出版社,2013.
[4] MARCO-GISBERT H, RIPOLL I. On the effectiveness of NX, SSP, Renew SSP and ALSR against stack buffer overflows [A]. Proceedings of the 13th International Symposium on Network Computing and Applications[C].2014.
[5] PaXTeam.PaX[EB/OL].http://pax.gmecurity.net, 2001.
[6] RAY D, LIGATTI J. Defining code-injection attacks [C]. ACM SIGPLAN Notices. ACM, 2012,47(1):179-190.
[7] THIMBLEBY H. Can viruses ever be useful. [J].Computer Security,1991,10(2):111-114.
[8] KC G S, KEROMYTIS A D, PREVELAKIS V. Countering code-injection attacks with instruction-set-randomization [A].ACM Computer & Communications Security onference[C].2003.272-280.
[9] BARRANTES E G, ACKLEY D H, FORREST S. Randomized instruction set emulation[J]. ACM Transactions on Information System Security,2005,8:3-40.
[10] HU W, HISER J, WILLIAMS D. Secure and practical defense against code injection attacks using software dynamic translation [A]. Proceedings of the 2nd International Conference on Virtual Execution Environment (VEE)[C]. 2006. 2-12.
[11] LUK C K, COHN R, MUTH R. Building customized program analysis tools with dynamic instrumentation [A]. Proceedings of Programming Language Design and Implementation (PLDI)[C]. 2005:190-200.
[12] BARRANTES E G, ACKLEY D H, FORREST S. Randomized instruction set emulation to disrupt binary code injection attacks [A]. Conference on Computer and Communications Security [C].2003.281-289.endprint