謝 鑫,梁衛芳,陳 敏
(湖南信息學院 計算機科學與工程學院,湖南 長沙 410151)
現代社會是建立在軟件之上的,過去幾年,人工智能、大數據、5G和云計算等新興產業的迅猛發展,推動了軟件產業快速迭代和變革。從傳統電腦和手機終端等個人應用軟件,到城市管理、物聯網、區塊鏈、智能制造和工業控制等新興系統軟件,覆蓋了人們生活和工作的眾多場景,產生了巨大的經濟和社會效益。軟件內部的架構、邏輯和算法是重要的數字資產,在不斷變化和擴大的網絡安全環境中,常常面臨惡意逆向分析和篡改、盜版分發和傳播等威脅。研發人員對軟件的安全性進行需求分析和設計,開展安全編碼和測試,進行安全保護和運營維護,而在整個軟件生命周期內,對核心代碼和數據進行保護,成為眾多研究者應對和解決日益提升的軟件安全性需求的重要方向。
代碼混淆技術是一種典型的保護方法,一般基于混淆策略對于軟件代碼和數據進行等價變換以保證軟件機密性,出現了基于指令、函數、控制流和代碼遷移等多種代碼層面的混淆方法,也出現了基于數據值、數據結構和數據流圖等多種數據層面的混淆方法。隨著混淆技術研究的深入,采用虛擬機(Virtual Machine,VM)框架對軟件進行保護成了研究者的聚焦方向,如下:
虛擬機結合傳統代碼混淆保護:基于隨機和模擬退火的指令亂序混淆算法改進虛擬指令解釋函數(Handler);基于等價替換和亂序切分的指令序列多樣化算法改進虛擬機Handlers模塊;基于語義等價變換和控制流混淆的具有時間多樣性的虛擬機執行路徑混淆;基于代碼隔離的虛擬機保護技術;采用花指令和指令模糊變換技術對虛擬機指令模塊強度進行改進;基于基本塊混淆和多樣化虛擬環境的虛擬機保護框架改進;基于多樣化技術對虛擬指令解釋函數、虛擬指令調度器和虛擬指令集進行處理,實現多虛擬機框架混淆從虛擬機操作碼到本地機器指令的映射;采用隨機化技術實現虛擬指令到字節碼指令的編碼和隨機化;基于多分區和隨機化映射實現虛擬指令到字節碼映射的混淆;基于多重虛擬機嵌套的保護框架改進;基于多套虛擬機對并行代碼進行保護。
虛擬機結合加密、防篡改、防調試技術保護:基于動態加解密技術對虛擬機框架中的虛擬指令解釋函數(Handler)模塊安全性進行提升;基于字節碼的加解密技術對基本指令集保護力度進行提升;基于寄存器值檢查的虛擬機防調試指令設計;基于軟件哨兵和哨兵環技術的虛擬機安全指令和防篡改保護設計。
虛擬機結合多技術混合保護:融合數據流混淆引擎、異常處理機制和雙進程技術實現虛擬機保護的數據流和執行流復雜化;融合控制流迭代變形、指令序列隨機切分和動態加解密技術實現虛擬指令調度器(Dispatcher)模塊安全性改進;融合隨機秘鑰還原和多樣化調度器解碼的虛擬代碼折疊技術實現降低虛擬機代碼靜態呈現的數目。
上述研究工作從虛擬機框架模塊內部、模塊間映射和框架整體角度出發,并結合傳統混淆技術、防調試技術、防篡改技術和加密技術對虛擬機框架不斷進行改進,在提升虛擬機保護技術的安全性方面取得了一定的成果,并呈現出虛擬機+混合技術的保護發展趨勢。不過大部分的工作依然聚焦于虛擬機保護的復雜性、隱蔽性或防篡改性單一維度性能的提升,而虛擬機保護的安全性體現又是多維度的,由于虛擬機整體框架的固定性,當虛擬機框架內模塊連接部分的復雜性、防篡改性或隱秘性不高的時候,容易被攻擊者定位、分析和理解,從而實現虛擬機整體保護框架的破解。本文針對虛擬機模塊連接復雜性、隱蔽性和防篡改性較弱的問題,提出一種多維防御混合的虛擬機保護安全性增強方法:首先融合ROP、指令自修改技術和指令重疊技術實現虛擬機框架模塊連接指令序列的隱蔽混淆,并采用多樣化和隨機化思想進一步提升指令序列復雜性,最后采用檢測和修復雙哨兵集和三線程實現模塊連接的防篡改。
采用虛擬機保護框架對程序進行保護的基本流程為:先抽取程序中的核心代碼和數據,用虛擬機框架對其進行保護,然后用保護后的程序替換原始程序的核心代碼和數據,并嵌入完成虛擬指令序列解釋執行的虛擬機各個模塊。原始程序執行時為本地代碼的順序執行,而受虛擬機保護后的代碼,執行流首先會被虛擬機解釋執行框架接管,通過解釋執行框架對于虛擬指令集進行解釋執行,完成所有虛擬指令執行后,執行流再回到原始程序中執行。這種保護方式本質上是在原始程序的基礎上構建了一層抽象層,用抽象層的復雜性、難以理解性來對抗逆向攻擊者對于核心代碼和數據的分析和理解。而這一抽象層為基于解釋執行邏輯的虛擬機,實現解釋執行的虛擬機框架由眾多模塊構成,一般包括:字節碼集,虛擬指令解釋函數集,虛擬指令調度器,跳轉表,虛擬機上下文和虛擬機入口和出口代碼。這些模塊之間的連接一般具有穩定的基本結構,如圖1所示。
基于虛擬機的代碼保護技術是將需要保護的可執行代碼進行虛擬化,運用許多虛擬指令執行序列來模擬被保護代碼,完成與被保護代碼相同執行結果,從而達到目標代碼不被輕易逆向分析和惡意篡改,典型的應用是將基于x86匯編系統的可執行代碼轉化為字節碼指令系統的代碼。
在使用虛擬機對目標代碼進行保護時,先定位需要保護的關鍵代碼,然后對其進行虛擬化,完成后去除原始代碼,并將虛擬機代碼模塊嵌入受保護程序內部,如圖1(a)所示。受保護代碼需要執行時,首先從目標代碼指令流切換到虛擬機保護代碼入口,完成對目標代碼當前執行CPU上下文環境的保存后,運用虛擬機調度器,跳轉表和解釋函數等虛擬機保護核心模塊,對虛擬指令序列進行解釋執行,執行完所有虛擬指令序列后,先對目標代碼指令執行環境進行恢復,然后退出虛擬機解釋執行框架,并進行之后指令的執行,如圖1(b)所示。

