馬巧梅 胡沙沙 陳夠喜
(中北大學(xué)計算機(jī)與控制工程學(xué)院 山西 太原 030051)
?
基于完整性驗證的軟件防篡改方案
馬巧梅胡沙沙陳夠喜
(中北大學(xué)計算機(jī)與控制工程學(xué)院山西 太原 030051)
為了解決軟件響應(yīng)和驗證易受攻擊的問題,對現(xiàn)有的防篡改方案進(jìn)行研究,提出一種基于完整性驗證的防篡改模型TPM(Tamper Proofing Model)。該方案將軟件分為多個單元,采用多種加密方式加密軟件,對程序的控制流進(jìn)行完整性驗證得到Hash值,通過隱藏在程序中的密鑰生成函數(shù),利用得到的哈希值、注冊碼和用戶碼來計算各個加密單元的解密密鑰。理論分析和實驗結(jié)果表明,該模型無需修改底層硬件,易于實現(xiàn),開銷小且算法安全性高。
防篡改完整性驗證控制流安全性
防篡改技術(shù)是通過軟硬件措施防止軟件被非法修改、分發(fā)和使用的一種技術(shù)和科學(xué)[1]。現(xiàn)有防篡改技術(shù)分為兩類[2]:一類是靜態(tài)防篡改技術(shù);另一類是動態(tài)防篡改技術(shù)。前者針對程序靜態(tài)分析,阻止攻擊者對程序?qū)嵤┠嫦蚬こ桃蕴崛〕绦虻暮诵拇a;后者阻止攻擊者篡改程序,使意圖篡改者無法執(zhí)行原功能。完整性驗證[3-5]是目前動態(tài)防篡改技術(shù)的一個重要研究領(lǐng)域。Jacob等人[6]利用代碼重疊技術(shù)將隱式指令嵌入目標(biāo)代碼,用于驗證程序運(yùn)行時狀態(tài)和指令的完整性。控制流完整性[7]是通過保證控制流的完整性來實現(xiàn)軟件防篡改的方法。主要通過所得運(yùn)算值與預(yù)期值的比較來判斷軟件是否被篡改。軟件哨兵[8,9]是通過分布式來實現(xiàn)程序代碼的保護(hù),但哨兵本身的安全性無法保證。余艷瑋等[10]在此基礎(chǔ)上又提出了基于三線程和軟件哨兵的防篡改技術(shù),該技術(shù)利用改進(jìn)的三線程結(jié)構(gòu)來保護(hù)哨兵自身安全,其保護(hù)力度得到明顯的提高。張貴民等人[11]提出了基于函數(shù)級控制流監(jiān)控的軟件防篡改,由監(jiān)控模塊實時獲取哨兵發(fā)送的軟件運(yùn)行狀態(tài),通過對比運(yùn)行狀態(tài)和預(yù)期值判斷程序是否被篡改。在目前的防篡改方案中,如隱式哈希和控制流檢測都涉及與預(yù)期值比較,不合理的預(yù)期值預(yù)存方案將成為攻擊者的突破口,攻擊者可以通過替換預(yù)期值從而成功通過完整性驗證。
針對現(xiàn)有方案的不足,本文提出基于完整性驗證的防篡改模型。該模型使用多種方法加密軟件,利用完整性驗證得到的Hash值來計算每個加密模塊的解密密鑰。如果軟件被篡改,解密密鑰的計算就會出錯,解密失敗。該方案能加大軟件的保護(hù)力度,不依賴硬件設(shè)施,成本低且易于實現(xiàn)。
完整性驗證是通過插入驗證代碼等驗證機(jī)制來驗證程序的完整性,以此來判斷程序是否被篡改。現(xiàn)有的防篡改方案不能保證驗證代碼的安全性且驗證機(jī)制易受攻擊。基于此,本文提出了一種基于完整性驗證的防篡改模型TPM,模型如圖1所示。

