杜三,舒輝,康緋
?
基于硬件的動態(tài)指令集隨機化框架的設計與實現(xiàn)
杜三,舒輝,康緋
(信息工程大學數(shù)學工程與先進計算國家重點實驗室,河南鄭州 450001)
針對現(xiàn)有的指令集隨機化方法存在從代碼段中剝離數(shù)據(jù)困難、靜態(tài)指令集隨機化密鑰固定和偽隨機數(shù)密鑰不安全等問題,設計并實現(xiàn)了基于硬件的動態(tài)指令集隨機化框架(HDISR),通過在裝載程序時加密程序代碼,將指令集隨機化引入內核層和應用層的安全防護,內核使用單獨的內核密鑰,不同的應用程序使用不同的用戶密鑰。實驗結果表明,HDISR能將代碼注入攻擊降級為拒絕服務攻擊,且額外硬件損耗少于2.57%,每兆字節(jié)代碼加密的啟動延時0.31 s。
代碼注入攻擊;指令集隨機化;動態(tài)指令集隨機化;內核
常用的網(wǎng)絡應用和操作系統(tǒng)不斷曝光內存破壞類漏洞(如緩沖區(qū)溢出、懸空指針、格式字符串等),代碼注入攻擊能夠利用漏洞執(zhí)行惡意代碼,是網(wǎng)絡空間最常見的安全威脅之一[1]。作為移動目標防御(MTD,moving target defense)的重要組成部分,指令集隨機化(ISR,instruction set randomization)對程序使用的指令集進行隨機化處理,而攻擊者無法得知當前使用的指令集,構造有效的漏洞利用程序,因此對代碼注入攻擊有很好的防御效果。
指令集隨機化技術也可以保護腳本語言,通過隨機化標準的操作集,使注入的腳本無效,從而抵御SQL注入攻擊[2]和Javscript注入攻擊[3]等威脅。同時,在程序混淆中使用指令集隨機化可以增加攻擊者逆向分析的難度[4,5],在硬件混淆中使用指令集隨機化能夠防止供應鏈中注入的后門程序執(zhí)行[6]。與地址空間隨機化(ASLR,address space layout randomization)和數(shù)據(jù)執(zhí)行保護(DEP,data execution prevention)相比,指令集隨機化不僅能對抗代碼注入攻擊,還具有抗逆向能力,可以防止非授權代碼的執(zhí)行。
2003年,Kc等[7]首次提出了對抗代碼注入攻擊的通用方法——指令集隨機化技術,設計了基于Bochs仿真器的X86原型,驗證了硬件實現(xiàn)指令集隨機化的可行性。Portokalidis等[8,9]提出了支持共享庫和全面防御未授權代碼執(zhí)行的指令集隨機化方法,使用不同的密鑰對不同的程序進行隨機化處理。王奕森等[10]提出了基于編譯置換的指令集隨機化技術,實現(xiàn)了操作碼層次的指令集隨機化,利用該技術實現(xiàn)了X86架構下Windows系統(tǒng)程序的指令隨機化。上述基于軟件實現(xiàn)的指令集隨機化方法均采用靜態(tài)指令集隨機化,存在一系列問題,包括指令翻譯性能損耗大、攻擊翻譯軟件可以旁路繞過指令集隨機化防御、密鑰固定易遭到密鑰猜測攻擊[11]。
針對上述問題,Papadogiannakis等[12]首次提出了動態(tài)指令集隨機化方法,并設計了硬件支持的指令集隨機化系統(tǒng)ASIST,可以為內核和用戶程序提供指令集隨機化支持。Sinha等[13]設計了Polyglot系統(tǒng),改進了ASIST對頁共享技術支持的缺陷。上述基于硬件實現(xiàn)的指令集隨機化方法采用了動態(tài)指令集隨機化,在程序崩潰之后使用新的隨機密鑰重新加密代碼,使已探測的密鑰值在程序重啟后無效,可以阻止密鑰猜測攻擊。但上述方法在實現(xiàn)時需要修改源碼和鏈接腳本來徹底分離代碼段與數(shù)據(jù)段,而從代碼段中分離數(shù)據(jù)困難;同時使用了軟件產生的偽隨機數(shù)密鑰,具有可重現(xiàn)性,如果攻擊者擁有足夠的計算能力, 可以破解偽隨機數(shù)加密,從而危及整個密碼應用的安全[14,15]。
針對現(xiàn)有方法的缺陷,本文提出了基于編譯結果比較的代碼區(qū)域信息生成方法,解決了從代碼段中分離數(shù)據(jù)困難的問題;提出了基于代碼區(qū)域信息的動態(tài)指令集隨機化技術,解決了靜態(tài)指令集隨機化密鑰固定的問題;在CPU中實現(xiàn)真隨機數(shù)密鑰生成,解決了軟件生成的偽隨機數(shù)密鑰安全性不高的問題;最后設計了基于硬件的動態(tài)指令集隨機化框架(HDISR,hardware-based dynamic instruction set randomization),實現(xiàn)了內核動態(tài)指令集隨機化與多密鑰的應用程序動態(tài)指令集隨機化。
HDISR總體框架如圖1所示,在CPU中增加了真隨機數(shù)密鑰生成模塊與指令翻譯模塊,前者產生內核密鑰與用戶密鑰,后者選擇密鑰,解密讀入的指令;編譯器支持模塊通過基于編譯結果比較的代碼區(qū)域信息生成方法得到程序代碼段中指令的具體位置信息——代碼區(qū)域信息,與加密密鑰、選用的指令集隨機化方法(靜態(tài)指令集隨機化或者動態(tài)指令集隨機化)組成特征信息,為內核與應用程序的指令集隨機化提供支持;在內核啟動與應用程序裝載時,根據(jù)編譯器提供的代碼區(qū)域信息,使用基于代碼區(qū)域信息的動態(tài)指令集隨機化方法,加密內核與應用程序的代碼;引導程序在內核加載到內存后,根據(jù)內核特征信息加密內核代碼,同時切換CPU執(zhí)行模式為解密模式,實現(xiàn)內核動態(tài)指令隨機化;可執(zhí)行文件加載器裝載可執(zhí)行和可鏈接格式(ELF,executable and linkable format)文件時,使用用戶密鑰加密ELF文件的代碼,在進程上下文切換的同時更新用戶密鑰,實現(xiàn)多密鑰的應用程序動態(tài)指令集隨機化。
HDISR的工作流程如下:CPU產生真隨機數(shù)密鑰,編譯器支持模塊生成代碼區(qū)域信息;根據(jù)代碼區(qū)域信息,引導程序使用內核密鑰(KernelKey)加密內核代碼,內核使用用戶密鑰(UserKey)加密ELF文件的代碼;加密后的指令通過CPU中的指令翻譯模塊解密執(zhí)行。通過CPU、編譯器、引導程序、內核和應用程序的相互配合,HDISR將指令集隨機化引入內核層與應用層的安全防護。
圖1 HDISR總體框架
為了解決軟件實現(xiàn)指令集隨機化存在的性能損耗大和軟件生成的偽隨機密鑰安全性不高等問題,HDISR在CPU上實現(xiàn)了真隨機數(shù)密鑰生成和指令翻譯,此外,設計了密鑰生成指令、CPU執(zhí)行模式切換指令、讀密鑰指令、寫密鑰指令,為內核與應用程序的動態(tài)指令集隨機化提供支持。
3.1.1 真隨機數(shù)密鑰生成
指令集隨機化的安全性依賴于加密密鑰,而軟件生成的隨機密鑰依賴于初始化的種子,不能產生真隨機數(shù)。通過隨機物理現(xiàn)象中獲得隨機性,可以實現(xiàn)真隨機數(shù)發(fā)生器,產生具有不可預測性的隨機序列。本文采用基于振蕩器采樣的真隨機數(shù)生成方法,設計了真隨機數(shù)密鑰生成模塊,生成供指令集隨機化使用的密鑰。
真隨機數(shù)發(fā)生器原理如圖2所示,利用D觸發(fā)器采樣一個周期固定的快振蕩器產生隨機序列。首先使用3個反相器組成的環(huán)形振蕩器作為噪聲源,產生自然抖動;然后以CPU的系統(tǒng)頻率作為采樣頻率s,使用D觸發(fā)器對環(huán)形振蕩器進行采樣輸出;接著對3組環(huán)形振蕩器的采樣結果進行異或,輸出真隨機數(shù)序列。此真隨機數(shù)發(fā)生器產生的隨機數(shù)序列通過了FIPS 140-1 Poker測試;最后使用有窮狀態(tài)機,將產生的隨機數(shù)序列循環(huán)存入內部寄存器。
圖2 真隨機數(shù)發(fā)生器原理
3.1.2 指令翻譯
在HDISR框架中,內核與應用程序的加密指令需要解密后才能正確執(zhí)行。針對軟件實現(xiàn)指令翻譯存在性能損耗大和旁路繞過的問題,HDISR在CPU中實現(xiàn)指令翻譯。在取指令階段與譯碼階段之間加入指令翻譯模塊,對讀入的指令去隨機化,將翻譯后的指令送入譯碼階段,保證指令的正常執(zhí)行。
指令翻譯原理如圖3所示,其中,KernelKey和UserKey由真隨機數(shù)密鑰生成模塊產生,存放在自定義的內部寄存器、內核密鑰寄存器與用戶密鑰寄存器。特權模式(Supervisor)位指示當前執(zhí)行指令的特權模式,為Linux系統(tǒng)的特權模式提供支持。根據(jù)Supervisor位判斷指令的特權模式,從而選擇用戶密鑰或內核密鑰作為解密密鑰解密當前執(zhí)行的指令。在OpenRisc處理器中,特殊寄存器SR中的SM位作為Supervisor位。當SM為1時,表示當前執(zhí)行指令處于內核模式;當SM為0時,表示當前執(zhí)行指令處于用戶模式。在取值階段讀入指令后,指令翻譯的處理流程如下。
圖3 指令翻譯原理
1) 取出指令后,根據(jù)選擇信號判斷當前指令是否需要解密。
①如果不需要,直接執(zhí)行步驟2)。
②否則,根據(jù)指令的Supervisor位,選擇解密密鑰。
a) 如果Supervisor等于0,當前指令處于用戶模式,選擇UserKey作為解密密鑰,解密指令。
b) 否則,當前指令處于內核模式,選擇KernelKey作為解密密鑰,解密指令。
2) 送入譯碼階段,保證指令的正常執(zhí)行。
3.1.3 自定義指令
在HDISR框架中,為了支持內核與應用程序的動態(tài)指令集隨機化,CPU增加了4條指令:密鑰生成指令、CPU執(zhí)行模式切換指令、讀密鑰指令以及寫密鑰指令。
1) 密鑰生成指令:cust8,真隨機數(shù)密鑰生成模塊產生32 bit真隨機數(shù),存入相應的密鑰寄存器。=0時,生成用戶密鑰,存到用戶密鑰寄存器;=1時,生成內核密鑰,存到內核密鑰寄存器。
2) CPU執(zhí)行模式切換指令:cust7,使能選擇信號從而啟動指令翻譯功能,解密后的指令送入譯碼階段。
3) 讀密鑰指令:cust6 rD,,讀取密鑰寄存器,存入通用寄存器rD。=0時,讀取用戶密鑰寄存器;=1時,讀取內核密鑰寄存器。
4) 寫密鑰指令:cust5 rD,,將rD寄存器中的值寫入密鑰寄存器。=0時,寫入用戶密鑰寄存器;=1時,寫入內核密鑰寄存器。
現(xiàn)有的指令集隨機化方法假設代碼段與數(shù)據(jù)段是嚴格區(qū)分的,但是代碼段中可能夾雜數(shù)據(jù),限制了此類方法的通用性。通過分析編譯器的匯編過程,HDISR提出了通用的靜態(tài)指令集隨機化生成方法和基于編譯結果比較的代碼區(qū)域信息生成方法,為內核與應用程序的動態(tài)指令集隨機化提供支持。
3.2.1 靜態(tài)指令集隨機化生成
雖然ELF文件默認是將代碼與數(shù)據(jù)分離的,但還是存在代碼中混入數(shù)據(jù)的情況。例如,在內嵌匯編代碼中定義數(shù)據(jù)會使編譯生成的程序代碼段夾雜著數(shù)據(jù)。現(xiàn)有的靜態(tài)指令集隨機化方法使用objcopy直接加密可執(zhí)行文件的代碼段,不僅會加密其中的指令,還會加密其中夾雜的數(shù)據(jù)。但是代碼段中的數(shù)據(jù)不會被指令翻譯模塊解密,會導致程序執(zhí)行異常。
在編譯過程中,匯編器將指令翻譯為對應的機器碼。通過跟蹤機器碼生成過程,可以在產生指令機器碼的同時加密機器碼,生成靜態(tài)加密的可執(zhí)行文件。在gcc編譯器中,as程序作為匯編器將匯編文件翻譯成目標文件。分析as的處理流程之后發(fā)現(xiàn),指令匯編處理函數(shù)md_assemble()實現(xiàn)了每條指令的匯編。HDISR通過劫持指令的匯編過程,在指令翻譯為機器碼后使用指定的密鑰對指令的機器碼加密,可以生成靜態(tài)指令集隨機化的ELF文件。因此,在匯編過程中只會對指令的機器碼加密,而不會對代碼段中的數(shù)據(jù)加密,避免了整個代碼段加密引起的數(shù)據(jù)加密問題。
3.2.2 代碼區(qū)域信息生成
為了解決從代碼段中剝離數(shù)據(jù)困難的問題,HDISR提出了基于編譯結果比較的代碼區(qū)域信息生成方法,為動態(tài)指令集隨機化提供準確的代碼位置信息,具有更好的通用性。本文定義了代碼區(qū)域信息來描述ELF文件中指令的具體位置,考慮到代碼段中夾雜著數(shù)據(jù),指令區(qū)域是不連續(xù)的,因此定義代碼區(qū)域信息數(shù)據(jù)結構如下。
typedef struct codelayout_info
{
uint32;
vector < uint32, uint32>; //,
}
其中,為代碼段中指令區(qū)域塊的總數(shù),為指令區(qū)域塊的文件偏移,為指令區(qū)域塊的大小。指令區(qū)域塊集合以和為元組組成,元組的個數(shù)為。
在靜態(tài)指令集隨機化生成的ELF文件中,代碼段中只有指令是加密的。通過比較原始的ELF文件和靜態(tài)指令集隨機化生成的ELF文件,根據(jù)代碼段中的內容加密與否判斷是指令還是數(shù)據(jù),再聚合代碼段中的指令位置得到代碼區(qū)域信息。ELF文件的代碼區(qū)域信息生成算法描述如下。
算法1 代碼區(qū)域信息生成算法
輸入 原始的ELF文件、靜態(tài)指令集隨機化生成的ELF文件、加密密鑰
輸出 ELF文件的代碼區(qū)域信息
1) 解析靜態(tài)指令集隨機化生成ELF文件,得到可執(zhí)行屬性節(jié)的節(jié)偏移與大小。
2) 根據(jù)節(jié)偏移與大小,遍歷代碼段中的指令。
3) 利用加密密鑰,解密靜態(tài)指令集隨機化生成的ELF文件中指令的機器碼。
4) 判斷解密后的機器碼與原始ELF文件對應位置的指令機器碼是否相等;如果相等,遍歷ELF文件的代碼區(qū)域信息,判斷是否存在指令區(qū)域塊,使當前指令位置在指令區(qū)域塊的尾部。
①如果存在,則將此指令區(qū)域塊的加上當前指令的大小。
②否則,建立新的指令區(qū)域塊元組<,>,將指令偏移存入,指令大小存入。
代碼區(qū)域信息生成算法同時也適用于內核映像。內核映像通過ELF文件vmlinux生成,使用算法1可以得到vmlinux的代碼區(qū)域信息,再根據(jù)vmlinux與內核映像的對應關系,得到內核映像的代碼區(qū)域信息。
3.2.3 特征信息描述
為了對內核與應用程序的指令集隨機化提供支持,定義了特征信息數(shù)據(jù)結構,將代碼區(qū)域信息、密鑰與指令集隨機化的模式作為文件的特征。其中,字段標識文件采用的指令集隨機化方法(靜態(tài)指令集隨機化或動態(tài)指令集隨機化);字段存放文件使用的密鑰;和表示文件的代碼區(qū)域信息,其具體含義與codelayout_info中一致。特征信息數(shù)據(jù)結構定義如下。
typedef struct feature_info
{
uint32;
uint32;
uint32;
vector < uint32, uint32 >; //,
}
HDISR設計了基于代碼區(qū)域信息的內核動態(tài)指令集隨機化方法,使用內核密鑰加密內核代碼,將指令集隨機化引入內核層的安全防護。本文通過修改引導程序加載內核的過程與指令操作碼判斷的處理流程,實現(xiàn)了內核指令集隨機化。
引導程序在內核代碼加載完成后,會將控制權轉交給內核執(zhí)行。通過修改引導程序啟動內核的流程,在內核映像加載到內存之后,根據(jù)內核代碼區(qū)域信息,使用內核密鑰加密內核代碼;在跳轉到內核執(zhí)行前,切換CPU執(zhí)行模式為解密模式,保證加密的內核指令能在CPU中解密執(zhí)行。嵌入式系統(tǒng)常使用Uboot作為引導程序,下面以Uboot引導加載uImage的過程介紹內核指令集隨機化的啟動過程。
4.1.1 內核代碼加密
內核映像的代碼段中夾雜著數(shù)據(jù),不能直接加密整個代碼段。在HDISR框架中,通過基于編譯結果比較代碼區(qū)域信息生成方法得到內核的代碼區(qū)域信息,再使用硬件生成的內核密鑰對內核的代碼區(qū)域加密,解決了對整個代碼段加密引起的數(shù)據(jù)加密問題。引導程序加載內核時通過隨機產生的內核密鑰對內核代碼重新加密,實現(xiàn)了動態(tài)指令集隨機化。
分析Uboot引導啟動過程之后發(fā)現(xiàn),函數(shù)do_bootm()實現(xiàn)內核映像的加載。通過劫持do_bootm()函數(shù),加密內核的代碼區(qū)域。內核指令集隨機化的啟動過程如圖4所示,通過環(huán)境變量指向uImage末尾的內核特征信息,在映像文件加載到內存后解析內核特征信息,根據(jù)選擇指令集隨機化方法。
如果值為0,表示采用靜態(tài)指令集隨機化,內核映像通過靜態(tài)指令集隨機化生成方法得到,內核代碼已經加密,此時需要通過cust5指令將加密密鑰存入內核密鑰寄存器,保證加密代碼與解密執(zhí)行密鑰的一致性。
圖4 內核指令集隨機化啟動過程
如果值為1,表示采用動態(tài)指令集隨機化,此時需要根據(jù)代碼區(qū)域信息對內核代碼加密。首先cust8指令生成KernelKey,接著cust6指令取出內核密鑰,最后在encrypt_code()函數(shù)中使用KernelKey對內核代碼區(qū)域加密。如果內核被壓縮過,則在內核正確解壓后再加密內核的代碼。
4.1.2 CPU執(zhí)行模式切換
內核代碼加載完成后,引導程序會跳轉到內核代碼執(zhí)行,將控制權轉交給內核。在跳轉到內核代碼執(zhí)行之前,需要切換CPU執(zhí)行模式為解密模式,保證加密的內核代碼能在CPU中正常執(zhí)行。分析Uboot之后發(fā)現(xiàn),內核啟動函數(shù)do_bootm_linux()調用函數(shù)kernel(),實現(xiàn)向內核跳轉執(zhí)行。HDISR需要先使能指令翻譯模塊,再跳轉轉到內核執(zhí)行。cut7指令切換CPU執(zhí)行模式為解密模式,再通過kernel()跳轉到內核執(zhí)行。
在內核代碼加密之后,不能直接使用原始的指令操作碼來判斷指令類型。此時,HDISR需要先解密隨機化的指令,再判斷指令的類型,以保證系統(tǒng)的正常運行。例如,entry.s中的異常處理_data_page_fault_handler需要取出引發(fā)數(shù)據(jù)缺頁的指令,根據(jù)指令的操作碼判斷是否為跳轉指令。此時不能直接根據(jù)操作碼判斷跳轉指令類型,如圖5所示,HDISR會根據(jù)引發(fā)缺頁的指令的特權模式,選擇指令的密鑰(內核密鑰或用戶密鑰)解密指令,再通過原始指令集的操作碼判斷指令類型。
圖5 指令操作碼判斷
HDISR設計了基于代碼區(qū)域信息的應用程序動態(tài)指令集隨機化方法,使用用戶密鑰加密ELF文件的代碼,將動態(tài)指令集隨機化引入應用層的安全防護。此外,在進程上下文切換的同時切換進程密鑰,實現(xiàn)了多密鑰的應用程序動態(tài)指令集隨機化。
為支持基于代碼區(qū)域信息的動態(tài)指令集隨機化,HDISR修改了ELF文件的格式,如圖6所示,在ELF文件中新增一節(jié),存放ELF文件的特征信息,包括指令集隨機化模式、密鑰以及代碼區(qū)域信息。指令集隨機化模式()表示采用的指令集隨機化方法;密鑰()表示ELF文件使用的加密密鑰;代碼區(qū)域信息提供代碼段中指令的準確位置信息。
在Linux內核中,裝載函數(shù)load_elf_binary()只是為可執(zhí)行文件和虛擬地址空間建立映射關系,并未真地將ELF文件的內容讀入內存,只有在真正用到時才會以頁故障方式讀入內存。在HDISR框架中,通過基于編譯結果比較的代碼區(qū)域信息生成方法得到ELF文件的代碼區(qū)域信息,在裝載ELF文件前使用隨機生成的用戶密鑰對ELF文件的代碼區(qū)域加密,確保裝載完成后通過頁故障讀入的代碼是加密的,加密后的指令通過CPU解密執(zhí)行。
圖6 ELF文件格式修改
ELF文件的代碼加密流程如圖7所示,首先解析ELF文件,獲取mydata節(jié)的內容,然后根據(jù)文件的特征信息數(shù)據(jù)結構解析此節(jié)。如果值為0,表示ELF文件的代碼已經加密,實現(xiàn)靜態(tài)指令集隨機化;如果值為1,表示需要隨機生成新的用戶密鑰,重新加密ELF文件的代碼區(qū)域,實現(xiàn)動態(tài)指令集隨機化。在重新加密ELF文件的代碼時,HDISR先使用ELF文件的解密代碼,再用新生成的用戶密鑰加密代碼,最后用新密鑰更新ELF文件特征信息的,保證ELF文件的加密代碼與密鑰的一致性。
圖7 ELF文件代碼區(qū)域加密流程
為了支持不同的應用程序使用不同的密鑰,在進程控制塊(PCB,process control block)中增加了存放進程密鑰的字段,HDISR在ELF文件裝載時將加密密鑰存入中。此外,進程上下文切換的同時需要將新進程的密鑰寫入用戶密鑰寄存器,保證執(zhí)行代碼與指令翻譯模塊中用戶密鑰的一致性。
在HDISR框架中,ELF文件的裝載過程如圖8所示,其中已加密的ELF文件A實現(xiàn)靜態(tài)指令集隨機化,不需要加密文件A的代碼;未加密的ELF文件B實現(xiàn)動態(tài)指令集隨機化,使用隨機生成的用戶密鑰重新加密文件B的代碼。最后在裝載函數(shù)load_elf_binary()中讀取文件特征信息中的加密密鑰,并將其存入PCB的中,保證進程密鑰與進程代碼的一致性。
在上下文切換函數(shù)context_switch()調用switch_to()函數(shù)切換進程的寄存器集合的同時,HDISR會使用cust5指令將新進程的存入用戶密鑰寄存器。因此,新進程的代碼執(zhí)行時,CPU使用相應的用戶密鑰解密代碼。需要注意的是,ELF文件裝載完成后,如果首次調入執(zhí)行的是此次裝載的進程,此時不會切換進程的上下文和進程密鑰,且HDISR會在load_elf_binary()函數(shù)中將進程密鑰寫入用戶密鑰寄存器。
圖8 ELF文件裝載過程
本文選取OR1200處理器與Linux 3.4版本實現(xiàn)了HDISR框架,OR1200是基于OpenRisc 1000架構的32位RISC處理器。加密算法采用32位的異或加密,將修改后的OR1200處理器下載到Xilinix atlys開發(fā)板中的FPGA芯片中,并在開發(fā)板上運行支持指令集隨機化的Linux系統(tǒng)。通過公開的內核漏洞與應用程序漏洞的攻擊實驗,驗證了HDISR對代碼注入攻擊的防御效果。最后選取SPEC測試集測試了HDISR的性能損耗,實驗結果表明,HDISR能夠抵御代碼注入攻擊,而且性能損耗較低。
為了驗證HDISR對代碼注入攻擊防御的有效性,本文選擇了表1中的5個漏洞,其中包括2個內核漏洞和3個用戶級緩沖區(qū)溢出漏洞。在原始Linux系統(tǒng)和應用程序上測試,能成功執(zhí)行注入的漏洞利用代碼。在Linux系統(tǒng)和應用程序經過HDISR保護后,注入的代碼執(zhí)行失敗,程序異常崩潰。HDISR會對Linux系統(tǒng)和應用程序使用的指令集進行隨機化處理,而注入的漏洞利用代碼仍然依據(jù)原始指令集生成,執(zhí)行錯誤指令集的代碼會引起非法指令異常,導致程序崩潰。實驗結果表明,HDISR可以有效地阻止代碼注入攻擊,將代碼注入攻擊降級為拒絕服務攻擊,對現(xiàn)有的內核級別和用戶級別的遠程代碼執(zhí)行漏洞具有較好的防御效果。
表1 HDISR防御代碼注入攻擊的測試集
本文選取FPGA中的FF寄存器和查找表資源來度量硬件損耗,以原始OR1200處理器綜合后的資源損耗作為基準計算HDISR的資源損耗增加的百分比。HDISR額外的硬件損耗如表2所示,額外硬件消耗均低于2.57%,其中FF寄存器資源損耗增加了2.57%,查找表資源損耗增加了1.71%。
選用SPEC CPU2006測試集[16]來測試HDSIR的性能損耗,包括運行時性能損耗和啟動延時兩方面。運行時性能損耗來源于指令翻譯和密鑰切換,通過靜態(tài)指令集隨機化運行耗時來度量。運行時性能損耗的定義如下。
表2 HDISR額外的硬件損耗
HDISR加密代碼會帶來程序的啟動延時,延時與程序的代碼大小有關,通過啟動延時與代碼大小的比值來度量代碼加密效率。加密效率的定義如下。
HDISR的性能測試結果如表3所示,結果表明,平均運行時性能損耗為0.566%,且所有測試程序的運行時性能損耗都低于0.9%;程序的啟動延時與二進制文件中的可執(zhí)行代碼的大小相關,每兆字節(jié)的代碼加密平均帶來0.31 s的延時。
本文設計并實現(xiàn)了基于硬件的動態(tài)指令集隨機化框架HDISR,將指令集隨機化方法引入內核層和應用層的安全防護,提高了系統(tǒng)安全性。內核使用單獨的內核密鑰,同時每個應用程序都有各自的密鑰,防止單個密鑰丟失而導致整個系統(tǒng)的淪陷。HDISR面臨內存代碼泄露的威脅,由此降低了加密機制分析和密鑰猜解難度,下一步將研究限制代碼可執(zhí)行但不可讀的方法以應對內存代碼泄露風險。
表3 SPEC測試集測試結果
[1] NIST. USA national vulnerability database[EB/OL]. http://web. nvd.nist.gov/view/vuln/statistics.
[2] CHEN P, WANG J, PAN L, et al. Research and implementation of SQL injection prevention method based on ISR[C]//IEEE International Conference on Computer and Communications. 2017: 1153-1156.
[3] BARUA A, ZULKERNINE M, WELDEMARIAM K. Protecting Web browser extensions from JavaScript injection attacks[C]//The International Conference on Engineering of Complex Computer Systems. 2013: 188-197.
[4] 湯戰(zhàn)勇, 李光輝, 房鼎益, 等. 一種具有指令集隨機化的代碼虛擬化保護系統(tǒng)[J]. 華中科技大學學報(自然科學版), 2016, 44(3): 28-33.
TANG Z Y, LI G H, FANG D Y, et al. Code virtualized protection system with instruction set randomization[J]. Journal of Huazhong University of Science and Technology (Natural Science Edition), 2016, 44(3): 28-33.
[5] DANGER J L, GUILLEY S, PRADEN F. Hardware-enforced protection against Software reverse-engineering based on an instruction set encoding[C]//ACM Sigplan on Program Protection and Reverse Engineering Workshop. 2014: 5.
[6] LIU B, WANG B. Embedded reconfigurable logic for ASIC design obfuscation against supply chain attacks[C]//Design, Automation and Test in Europe Conference and Exhibition. 2014:1-6.
[7] KC G S, KEROMYTIS A D, PREVELAKIS V. Countering code-injection attacks with instruction-set randomization[C]// ACM Conference on Computer and Communications Security. 2003: 272-280.
[8] PORTOKALIDIS G, KEROMYTIS A D. Fast and practical instruction-set randomization for commodity systems[C]//Computer Security Applications Conference. 2010:41-48.
[9] PORTOKALIDIS G, KEROMYTIS A D. Global ISR: toward a comprehensive defense against unauthorized code execution[M]// Moving Target Defense. New York: Springer, 2011: 49-76.
[10] 王奕森, 舒輝, 謝耀濱, 等. 基于指令集隨機化的代碼注入型攻擊防御技術[J]. 計算機應用與軟件, 2016, 33(5): 312-316.
WANG Y S, SHU H, XIE Y B, et al. Defense technology against code-injection attacks based on instruction set randomization[J]. Computer Applications and Software, 2016, 33(5): 312-316.
[11] SOVAREL A N, EVANS D, PAUL N. Where's the FEEB? the effectiveness of instruction set randomization[C]//USENIX Security Symposium. 2005: 10.
[12] PAPADOGIANNAKIS A, LOUTSIS L, PAPAEFSTATHIOU V, et al. ASIST: architectural support for instruction set randomization[C]//ACM Sigsac Conference on Computer & Communications Security. 2013: 981-992.
[13] SINHA K, KEMERLIS V P, SETHUMADHAVAN S. Reviving instruction set randomization[C]//IEEE International Symposium on Hardware Oriented Security and Trust. 2017.
[14] 歐海文, 趙靜, 于慧紅, 等. 基于振蕩器的真隨機數(shù)發(fā)生器的研究[J]. 通信技術, 2011, 44(12):153-155. OU H W, ZHAO J, YU H H, et al. Study on oscillator-based truly random number generator[J]. Communications Technology, 2011, 44(12): 153-155.
[15] 郭弘, 劉鈺, 黨安紅, 等. 物理真隨機數(shù)發(fā)生器[J]. 科學通報, 2009(23):3651-3657.
GUO H, LIU Y, DANG A H, et al. Physical true random number generator[J]. Chinese Science Bulletin, 2009(23): 3651-3657.
[16] HENNING J L. SPEC CPU2006 benchmark descriptions[J]. ACM Sigarch Computer Architecture News, 2006, 34(4): 1-17.
Design and implementation of hardware-based dynamic instruction set randomization framework
DU San, SHU Hui, KANG Fei
(State Key Laboratory of Mathematical Engineering and Advanced Computing, Information Engineering University, Zhengzhou 450001, China)
All the existing ISR methods have some defects including stripping data from code segment is hard to accomplish, static ISR has fixed key and pseudo-random key is not secure. To introduce ISR technology into the security protection of kernel layer and application layer, hardware-based dynamic instruction set randomization framework (HDISR) was designed and implemented, in which program code was encrypted at loading time. Kernel encryption uses kernel key and applications encryption uses a different user key per process. The experimental results show that HDISR can degrade code injection attack to Denial of Service attack with less than 2.57% additional hardware and 0.31s startup delay of each megabyte code encryption.
code injection attack, instruction set randomization, dynamic instruction set randomization, kernel
TP309.1
A
10.11959/j.issn.2096-109x.2017.00216
杜三(1993-),男,四川射洪人,信息工程大學碩士生,主要研究方向為網(wǎng)絡安全與嵌入式系統(tǒng)安全。
舒輝(1974-),男,江蘇鹽城人,博士,信息工程大學教授,主要研究方向為網(wǎng)絡安全、嵌入式系統(tǒng)分析與信息安全。
康緋(1972-),女,河南周口人,碩士,信息工程大學教授,主要研究方向為網(wǎng)絡信息安全。
2017-09-27;
2017-10-19。
杜三,qq13882525704@sina.com
國家重點研發(fā)計劃基金資助項目(No.2016YFB08011601)
The National Key R&D Plan Program of China (No.2016YFB08011601)