圖1 虛擬機保護基本框架和原理
ROP全稱為Return Oriented Programming,基本思想源于提取報刊上英文單詞中的若干字母,連接組成一句具有語義的話,后來延伸到軟件安全領域,是一種基于代碼復用的攻擊技術。在程序中通過對指令序列進行ROP形式的代碼插裝,將原始指令序列轉換為以ret指令結尾的gadget形式,在程序執行過程中,所有的gadget指令通過ret返回指令相連,最后執行一段完成特殊功能的指令序列,如圖2所示。

圖2 ROP攻擊原理示例
指令自修改技術(Self-Modifying Code,SMC),在真正執行程序中的某一段指令序列時,程序本身存在的指令序列會對部分代碼或數據進行修改,修改后的代碼或數據是可匯編和可執行的。
在原始程序指令序列(,,…,)中插入指令序列(,,…,),并將原始程序指令序列中要偽裝的目標指令序列(,,…,),用指令序列(,,…,)進行替換,在程序實際運行過程中,指令序列(,,…,)對指令序列(,,…,)進行修改,將(,,…,) 恢復為目標指令序列(,,…,)。
反匯編算法的假設前提為指令之間不重疊,因此指令重疊技術作為一種重要的反反匯編技術,廣泛應用于與惡意代碼混淆變形之中,用于對抗程序靜態分析。一般分為三種類型:向后重疊,向前重疊和自身中間重疊。如:設有兩條連續指令=(,,…,)和=(,,…,),緊跟隨在后執行,且<,其中表示或指令中的一位十六進制字節。若指令之間不重疊,則指令最后一字節一定緊跟指令第一字節,連續指令和的十六進制字節數據為(,,…,)。若-+1=,…,=,<,則說明指令末尾字節和指令的起始字節重疊,記為(,…,-,…,);若=,則表明指令末尾字節為整條指令。
軟件哨兵技術是一種用于軟件防篡改的動態保護技術,通過在軟件內部嵌入檢測哨兵代碼和恢復哨兵代碼,形成哨兵保護網絡,在軟件執行過程中,檢測哨兵代碼可以對自身所負責的區域進行完整性檢測,如果檢測到異常,恢復哨兵代碼對其進行動態恢復。
基于基本虛擬機保護框架,結合上述軟件防御技術基本原理,提出一種基于多維防御混合策略的虛擬機保護安全性增強方法,用于提升虛擬模塊連接指令序列的安全性,基本流程如下:
1)構建基本虛擬機保護框架。
2)定位需要保護增強的虛擬機模塊連接指令序列。
3)混合ROP技術、SMC技術和指令重疊技術對其進行混淆,具體步驟如下:
3.1)通過搜索和構造結合方式獲取與需保護指令序列等價的內存空間gadget。
3.2)生成不透明謂詞集合={,,,…,},其中為不透明謂詞。
3.3)運用指令重疊方法對單條gadget指令序列=(,,,…-1,RET)進行混淆,生成混淆后指令序列′=(,,,…,-1,,,,…,-1,,),其中(,,,…,-1)為新增實現不透明謂詞組合算式的指令序列,完成跳轉指令偏移數據的生成,可表示為二進制序列(…),其公式如式(1)所示。跳轉指令的形式為jmp base+,base為重疊指令的基地址,其中=(…1…),其中RET指令序列的二進制,表示為(…)。