圖1 基于完整性驗證的防篡改模型
模型中相關(guān)符號描述如下:
Pi:程序被分塊后的第i個單元塊;
Ci:被加密后程序的第i個單元塊;
K1i:第i個單元塊的加密密鑰;
K2i:第i個單元塊的解密密鑰;
Ei:第i個單元塊的加密算法;
Di:第i個單元塊的解密密鑰;
Fi:第i個單元塊的密鑰生成函數(shù);
G:分解函數(shù),將用戶碼和注冊碼進(jìn)行分段處理;
CF[]:用于存儲函數(shù)運(yùn)行信息的數(shù)組;
Hi(CF[]):第i個單元塊運(yùn)行信息生成的Hash值;
Ui:用戶碼被分解后的第i個值;
Ri:注冊碼被分解后的第i個值。
TPM由若干個代碼單元組成,在程序執(zhí)行之前,所有的單元均處于加密狀態(tài)。在用戶獲得軟件后,需要輸入用戶碼和注冊碼,程序會將收到的用戶碼和注冊碼分段寫入自定義格式的數(shù)據(jù)文件中,再結(jié)合軟件運(yùn)行所得到的信息解密各個加密單元塊,從而執(zhí)行相應(yīng)的功能。
該模型主要有以下特點:(1) 直接對二進(jìn)制文件操作,不依賴源代碼。(2) 無需對底層硬件和操作系統(tǒng)進(jìn)行修改。(3) 無需存儲程序的預(yù)期信息,可以避免被攻擊者修改。(4) 哨兵是程序執(zhí)行必不可少的一部分,能夠避免被攻擊者移除。(5) 驗證及響應(yīng)被解密所替代,能夠避免被篡改,在防篡改的同時加大了對程序的保護(hù)力度。
所有的非法篡改,最終都體現(xiàn)在控制流的改變上,所以對控制流的監(jiān)控可以檢測軟件是否被防篡改。程序按函數(shù)來劃分為不同的功能模塊,所以可以通過驗證函數(shù)控制流的完整性來保證程序的完整性。如何獲取控制流以及如何根據(jù)所得到的控制流來判斷程序是否被篡改是本文需要解決的問題。
2.1控制流的獲取
多數(shù)防篡改機(jī)制都是向軟件中植入監(jiān)控代碼來實現(xiàn),監(jiān)控代碼即為哨兵,通過哨兵實時獲取軟件的運(yùn)行狀態(tài),哨兵的植入無需修改底層操作系統(tǒng),易于實現(xiàn),合理選擇植入位置和數(shù)量能夠減少對軟件性能的影響。控制流圖是一個過程或程序的抽象表現(xiàn),用以描述軟件行為,既可以通過源文件獲取,也可以通過對二進(jìn)制文件進(jìn)行靜態(tài)分析來獲取。從二進(jìn)制文件獲取控制流圖[12]的研究成果較多,在本文中,軟件的正常運(yùn)行行為用函數(shù)級控制流圖來描述。
函數(shù)的執(zhí)行序列即為程序的運(yùn)行狀態(tài),為了獲取軟件的運(yùn)行信息,可以在程序中植入哨兵。為了保證監(jiān)控的力度,可在每個函數(shù)入口處植入哨兵,哨兵執(zhí)行完后再執(zhí)行函數(shù)的功能。本文中的哨兵只執(zhí)行跳轉(zhuǎn)功能,即將哨兵后的函數(shù)名發(fā)送給完整性驗證函數(shù)數(shù)組,該數(shù)組按每個函數(shù)的執(zhí)行順序存放各函數(shù)名,用于后續(xù)的完整性驗證。圖2為示例程序的函數(shù)級控制流圖。

