本發(fā)明屬于計(jì)算機(jī)技術(shù)技術(shù)領(lǐng)域,涉及一種程序控制流隱藏的方法。
背景技術(shù):
目前,公有云服務(wù)得到了廣泛應(yīng)用,用戶可將程序上傳至公有云上,由公有云完成計(jì)算。然而,由于公有云的不透明性,程序運(yùn)行的安全難以得到保障。外包程序的算法保密性是云安全中一個重要問題。當(dāng)用戶將程序上傳至公有云上,攻擊者可通過靜態(tài)分析和動態(tài)分析逆向分析出程序的源代碼,從而還原程序算法。如果用戶程序具有創(chuàng)新性,這一攻擊將侵犯用戶的程序版權(quán)。即使用戶程序不具有創(chuàng)新性,逆向分析程序?qū)⑿孤┏绦蜻壿?,黑客將通過泄漏的程序邏輯尋找程序弱點(diǎn)(vulnerability),為進(jìn)一步攻擊程序做好準(zhǔn)備。因此需要一種程序運(yùn)行時保護(hù)機(jī)制,以保證程序遠(yuǎn)程計(jì)算時的程序邏輯保密性。程序控制流是程序邏輯的重要部分,保護(hù)程序控制流保密性將大大提高程序邏輯機(jī)密性。本發(fā)明針對程序控制流,提出一種保密方法。
目前主流的程序的算法保護(hù)技術(shù)稱為程序混淆技術(shù)。大多數(shù)程序混淆技術(shù)假設(shè)程序在一個完全不可信的環(huán)境下運(yùn)行。在這種環(huán)境下對程序進(jìn)行變換并隱藏程序是非常困難的。Barak[1]等人在論文中已證明不存在一種通用的混淆方法可以混淆所有的程序。因此目前研究者的方法主要集中于對程序的部分混淆,其中一部分人研究對程序的控制流進(jìn)行混淆。很多方案都是將程序分枝語句的條件進(jìn)行數(shù)學(xué)轉(zhuǎn)換,包括將條件的左右兩端進(jìn)行加密(Sharif[2]等人),對密文進(jìn)行匹配,該方法僅適用于相等條件;將條件語句轉(zhuǎn)變成未知數(shù)學(xué)難題(Wang[3]等人),等。無論如何變換,此類方法均將分枝語句條件展現(xiàn)在攻擊者面前,理論上攻擊者仍可通過靜態(tài)分析分析出程序邏輯。另一方面,攻擊者也可通過動態(tài)分析跟蹤條件與分支,進(jìn)一步解析出程序邏輯。
與本發(fā)明類似的思路包括將程序分解成兩個或多個程序,通過多個程序協(xié)同工作完成程序計(jì)算。例如,Ge[4]的文章將程序控制跳轉(zhuǎn)分離到另一個進(jìn)程中,程序指令的跳轉(zhuǎn)地址通過查詢另一進(jìn)程的跳轉(zhuǎn)表獲取。該方法只能滿足靜態(tài)跳轉(zhuǎn),無法滿足動態(tài)分支判定。同時,另一個進(jìn)程的跳轉(zhuǎn)表跟主程序在同一個主機(jī)上,事實(shí)上也暴露給了黑客。Wang[5]的文章將公有云上的程序分支判定部分分離到另一個私有云上,程序跳轉(zhuǎn)通過跨云的遠(yuǎn)程程序調(diào)用實(shí)現(xiàn)。由于跨云函數(shù)調(diào)用的存在,該方法具有較高的開銷。
[1]Barak Boaz,Goldreich Oded,Impagliazzo Russell,Rudich Steven,Sahai Amit,Vadhan Salil,et al.On the(im)possibility of obfuscating programs.J ACM May 2012;59(2).Article 6.
[2]Sharif Monirul,Lanzi Andrea,Giffin Jonathon,Lee Wenke.Impeding malware analysis using conditional code obfuscation.In:Proceedings of the 15th annual network and Distributed System Security Symposium.NDSS;2008.
[3]Wang Zhi,Ming Jiang,Jia Chunfu,Gao Debin.Linear obfuscation to combat symbolic execution.In:Proceedings of the 16th European Symposium on Research in Computer Security(ESORICS 2011).Berlin Heidelberg:Springer;2011.p.210e26.
[4]Ge Jun,Chaudhuri Soma,Tyagi Akhilesh.Control flow based obfuscation.In:Proceedings of the 5th ACM workshop on Digital Rights Management.ACM;2005.p.83e92.
[5]Yongzhi Wang,Jinpeng Wei,Toward protecting control flow confidentiality in cloud-based computation,Computers&Security,Volume 52,July 2015,Pages 106-127,ISSN 0167-4048
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種程序分枝語句條件的機(jī)密性保護(hù)方法,解決了現(xiàn)有技術(shù)中存在的問題。
一種面向遠(yuǎn)程計(jì)算的控制流隱藏方法,包括以下步驟:
步驟1,獲取用戶程序,并將用戶程序轉(zhuǎn)換為三地址碼程序;
所述三地址碼程序包括I個語句,其中任意一個語句為si,i=1,2,…I,I為大于等于1的自然數(shù),語句si由J個分支語句xj和M個非分支語句ym組成,j=1,2,…J,m=1,2,…M,J<I,M<I;其中,分支語句xj為:if(a OP b)goto L;a、b為分支語句xj的變量,OP為比較操作;L為如果(a OP b)結(jié)果為真則跳轉(zhuǎn)到的語句,L∈{si|i=1,2,...I};
分支語句xj的編號為lj;非分支語句ym的編號為lm;
步驟2,獲取三地址碼程序中語句si可訪問的變量和語句si使用到的變量,將語句si可訪問的變量組成變量集合Vi,將語句si使用到的變量組成變量集合Ui;
所述語句si可訪問的變量為,在語句si之前的語句及語句si中使用并屬于語句si作用域的變量;
所述語句si使用到的變量為,在語句si中出現(xiàn)的變量;
步驟3,構(gòu)建公開程序,包括:每個語句si均經(jīng)過步驟31和步驟32的處理;
步驟31,將分支語句xj替換為:if(QuerySGX(Lj,lj))goto L,構(gòu)造分支語句條件列表組Tj={ja,jb,OP};
Lj為將分支語句xj的參數(shù)集合Pj中的元素隨機(jī)排列形成的參數(shù)列表;
參數(shù)集合Pj為:Pj=Uj∪SUBSET(Vj-Uj);
其中,Vj為語句分支語句xj可訪問的變量組成的變量集合;Uj為分支語句xj使用到的變量組成的變量集合;SUBSET(Vj-Uj)為Vj-Uj的任意子集;
ja為a在Lj中的位置,jb為b在Lj中的位置;ja為大于等于0的整數(shù),jb為大于等于0的整數(shù);
步驟32,在非分支語句ym前插入if(QuerySGX(Lm,lm))goto構(gòu)造非分支語句條件列表組Tm={false};
其中,Lm為將非分支語句ym的參數(shù)集合Pm中的元素隨機(jī)排列形成的參數(shù)列表;為非ym的語句;
參數(shù)集合Pm為:Pm=Um∪SUBSET(Vm-Um);
其中,Vm為語句非分支語句ym可訪問的變量組成的變量集合;Um為分支語句xm使用到的變量組成的變量集合;SUBSET(Vm-Um)為Vm-Um的任意子集;
步驟4,構(gòu)建條件列表組集合文件,包括:
將所有分支語句的條件列表組和非分支語句的條件列表組組成條件列表組集合文件,所述條件列表組集合文件中包括Tj和lj的映射列表,以及Tm和lm的映射列表,即lj與Tj、lm與Tm相互唯一映射;
將該條件列表組集合文件用對稱加密方法進(jìn)行加密,加密密鑰由用戶管理;
步驟5,構(gòu)建可信程序,包括:
讀入所述的條件列表組集合文件,接著對條件列表組集合文件解密后,獲得映射列表;
構(gòu)建QuerySGX函數(shù),所述QuerySGX函數(shù)的功能包括:調(diào)用QuerySGX(Lk,lk),k∈j∪m;
通過lk在獲得的映射列表中查找對應(yīng)的Tk,當(dāng)Tk={False}時,則返回false;
通過lk在獲得的映射列表中查找對應(yīng)的Tk,當(dāng)Tk={ja,jb,OP}時,則以ja,jb為索引找到Lk中對應(yīng)的變量a和b,結(jié)合OP,得到三地址碼程序中分支語句條件(a OP b),并返回(a OP b)的布爾值;
步驟6,拷貝可信程序、條件列表組集合文件及公開程序至公有云,再將可信程序加載至SGX的enclave中;
步驟7,在公有云中運(yùn)行程序,包括:
執(zhí)行公開程序,當(dāng)遇到QuerySGX函數(shù)則調(diào)用可信程序中的QuerySGX函數(shù)。
進(jìn)一步地,步驟5中所述的對條件列表組集合文件解密是指:
通過SGX遠(yuǎn)程驗(yàn)證協(xié)議檢查可信程序是否完整,若可信程序完整則將用戶管理的密鑰發(fā)送至可信程序;使用密鑰對條件列表組集合文件進(jìn)行解密。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下技術(shù)效果:
(1)本發(fā)明通過利用Intel第六代處理器的安全執(zhí)行環(huán)境的SGX功能,將程序分枝語句的條件判定放在具有硬件保護(hù)功能的可信區(qū)域進(jìn)行,從而實(shí)現(xiàn)了程序分枝語句條件的真正隱藏,同時引起較小的程序運(yùn)行開銷;
(2)本發(fā)明可有效抵御在公有云上的基于靜態(tài)分析和動態(tài)分析的逆向工程攻擊。對于每個分支語句,攻擊者通過動態(tài)分析可觀測出傳入?yún)?shù)和返回結(jié)果,然而,傳入?yún)?shù)眾多,攻擊者很難判定具體哪個參數(shù)參與了分枝條件的判定,從而很難還原出原始判定邏輯。對于偽分支語句,雖然該分支語句只返回相同的值,然而由于傳入的參數(shù)眾多,黑客很難區(qū)分該情況屬于條件未觸發(fā)還是屬于偽分支語句。因此,本發(fā)明可以有效實(shí)現(xiàn)程序控制流的隱藏。
(3)從效率角度來說,本發(fā)明使得控制流隱藏在公有云內(nèi)部,從而避免了頻繁的跨云或跨主機(jī)函數(shù)調(diào)用,從而降低了運(yùn)行開銷。
附圖說明
圖1為本發(fā)明的總體部署圖;
圖2(a)為實(shí)施例中未實(shí)施本方法前的程序;圖2(b)為實(shí)施例中實(shí)施本方法后的程序。
具體實(shí)施方式
下面通過附圖和實(shí)施例對本發(fā)明作進(jìn)一步的說明。
步驟1,獲取用戶程序,并將用戶程序轉(zhuǎn)換為三地址碼程序;
所述三地址碼程序包括I個語句,其中任意一個語句為si,i=1,2,…I,I為大于等于1的自然數(shù),語句si由J個分支語句xj和M個非分支語句ym組成,j=1,2,…J,m=1,2,…M,J<I,M<I;其中,分支語句xj為:if(a OP b)goto L;a、b為分支語句xj的變量,OP為比較操作,為六種操作(>,<,>=,<=,==,!=)中的一種;L為如果(a OP b)結(jié)果為真則跳轉(zhuǎn)到的語句,L∈{si|i=1,2,...I};
分支語句xj的唯一編號為lj;非分支語句ym的編號為lj;
本實(shí)施例中的語句si是指:程序中的任意一條語句,例如圖2(a)中的int size;int low=0。
本實(shí)施例中的分支語句xj是指:程序中的選擇語句,例如圖2中用戶程序的if(data[middle]==key){return true;};其中,分支語句xj的變量a和b分別為:data[middle]和key;OP為==操作;L為return true語句;該分支語句的編號lj為11。
步驟2,對三地址碼程序進(jìn)行靜態(tài)分析,獲取三地址碼程序中語句si可訪問的變量和語句si使用到的變量,將語句si可訪問的變量組成變量集合Vi,將語句si使用到的變量組成變量集合Ui;顯然語句si可訪問但未使用的變量集合為Vi-Ui。
所述語句si可訪問的變量為,在語句si之前的語句及語句si中使用并屬于語句si作用域的變量;
所述語句si使用到的變量為,在語句si中出現(xiàn)的變量;
如圖2(a)所示,例如語句si為:int low=0;則該語句可訪問的變量為data、size和low;該語句使用到的變量為:low。
若語句si為分支語句if(data[middle]==key){return true;};則該語句可訪問的變量為data、size、low、high、middle、data[middle]、data[low]、data[high]、key;該語句使用到的變量為data[middle]、key;
步驟3,構(gòu)建公共程序,包括:每個語句si均經(jīng)過步驟31和步驟32的處理;
1)對于分支語句xj,即if(a OP b)goto L,根據(jù)步驟2的定義,可知Uj={a,b}。將分支語句xj替換為:if(QuerySGX(Lj,lj))goto L,構(gòu)造分支語句條件列表組Tj={ja,jb,OP};Lj為將分支語句xj的參數(shù)集合Pj中的元素隨機(jī)排列形成的參數(shù)列表;
參數(shù)集合Pj為:Pj=Uj∪SUBSET(Vj-Uj);
其中,Vj為語句分支語句xj可訪問的變量組成的變量集合;Uj為分支語句xj使用到的變量組成的變量集合;SUBSET(Vj-Uj)為Vj-Uj的任意子集;
ja為a在Lj中的位置,jb為b在Lj中的位置;ja為大于等于1的自然數(shù),jb為大于等于1的自然數(shù);
QuerySGX函數(shù)將在SGX的enclave中執(zhí)行。
圖2(b)顯示了對二分查找代碼的轉(zhuǎn)換結(jié)果。如圖2(b)所示,轉(zhuǎn)換后的程序中,原有分支語句都被替換成QuerySGX函數(shù)調(diào)用(見行9,11,14,17),同行注釋中顯示了對應(yīng)的Tj分支語句條件列表組的內(nèi)容。
例如,圖2(a)中的行11的分支語句為:if(data[middle]==key){return true;};該分支語句的Vj為(data、size、low、high、middle、data[middle]、data[low]、data[high]、key),Uj為(data[middle]、key),則Vj-Uj為(data、size、low、high、middle),Pj為(key,high,low,middle,data[low],data[high],data[middle]),Lj為(key,high,low,middle,data[low],data[high],data[middle]);如圖2(b)替換該分支語句為:if(QuerySGX(key,high,low,middle,data[low],data[high],data[middle]));由于分支語句變量data[middle]和key的編號分別為6和0,OP為==,所以Tj為{6,0,==}。
2)在非分支語句ym前插入if(QuerySGX(Lm,lm))goto構(gòu)造條件列表組Tm={false};
其中,Lm為將非分支語句ym的參數(shù)集合Pm中的元素隨機(jī)排列形成的參數(shù)列表;為非ym的語句;
參數(shù)集合Pm為:Pm=Um∪SUBSET(Vm-Um);
其中,Vm為語句非分支語句ym可訪問的變量組成的變量集合;Um為分支語句xm使用到的變量組成的變量集合;SUBSET(Vm-Um)為Vm-Um的任意子集;
如圖2(b)所示,行9.1為插入在行10前面的非分支語句;行14.1和14.2為插入在行15前面的非分支語句。每行后面的注釋顯示了Tm的內(nèi)容。需要說明的是,對于一條非分支語句,可隨機(jī)插入若干偽分支語句,(如行14.1,14.2所示)。
例如,對于圖2(a)中的行10的非分支語句:int middle=(low+high)/2;該非分支語句的Vm為(low,size,high,middle,key),Um為(middle,low,high),則Pm為(key,high,low,size),Lm為(key,high,low,size);如圖2(b)在行10的非分支語句前插入的語句為:if(QuerySGX(key,high,low,size))goto line 14;Tm={false}。
步驟4,構(gòu)建條件列表組集合文件,包括:
將所有分支語句的條件列表組和非分支語句的條件列表組組成條件列表組集合文件SETTs,所述條件列表組集合文件中包括Tj和lj的映射列表,以及Tm和lm的映射列表,即lj與Tj、lm與Tm相互唯一映射;
將該條件列表組集合文件用對稱密鑰sk進(jìn)行對稱加密,生成文件Esk(SETTs),加密密鑰sk由用戶管理;
步驟5,構(gòu)建可信程序,包括:
讀入所述的條件列表組集合文件,接著對條件列表組集合文件解密后,獲得映射列表;
所述的對條件列表組集合文件解密是指:
通過SGX遠(yuǎn)程驗(yàn)證協(xié)議檢查可信程序是否完整,若可信程序完整則將用戶管理的密鑰發(fā)送至可信程序;使用密鑰對條件列表組集合文件進(jìn)行解密。
檢查可信程序是否完整的過程為SGX標(biāo)準(zhǔn)過程,詳情參見SGX開發(fā)手冊。
構(gòu)建QuerySGX函數(shù),所述QuerySGX函數(shù)的功能包括:對于函數(shù)調(diào)用QuerySGX(Lk,lk),k∈j∪m;
通過lk在獲得的映射列表中查找對應(yīng)的Tk,當(dāng)Tk={False}時,則返回false;即執(zhí)行當(dāng)前語句;
通過lk在獲得的映射列表中查找對應(yīng)的Tk,當(dāng)Tk={ja,jb,OP}時,則以ja,jb為索引找到Lk中對應(yīng)的變量a和b,結(jié)合OP,得到三地址碼程序中分支語句條件(a OP b),并返回(a OP b)的布爾值;布爾值為true或false,當(dāng)布爾值為true時,跳轉(zhuǎn)到語句L;當(dāng)布爾值為false時,執(zhí)行當(dāng)前語句;
步驟6,拷貝可信程序、條件列表組集合文件及公開程序至公有云,創(chuàng)建SGX的enclave,再將可信程序加載至該enclave中;
步驟7,在公有云中運(yùn)行程序,包括:
執(zhí)行公開程序時,當(dāng)遇到QuerySGX函數(shù)則調(diào)用可信程序中的QuerySGX函數(shù)。
本實(shí)施例選用的是Intel第六代處理器的安全執(zhí)行環(huán)境的SGX功能,將程序分枝語句的條件判定放在具有硬件保護(hù)功能的可信區(qū)域進(jìn)行,從而實(shí)現(xiàn)了程序分枝語句條件的真正隱藏。
Intel第六代處理器的安全執(zhí)行環(huán)境的SGX功能詳細(xì)技術(shù)細(xì)節(jié)參見:
[6]Intel software guard extensions developer guide.https://download.01.org/intel-sgx/linux-1.6/docs/Intel_SGX_Devel oper_Guide.pdf
[7]Intel software guard extensions SDK for Linux OS Developer reference.https://01.org/intel-software-guard-extensions/documentation/int el-sgx-sdk-developer-reference
[8]Costan,Victor,and Srinivas Devadas.Intel sgx explained.Cryptology ePrint Archive,Report 2016/086,2016.https://eprint.iacr.org/2016/086.