(1)
3.4)通過指令自修改方法對指令序列′再次進行混淆,生成混淆后的指令序列″=(,,,…,,,,,…,-1,,-1,…,-1,,,,…,-1,,),其中(,,,…,-1)為實現不透明謂詞組合算式的指令序列,完成跳轉指令偏移數據的生成,可表示為二進制序列(…),其公式如式(2)所示。數據移動指令形式為mov [base+],Data,Data為自修改指令數據,base為數據移動指令的基地址,其中可以修改非控制轉移指令成為控制轉移指令。

(2)
3.5)構造自修改指令集合={,,,…,},對不透明謂詞組合算式指令序列(,,,…,-1)和(,,,…,-1)中包含的所有跳轉指令進行混淆,將所有跳轉指令修改為非控制轉移指令。
4)采用指令多樣化和隨機化技術對3)結束所產生的指令序列進行混淆處理。
4.1)基于等價指令替換和代碼數據互相轉換雙重策略進行指令多樣化,如圖3(a)和(b)為基于指令替換技術的指令多樣化示意,圖3(c)為基于代碼和數據轉換的指令多樣化示意。

圖3 指令多樣化策略示例
4.2)基于多樣化指令序列和路徑隨機選擇指令構建指令混淆網絡如圖4所示,其中指令序列(,,,…,1),(,,,…,2),…,(1,2,3,…,)為等價指令序列,集合{,,,…,1},{,,3,…,2},…,{1,2,3,…,}單個集合內的每一個指令片段等價。

圖4 指令混淆網絡構建
5)基于檢測和修復軟件哨兵和三線程,對虛擬機模塊連接結構的混淆指令序列進行保護。
5.1)基于最小覆蓋的哨兵的防篡改保護。
5.2)基于三線程的防篡改增強。
6)生成安全增強虛擬機保護框架。
Windows10家庭中文版64位操作系統,CPU為Intel(R) Core(TM)i7-8700 CPU,內存為16 GB,主頻為3.2 GHz。采用IDA7.2對6款測試程序進行分析,獲取程序的大小和所包含的函數個數,并采用Local Windows Debugger調試器,對各測試程序關鍵代碼段進行分析,獲取的基本信息如表1所示。

表1 測試用例描述
首先基于虛擬機設計原則,構建虛擬機代碼保護原型系統M-VM,然后運用基于多維防御混合策略的虛擬機增強方法對原型系統M-VM進行混淆增強變換,加入ROP, SMC和指令重疊技術,生成M-VM,在此基礎上再加入多樣化和隨機化指令混淆網絡,生成M-VM,最后加入軟件哨兵和三線程防篡改保護,生成M-VM。
然后基于表 1中的測試程序,分別采用M-VM,M-VM,M-VM,M-VM以及商用軟件Code Virtualizer(CV),VMProtect(VMP)對其進行保護,其中CV版本號為3.0.8.0,使用的虛擬機類型為Tiger32 White;VMP版本號為3.5,采用默認設置策略進行虛擬機保護。表2為保護前后軟件大小的變化,表3為保護前后關鍵代碼指令執行時間的變化,為了降低測試的誤差,執行時間為20次結果的平均值。

表2 虛擬機保護前后程序大小