圖2 程序example的函數(shù)控制流圖
獲取函數(shù)的控制流圖, 是為了用函數(shù)的運(yùn)行信息來判斷程序是否被篡改。用一個數(shù)組CF[]來存儲函數(shù)的運(yùn)行信息,每當(dāng)執(zhí)行一個函數(shù),哨兵就會將要執(zhí)行函數(shù)的函數(shù)名發(fā)送給該數(shù)組,數(shù)組按發(fā)送的順序來存儲各函數(shù)名。所有哨兵共享此部分代碼,每讀取完一次數(shù)組信息,就將數(shù)組清空,以接收下一個單元的相關(guān)運(yùn)行信息,實現(xiàn)數(shù)組共享。
2.2分存策略
防篡改機(jī)制彈性的強(qiáng)弱即機(jī)制的抗攻擊性強(qiáng)弱,本方案的驗證機(jī)制被解密功能所替代。若想篡改軟件,首先應(yīng)解密所有程序,即必須先獲得所有解密密鑰。為了增大機(jī)制的抗攻擊性,本方案采取分存策略,即將一個載體分解為多個載體進(jìn)行傳輸和存儲。
設(shè)f(x)是[0,1]上的函數(shù),n∈Z+,Bernstein多項式函數(shù)Bn(x)[13]定義為:
(1)

(2)

