◆何紹勇 李 偉 尚苗星 蔄羽佳
隨機化技術綜述
◆何紹勇 李 偉 尚苗星 蔄羽佳
隨著計算機技術的飛速發展,系統安全問題日益嚴峻。隨機化技術是應對安全威脅的一種主動防御手段,能夠有效地保護系統和程序。隨機化技術通過將系統或程序進行隨機化轉換,能夠隨機地增加系統異構特征,進而增加攻擊的代價。本文根據隨機化技術的實現原理,將目前主流的隨機化技術進行分類,并對各類方法的思路和局限做出分析,最后總結隨機化技術存在的問題,并對未來可能的發展方向給出思考。
信息系統安全;隨機化技術
由于計算機技術的不斷發展以及互聯網的廣泛應用,計算機系統越來越復雜,面臨的安全威脅層出不窮。惡意的攻擊者能夠利用系統的同構性,在本地搭建模擬環境探測目標對象可能存在的安全隱患,針對測試的結果在真實的目標環境中實施惡意的行為。
安全人員為了增強系統的安全性,提出了多種對抗惡意攻擊的手段,可以分為主動和被動兩種類型。目前大多數安全工具如殺毒軟件等通常根據檢測目標是否存在惡意特征來判斷系統的安全性,需要安全人員根據上報與檢測情況不斷更新這些惡意特征,因此惡意特征的檢測始終滯后于惡意行為。還有一種主動防御安全保護思路,即通過增強系統或程序自身的防御能力,主動防御惡意行為,并且對未知的安全威脅有潛在的防御能力。主動防御的方法重點在于增加系統的多樣性,使得對外提供相同功能的系統具有不同的內部表現,導致攻擊者無法模擬目標機器實際的系統環境,從而極大地增加了攻擊者的時間和精力成本。此外,由于系統的多樣性,在一臺機器上攻擊成功未必能夠在另一目標上同樣成功,因此能夠有效地控制攻擊所能影響的范圍。
隨機化技術[1,2]是一種增加系統多樣性的主動防御方法。通過將目標進行隨機化的等價轉化,使系統的某些特征發生隨機的改變,但是原有功能保持不變,從而增加系統的特征,增加攻擊者分析與測試的難度,達到保護的效果。
根據隨機化的對象不同,可以分為指令隨機化、地址空間隨機化、數據隨機化、系統調用隨機化[3-6]等。目前的隨機化技術大多采用了其中一種或幾種方式,在一個或多個轉化階段對系統進行隨機化。下面介紹這幾種隨機化技術的原理與研究現狀。
指令集隨機化[7]技術通過將程序中的指令按照一定的隨機規則隨機地變換,外部的惡意代碼解密后得到錯誤或無效的機器指令,無法按照變換后的指令集被機器識別,從而實現系統安全防御。該隨機化方法主要針對代碼注入類型的攻擊,注入型攻擊向系統或程序中注入外部的惡意代碼,這些代碼根據攻擊目標的機器所使用的指令集編寫。在未經保護的情況下,一旦控制流指向這些惡意代碼,系統則將執行惡意行為。如果系統經過指令集隨機化變換,攻擊者無法獲知該目標的指令集,注入的惡意代碼無法按照該機器的指令集正確解碼,從而無法執行惡意行為導致攻擊失敗。
文獻[8]提出一種軟件動態翻譯技術對指令表示進行隨機的加密變換。程序在輕量級虛擬機中執行,執行前將程序按照一定的大小分塊加密,并為指令分配標簽。加密的密鑰在每次加載時隨機生成并由虛擬機保管,被加密的程序無法訪問該密鑰。執行時,根據執行流程,虛擬機解密需要執行的下一條指令所在的加密塊,保證程序正常執行。被解密的代碼塊暫時以緩存的方式保存,減少大量的重復解密工作,提高執行效率。如果發現指令的標簽不匹配,可以判定其發生了指令注入。文獻[9]提出了隨機指令集仿真技術通過二進制翻譯器實現指令集轉化。程序加載時,使用隨機的密鑰對可執行代碼進行加密,在執行時,通過二進制翻譯器完成解密工作。注入的代碼經過隨機密鑰解密后轉化為不可預知的指令序列,無法執行原有的惡意行為。
指令集隨機化技術雖然能夠有效阻止代碼注入型攻擊,但是存在一定的問題。例如,對于外部注入的指令能夠有效防御,但是對如 return-to-lib類型的攻擊沒有效果。此外,指令集的隨機化與恢復需要系統的支持,程序的運行需要借助動態的二進制翻譯環境或者虛擬機,執行性能受到較大影響。
指令集隨機化技術通過對程序的指令進行隨機化轉化,外部注入的惡意代碼經過解密轉化為未知的錯誤指令會導致攻擊失敗。然而如果攻擊者的跳轉目標并非外部注入的代碼,而是系統自帶的庫函數,該方法無法產生防御效果。系統調用隨機化[10,11]則是將隨機化的變化范圍擴展至系統調用相關的庫函數,對系統調用接口、庫函數入口地址進行隨機化,增加系統自身的異構性,從而增加了攻擊的難度。
系統調用隨機化能夠防御跳轉至庫函數或系統調用的代碼的攻擊,也存在一些不足。對系統調用進行隨機化需要系統的支持,實現較為復雜;且隨機化的范圍有限,容易通過暴力猜測得到真正的地址。
數據隨機化[12-14]技術對數據對象隨機化,通過對程序中的數據對象進行隨機加密,運行時對這些數據解密,達到保護的效果。數據隨機化主要針對那些利用函數指針或者返回地址的攻擊。當程序使用到注入的數據時,使用密鑰對數據進行解密。由于注入的數據沒有經過隨機化加密,解密得到非預期的值,導致攻擊失效。
目前的數據隨機化工作主要有文獻[12-14]。PointGuard[12]是數據隨機化技術的初步實現,首先識別程序中的指針對象,使用隨機密鑰將這些指針對象保護起來。當使用指針變量時,再進行解密。如果該指針是由外部注入的,解密后得到的并不是攻擊者預期的地址,從而不會按照攻擊者的意圖執行。文獻[13,14]對PointGuard技術進一步擴展,隨機化的對象不僅僅局限于指針,程序中所有的數據都可以進行隨機化,增加了保護的范圍。文獻[13]實現的是源--源的隨機化工具。利用異或操作將程序中的數據隨機化,生成經過隨機化轉化的源碼。而文獻[14]則是在編譯的中間階段完成加密解密指令的插樁,生成經過隨機化保護的可執行程序。并對庫函數與系統調用進行了隨機化封裝。
但是數據隨機化技術也存在問題。隨機化過程需要程序源碼,沒有源碼則無法實現數據隨機化的轉化。
地址隨機化[15]通過隨機改變內存中代碼、堆棧、系統函數等位置的布局,對抗借助控制流跳轉劫持控制流的攻擊方式,攻擊者無法定位實際的內存地址,跳轉至未知區域,導致攻擊失敗。該技術目前已經在主流的操作系統如Windows、Linux、Mac OS X、Android等實現。
Linux Pax項目團隊于2001年發布的系統率先實現了地址空間隨機化技術,通過在程序運行過程中動態地將部分偏移地址隨機化,攻擊者難以定位函數、堆棧以及內核空間的相關地址,具有較好的保護效果。
Kil等人提出地址空間布局仿真[16]。在用戶層對二進制文件進行處理,將代碼段和數據段的基址隨機化,并更細致地將代碼段和數據段內部的函數和變量的地址進行隨機化。在內核層將堆、棧的起始位置隨機化,并隨機分配堆內的獨立頁面。
地址隨機化技術也存在一定的局限性。由于系統的內存布局本身的限制,以代碼塊、堆、棧等結構為基本隨機化單元,可選的隨機化空間范圍有限,隨機的粒度較大。攻擊者通過增加猜測的范圍能夠得到真正的地址,容易通過暴力破解。此外,地址隨機化技術未對所有的段隨機化,能夠利用未隨機的段地址計算出目標段的地址從而繞過該保護機制。
軟件隨機化技術可以對內存破壞、注入攻擊等具有一定的防御效果,但是也無法保證絕對的安全性。目前的隨機化技術都存在一定的局限,整體來看,隨機化粒度不足,容易通過一些暴力手段繞過保護。而且各種方法的實現都較為復雜,大多需要詳細分析程序源碼或者二進制程序。此外,為了保證隨機化后的正確性,需要保守地進行變換,隨機化的實際效果不能達到設計者的理論預期。較為可行的保護方式是將多種隨機化方法與其他保護手段有效地結合起來,綜合地增強系統防御力。惡意攻擊者與安全人員持續對抗,此消彼長,軟件保護工作仍需要我們進一步研究與探索。
[1]Okhravi H, Rabe M A, Mayberry T J, et al. Survey of Cyber Moving Targets[J]. Massachusetts Inst of Technology Lexington Lincoln Lab, No. MIT/LL-TR-1166, 2013.
[2]Jajodia S, Ghosh A K, Swarup V, et al. Moving target defense: creating asymmetric uncertainty for cyber threats [M]. Springer Science & Business Media, 2011.
[3]Davi, Lucas, et al. Isomeron: Code Randomization Resilient to (Just-In-Time) Return-Oriented Programming. NDSS,2015.
[4]Zhang, Chao, et al. Practical control flow integrity and randomization for binary executables. Security and Privacy (SP), 2013 IEEE Symposium on. IEEE, 2013.
[5]Crane, Stephen, et al. Readactor: Practical code randomization resilient to memory disclosure. Security and Privacy (SP), 2015 IEEE Symposium on. IEEE, 2015.
[6]Backes, Michael, and Stefan Nürnberger. Oxymoron: Making Fine-Grained Memory Randomization Practical by Allowing Code Sharing. USENIX Security. Vol. 14. 2014.
[7]Portokalidis G, Keromytis A D. Fast and practical instruction-set randomization for commodity systems[C]//Proceedings of the 26th Annual Computer Security Applications Conference. ACM,2010.
[8]Hu W, Hiser J, Williams D, et al. Secure and Practical Defense Against Code-Injection Attacks Using Software Dynamic Translation[C]//Proceedings of the 2nd International Conference on Virtual Execution Environments. ACM, 2006. [9]Barrantes E G, Ackley D H, Forrest S, et al. Randomized Instruction Set Emulation[J]. ACM Transactions on Information and System Security (TISSEC), 2005.
[10]Liang, Zhaohui, Bin Liang, and Lupin Li. A system call randomization based method for countering code -injection attacks.International Journal of Information Technology and Computer Science (IJITCS) 1.1,2009.
[11]Jiang X, Wang H J, Xu D, et al. Randsys: Thwarting Code Injection Attacks With System Service Interface Randomization[C]//Reliable Distributed Systems, 2007. SRDS 2007. 26th IEEE International Symposium on. IEEE, 2007.
[12]Bhatkar S, Sekar R. Data space randomization[M]//Detection of Intrusions and Malware, and Vulnerability Assessment. Berlin: Springer, 2008.
[13]Cadar C, Akritidis P, Costa M, et al. Data Randomization[R].Technical Report TR-2008-120, Microsoft Research, 2008. Cited on, 2008.
[14]Cowan, Crispin, et al. "Pointguard TM: protecting pointers from buffer overflow vulnerabilities." Proceedings of the 12th conference on USENIX Security Symposium. Vol. 12,2003.
[15]Snow, Kevin Z., et al. Just-in-time code reuse: On the effectiveness of fine-grained address space layout randomization. Security and Privacy (SP), 2013 IEEE Symposium on. IEEE, 2013.
[16]Kil, C., Jun, J., Bookholt, C., Xu, J., Ning, P, 2006. Address Space Layout Permutation (aslp): Towards Fine-Grained Randomization of Commodity Software,in:Computer Security Applications Conference, 2006. ACSAC'06. 22nd Annual, IEEE. pp. 339-348.