表3 虛擬機保護前后關鍵代碼執行時間
兩款商用軟件具有很強的保護功能,測試程序經過商業虛擬機保護軟件CV和VMP處理后,往程序中嵌入了實現保護功能的虛擬機保護框架,程序大小有較大幅度的增長。虛擬機原型保護系統M-VM由于是輕量級的功能實現,經過其保護的程序大小,只有小幅度的增長。在M-VM上通過增加ROP、指令折疊和自修改技術而實現的M-VM,其中所添加的不透明謂詞,都是代碼量小的不透明謂詞,可以發現其程序增長開銷不大。在M-VM基礎上通過引入多樣化和隨機化技術而實現的M-VM的每一條指令序列生成三條功能等價的指令序列,而每一條指令序列被切分為三段指令片段,進行隨機化連接,可以發現M-VM相比M-VM空間有較大的增長。在M-VM基礎上通過引入哨兵和三線程實現的M-VM,添加了響應、恢復和監控哨兵指令序列,在嵌入哨兵的時候,盡可能嵌入PE頭的冗余空間之中,并控制了不同功能的哨兵數目,程序增長空間較小。因此從表2可得,在實際使用多維防御混合策略生成虛擬機保護框架對程序進行保護的時候,如需控制程序的增長,需要對不透明謂詞類型和復雜程度進行選擇,并要不斷調整多樣化和隨機化實現過程中的參數選擇,以平衡保護強度和增長程序體積。
除了空間開銷外,經過不同虛擬機保護框架處理后程序關鍵代碼執行時間如表3所示,經過CV和VMP處理后,核心代碼指令序列的執行時間有了不同程度的增長,CV整體時間開銷遠大于VMP,M-VM是輕量級實現,增長的時間開銷符合虛擬機保護框架指令膨脹的基本特點。在實際實驗中,選擇了運算速度快的不透明謂詞,M-VM相比較與M-VM增長的大部分時間為實現指令折疊和自修改時,不透明謂詞執行的增長時間,另外,一部分時間為實現ROP的執行時間。M-VM相比M-VM增長的時間在混淆指令網絡中的隨機選擇指令序列,每一條指令序列生成三條功能等價的指令序列,而每一條指令序列被切分為三段指令片段,每次執行一次混淆指令網絡,隨機選擇指令序列執行兩次。M-VM相比M-VM的大部分時間增長,由于測試過程中,并沒有引發篡改響應和恢復功能,三線程保護引入了指令執行時間的增長。因此可得,在實際使用多維防御混合策略生成虛擬機保護框架對程序進行保護的時候,如需要控制程序時間開銷的增長,需要對不透明謂詞類型和復雜程度進行選擇,并需要對多樣化和隨機化的參數選擇進行擇優選擇,以平衡保護強度和程序執行時間開銷。
從表2和3可得,經多維防御混合虛擬機保護后,程序無論在程序大小還是在運行時間上都會有較大增長。M-VM,M-VM和M-VM保護強度呈階梯增強,如果要提高其安全強度,可以構造安全性更高的不透明謂詞進行嵌入,迭代生成和構造更多類型的ROP指令序列,等價指令序列和多樣化指令片段,運用更復雜的方式在代碼和數據之間進行等價轉換混淆,嵌入更多的哨兵,對線程保護進行增強,但這樣會使得程序的空間和時間有大幅度的增長。實際使用多維防御虛擬機框架對程序進行保護時,需要平衡安全性、可用性和所保護的核心代碼范圍。
基于多維防御混合策略的虛擬機框架增強方法,在現有虛擬機保護框架的基礎上,通過ROP、指令重疊和指令自修改技術組合混淆策略,增強了虛擬機模塊間連接代碼的隱蔽性;通過多樣化和隨機化混淆指令網絡,增強了虛擬機模塊連接代碼的復雜性;通過多功能哨兵和三線程保護,實現模塊連接的防篡改。從模塊連接的復雜性、隱蔽性和防篡改三方面進行了安全性增強,提升了整體框架在面對惡意攻擊者定位、分析和篡改方面的安全性能。
基于-原型虛擬機實現了增強型-,-,-虛擬機原型系統,實驗驗證了方法的可行性,基于多維防御混合方法改進的虛擬機框架,對于核心代碼和數據的保護具有更高的保護強度。不過,在實際應用方法的時候,需考慮安全強度和保護后程序的時空開銷平衡問題,這也是下一步的工作方向。