根據(jù)每個單元加密方法的不同,選擇合適的函數(shù)使其滿足:
K2i=Fi(Ui,Ri,Hi(CF[]))
(3)
用Bernstein多項式對注冊碼和用戶碼進(jìn)行分存,將注冊碼和用戶碼按式(1)分解為若干個不同的子注冊碼和用戶碼,進(jìn)而可推導(dǎo)出式(2)。然后根據(jù)所得到的子用戶碼,注冊碼以及得到的各單元的Hash值,運(yùn)用式(3)構(gòu)造出滿足要求的密鑰生成函數(shù)F,并用這些函數(shù)來計算每個加密單元的解密密鑰,從而在程序中實現(xiàn)分存。
2.3方案的實現(xiàn)
動態(tài)防篡改機(jī)制是驗證軟件是否被篡改,并對篡改作出響應(yīng)的一種技術(shù)。通過驗證自身的完整性來判斷軟件是否被篡改,完整性的驗證主要通過加入驗證模塊來實現(xiàn),如何保證驗證模塊的安全和可信是研究的重點。本文方案將驗證模塊作為程序執(zhí)行必不可少的一部分,使得對驗證模塊進(jìn)行任意的修改和刪除都會破壞軟件的正常執(zhí)行。這樣既可以避免驗證模塊被繞過又可以避免驗證模塊被修改或移除。TPM由若干個加密代碼單元組成,每一個單元的解密密鑰均由隱藏在程序中的F計算得到。在整個程序的運(yùn)行過程中,只有上一個單元正確運(yùn)行完成才能正確解密下一個單元。任何更改程序運(yùn)行功能的行為都會使解密密鑰的計算結(jié)果不正確,程序解密異常,TPM的運(yùn)行過程如下:
(1) 用戶輸入U和R。
(2) 通過分解函數(shù)G將U和R分存成多段。
(3) 利用得到的第一組用戶碼和注冊碼解密第一個加密單元,并將依次執(zhí)行函數(shù)的函數(shù)名發(fā)送給控制流儲存數(shù)組。
(4) 利用第二組用戶碼和注冊碼以及得到的H2(CF[]), 通過密鑰生成函數(shù)F2來計算第二個加密單元的密鑰,解密加密單元并執(zhí)行自身功能。
(5) 觸發(fā)下一單元的解密函數(shù),計算密鑰,解密并執(zhí)行。
(6) 重復(fù)執(zhí)行,直至所有單元被執(zhí)行。
基于完整性驗證的軟件防篡改,使用多種加密方法對程序進(jìn)行加密,且構(gòu)造多個不同的Fi。程序的響應(yīng)功能被解密所替代,而程序的密鑰是計算得到的,無法被攻擊者定位提取,破解者只有通過對加密軟件本身進(jìn)行破解,這樣在一定程度上加大了破解的難度。計算密鑰所需的用戶名和注冊碼是用戶自己輸入的,通過對函數(shù)級完整性進(jìn)行驗證得到計算密鑰所需的另一個值,任何一個數(shù)據(jù)的出錯都會導(dǎo)致密鑰計算結(jié)果的不一致。即使軟件破解者破解了其中的幾個加密單元,也不能由解密密鑰得到對應(yīng)的子注冊碼和用戶碼。在對程序進(jìn)行完整性驗證的同時也實現(xiàn)了對程序的加密,進(jìn)而加大了對程序的保護(hù)力度。
下面從有效性、性能和安全性三個方面對本文提出的基于完整性驗證的防篡改方案進(jìn)行分析。
3.1有效性分析
以圖2所示程序為例,圖2即為程序的控制流圖,在每個函數(shù)的入口處植入哨兵。在本程序中,S2含有緩存區(qū)溢出漏洞,利用該漏洞修改返回地址,使程序跳過S3繼續(xù)執(zhí)行,使得該程序的控制流被篡改。下面驗證本文模型能否對該篡改做出反應(yīng)。
當(dāng)程序正常執(zhí)行時會有兩條執(zhí)行路徑,當(dāng)判斷條件為真時,執(zhí)行的為圖2所示的左邊的執(zhí)行路徑,此時控制流儲存數(shù)組得到的相關(guān)信息為CF[]={‘S’,‘1’,‘S’,‘2’,‘S’,‘3’,‘S’,‘4’}。通過計算Hash值得到Hi(CF[]),并結(jié)合相應(yīng)的Ui,Ri利用隱藏在程序中的密鑰生成函數(shù)來計算下一單元的解密密鑰。
當(dāng)判斷條件為假時,執(zhí)行的為圖2所示的右邊的執(zhí)行路徑,此時控制流儲存數(shù)組得到的相關(guān)信息為CF[]={‘S’,‘1’,‘S’,‘5’}。通過計算Hash值得到Hi(CF[]),并結(jié)合相應(yīng)的Ui,Ri利用隱藏在程序中的密鑰生成函數(shù)來計算下一單元的解密密鑰。
當(dāng)程序的控制流被篡改時,控制流儲存數(shù)組得到的相關(guān)信息為CF[]={‘S’,‘1’,‘S’,‘2’,‘S’,‘4’}。此時得到的Hash值與正常執(zhí)行時得到的Hash值不一致,利用函數(shù)得到的解密密鑰就會出錯,使得解密失敗。
根據(jù)執(zhí)行序列的不同設(shè)置不同的密鑰生成函數(shù),如示例程序的兩個正確的執(zhí)行序列一和二,通過觸發(fā)不同的密鑰生成函數(shù)來保證密鑰結(jié)果的唯一性。實驗結(jié)果表明,基于完整性驗證的防篡改機(jī)制對函數(shù)級防篡改是有效的,能夠?qū)Υ鄹淖龀鱿鄳?yīng)的反應(yīng)。
3.2性能分析
本模型的開銷主要分為兩部分,第一部分為程序控制流的獲取,哨兵的植入以及對程序進(jìn)行加密,這部分時間開銷比較大,但這部分開銷跟程序的執(zhí)行沒有必然聯(lián)系,只需要考慮第二部分哨兵發(fā)送函數(shù)運(yùn)行信息以及解密的時間。為了分析本模型在植入哨兵前后運(yùn)行時間的變化,用IDA Pro中的函數(shù)窗口進(jìn)行分析。表1列出了個程序中哨兵的數(shù)目,圖3為植入哨兵后運(yùn)行時間的變化情況,其數(shù)值為植入后增加的運(yùn)行時間與植入前運(yùn)行時間的比值。

表1 各程序植入哨兵的數(shù)目

圖3 植入哨兵后運(yùn)行時間增加百分比
根據(jù)實驗結(jié)果表明,約75%的程序在哨兵植入后運(yùn)行時間開銷增加在50%左右,所有測試程序增加的時間開銷為60%。從時間開銷上來說,比控制流完整性防篡改(開銷增加低于45%[7])相比較大,但從空間開銷上來說,控制流完整性防篡改需要在每個函數(shù)的入口和出口加入驗證相關(guān)信息,而本文方案只需在入口處植入驗證代碼,是前者的一半。無論從時間還是空間上說,本方案與文獻(xiàn)[11]的開銷相近,但本方案的安全性高。在文獻(xiàn)[11]中,沒有考慮哨兵本身的安全性,哨兵可以被移除。若其中一處的哨兵被移除,如foo3處,程序依然按原功能正常執(zhí)行,但是監(jiān)控模塊收到的監(jiān)控序列跟所存儲的信息不一致。在本方案中,哨兵作為軟件執(zhí)行的一部分,安全性受到保護(hù)。在時間開銷上,所有哨兵共享完整性驗證函數(shù)數(shù)組,在程序中僅插入跳轉(zhuǎn)指令,這些指令所產(chǎn)生的開銷很小。開銷主要由
解密產(chǎn)生,可以通過合理的設(shè)置解密方案來減少所產(chǎn)生的時間開銷。
3.3安全性分析
該模型的安全性體現(xiàn)在如下幾個方面:
(1) 模型的響應(yīng)環(huán)節(jié)為解密,不需要存儲函數(shù)運(yùn)行的相關(guān)信息。程序沒有被篡改則執(zhí)行相應(yīng)的功能,被篡改解密失敗則執(zhí)行錯誤的功能,不需要存取原始值,不合理的原始值是攻擊者的突破口,攻擊者可以通過逆向工程定位進(jìn)而移除。
(2) 分存策略和加密相結(jié)合,將用戶碼和注冊碼分段存儲,在加大破解者獲取注冊信息難度的同時也確保哨兵的安全。在本方案中,哨兵作為程序正常運(yùn)行的一部分,若被修改則收到的函數(shù)運(yùn)行信息就會發(fā)生變動,所得的Hash就會和所預(yù)期的不一樣,最終導(dǎo)致密鑰結(jié)果計算的不一致,解密出錯。
(3) 密鑰生成函數(shù)隱藏在程序中,只有程序的正確運(yùn)行才能觸發(fā)密鑰生成函數(shù)的執(zhí)行。攻擊者在不了解程序?qū)傩缘那闆r下,無法確定隱秘信息的存在,即使攻擊者找到了密鑰生成函數(shù)所在的位置,計算密鑰所需的用戶碼、注冊碼及函數(shù)正常運(yùn)行信息的哈希值,其中任意一個值的出錯都不可能得到正確的解密密鑰。函數(shù)隨機(jī)的插入到程序中,如果攻擊者找到其中一個函數(shù)的所在,而且破解了一個加密模塊,并不能通過解密密鑰得到計算所需的用戶碼、注冊碼及運(yùn)行信息,并不影響其余函數(shù)的隱秘性及安全性。如果攻擊者定位刪除密鑰生成函數(shù),則解密功能不能進(jìn)行,程序也將無法正常運(yùn)行。通過多個函數(shù)的應(yīng)用,使得攻擊者花費(fèi)更多的時間和精力來確定每個函數(shù)的位置,這在一定程度上增加了攻擊者的分析難度,進(jìn)一步增加軟件的安全性[14]。
本文提出了一種基于完整性驗證的防篡改模型。該模型采用分存策略對注冊碼和用戶碼進(jìn)行分段,利用對程序完整性驗證得到的Hash值,結(jié)合相應(yīng)的子注冊碼和用戶碼,通過多個隱藏在程序中的函數(shù)來計算各單元的解密密鑰,使得程序受多種加密方式的保護(hù),在防止軟件被非法篡改的同時加大了軟件的保護(hù)力度。然而并不能確保攻擊者對少數(shù)函數(shù)單元內(nèi)部的更改,如何在函數(shù)中加入相關(guān)的防篡改驗證,進(jìn)一步提高軟件的防篡改能力是下一步的研究重點。
[1] David Aucsmith.Tamper resistant software:An implementation[M]//Proceedings of the First International Workshop on Information Hiding,Springer Berlin Heidelberg,1996:317-333.
[2] 王朝坤,付軍寧,王建民,等.軟件防篡改技術(shù)綜述[J].計算機(jī)研究與發(fā)展,2011,48(6):923-933.
[3] 牛飛斐,張若箐,楊亞濤,等.基于Hash函數(shù)的計算機(jī)日志完整性檢測模型設(shè)計[J].計算機(jī)工程與設(shè)計,2014,35(3):830-834.
[4] 牛毅,李清寶,鐘春麗,等.獨(dú)立可執(zhí)行設(shè)備支持的終端代碼防篡改技術(shù)研究[J].小型微型計算機(jī)系統(tǒng),2013,34(12):2809-2813.
[5] 段國云,陳浩,黃文,等.一種Web程序防篡改系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機(jī)工程,2014,40(5):149-153.
[6] Jacob M,Jakubowski M H,Venkatesan R.Towards integral binary execution:Implementing oblivious hashing using overlapped instruction encodings[C]//Proceedings of the 9thworkshop on Multimedia & security.New York,NY,USA:ACM,2007:129-140.
[7] Abadi M,Budiu M,Erlingsson U.Control-flow integrity principles,implementations and applications[J].ACM Transactions on Information and System Security,2009,13(1):1-40.
[8] 武少杰,鶴榮育,薛長松,等.基于循環(huán)哨兵的軟件保護(hù)方法研究[J].計算機(jī)與現(xiàn)代化,2012,61(1):161-165.
[9] 趙媛,房鼎益,劉強(qiáng)波,等.應(yīng)用改進(jìn)哨兵的軟件攻擊威脅自感知方法[J].小型微型計算機(jī)系統(tǒng),2014,35(7):1486-1490.
[10] 余艷瑋,趙亞鑫.基于三線程保護(hù)和軟件哨兵的防篡改技術(shù)[J].計算機(jī)應(yīng)用,2013,33(1):1-3,34.
[11] 張貴民,李清寶,王煒,等.基于函數(shù)級控制流監(jiān)控的軟件防篡改[J].計算機(jī)應(yīng)用,2013,33(9):2520-2524.
[12] Xu L,Sun F Q,Su Z D.Constructing precise control flow graphs from binaries[R].Davis:University of Computer Science,2009.
[13] 王蕊,楊秋翔,陳夠喜,等.基于分存策略的軟件保護(hù)博弈模型[J].計算機(jī)應(yīng)用,2013,33(9):192-196.
[14] 張萌,陳夠喜,張鵬程.高效可執(zhí)行文件后門隱寫算法[J].計算機(jī)應(yīng)用研究,2013,30(4):1198-1204.
SOFTWARE TAMPERPROOFING SCHEME BASED ON INTEGRITY CHECKING
Ma QiaomeiHu ShashaChen Gouxi
(SchoolofComputerandControlEngineering,NorthUniversityofChina,Taiyuan030051,Shanxi,China)
To solve the problem that the software response and verification are vulnerable to attack, we studied the existing tamperproofing schemes and presented an integrity checking-based tamperproofing model. The scheme divides the software into several units and employs various encryption methods to encrypt software. By conducting integrity checking on the control flow of the program it gets the Hash value, then through the key generation function hidden in the program and by making use of the derived Hash value, register code and user ID it calculates the decryption keys of each encryption unit. Theoretical analysis and experimental results demonstrated that the model does not need to modify the underlying hardware, it is easy to implement with small overhead and strong algorithm security.
TamperproofingIntegrity checkingControl flowSecurity
2015-03-02。山西省自然科學(xué)基金項目(2012011010-1)。馬巧梅,副教授,主研領(lǐng)域:圖形圖像處理,信息安全技術(shù)。胡沙沙,碩士生。陳夠喜,副教授。
TP3
A
10.3969/j.issn.1000-386x.2016.08.069