專利名稱:用于確保軟件完整性的處理器實現(xiàn)的方法
技術領域:
本發(fā)明涉及軟件保護的領域,更具體地講,涉及一種用于使軟件防篡改由此確保一個軟件的完整性的設備和手段。
背景技術:
在安全數(shù)據(jù)處理的領域中,需要提供防篡改環(huán)境,在該環(huán)境內(nèi)能夠以安全方式執(zhí)行處理。解決應用安全性的問題的第一方案集中于努力使容納軟件的硬件盡可能安全。此時的防篡改的概念意味著這種硬件難以打開,或者一旦被打開將會破壞安全軟件所在的芯片。然而,現(xiàn)今,通常意識到,用于實現(xiàn)應用安全性的軟件技術提供更多的靈活性和更低的成本,并且實際上,在良好的應用安全性暗示保證一個軟件未被篡改的多數(shù) 情況下,使用軟件和硬件方案的組合。運行應用的典型系統(tǒng)通常包括處理單元、多個外圍設備和存儲器。在需要安全性的多數(shù)情況下,使用加密方案。在這種方案中,需要保持安全的信息(即,工作數(shù)據(jù)或可執(zhí)行代碼)被加密。通常在安全模塊內(nèi)完成加密,安全模塊形成系統(tǒng)的一部分。安全模塊能夠以各種方式實現(xiàn),諸如實現(xiàn)在徽章或鑰匙的形式的微處理器卡、智能卡或任何電子模塊上。這些模塊通常是便攜式的并且可從接收器拆下,并且被設計為是防篡改的。最常用的形式具有電接觸,但也存在IS014443類型的非接觸版本。存在安全模塊的另一實現(xiàn)方式,其中它被直接焊接在接收器內(nèi)部,這種實現(xiàn)方式的變型是插槽或連接器上的電路,諸如SIM模塊。另一實現(xiàn)方式是使安全模塊被集成在具有另一功能的芯片上,例如集成在解擾模塊上或集成在解碼器的微處理器模塊上。安全模塊還能夠以軟件實現(xiàn)。盡管在現(xiàn)代安全處理系統(tǒng)中使用了安全模塊和高級加密技術,但這種系統(tǒng)仍然表現(xiàn)出對破壞安全性的嘗試的顯著吸引。已被用于破壞這種系統(tǒng)的安全性的技術包括例如所涉及的硬件的逆向工程或者其中使用的軟件的動態(tài)或靜態(tài)分析和隨后對這種軟件的篡改。靜態(tài)分析意味著非執(zhí)行代碼的某種形式的反匯編或反編譯。動態(tài)分析意味著在代碼運行的同時的分析,即,在軟件運行的同時觀測某些信號。這種分析可導致篡改,由此通過例如執(zhí)行分支干擾(branch-jamming)攻擊來修改軟件,其中替代于條件轉(zhuǎn)移而引入無條件轉(zhuǎn)移,由此在當前條件未規(guī)定這種執(zhí)行時,強迫分支執(zhí)行。典型地,這種攻擊將會強迫程序繞過認證步驟,例如像是序列號或口令檢查。在作為碩士學位論文于2005年提交的標題為“Tamper-Resistance for SoftwareProtection”的文章中,Ping Wang描述了一種多塊加密的技術,其中軟件程序根據(jù)程序的流程被分割成許多獨立的塊。程序的每個塊隨后被加密,每個塊具有不同的加密密鑰。根據(jù)程序的流程,每個塊的加密密鑰是前一塊的哈希值。該技術工作于具有樹狀結構的程序中,其中塊按照層級方式排列,一個塊通向另一個塊。在這種技術中,要執(zhí)行的第一個塊必須為明文。調(diào)用解密例程的代碼被放置在每個塊內(nèi)部,并且用于實現(xiàn)動態(tài)完整性檢查的程序控制器被添加到程序的末尾。如果對手試圖改變程序的一部分,則包含程序的改變的部分的塊的哈希值將會不同,因此下一個塊將不會被正確地解密,并且程序崩潰。這種方案具有這樣的缺點每個塊因此需要被讀取兩次。它具有另一缺點逐塊地而非逐指令地完成加密,一個解密密鑰對于整個塊有效。這意味著一個密鑰的發(fā)現(xiàn)使得整個軟件塊易受攻擊。最小的可能的塊的尺寸由完全包含一循環(huán)的最小塊確定,因為在這種設計中,按照定義,塊必須包含整個循環(huán)。即使在不存在循環(huán)的情況下程序能夠減小至每塊一個指令,作為結果的實現(xiàn)該方法的開銷也將會在尺寸和執(zhí)行速度方面使最終結果變得笨重。另外,能夠想象到可能的攻擊,其中能夠?qū)K進行修改,并且以如下方式對程序控制器進行對應的改變以補償該修改它針對對塊進行的修改計算正確的哈希值,由此保留察覺到的程序的完整性。本發(fā)明允許可執(zhí)行代碼以加密形式存在,逐指令地完成加密并且不需要兩次讀取指令。該方案能夠完全實現(xiàn)于硬件,這具有固有的優(yōu)點加密密鑰永遠不會出現(xiàn)在它們可能容易遭受攔截的任何地方。不存在軟件開銷,因此,執(zhí)行速度大大提高。在現(xiàn)有技術中,下一個塊的加密密鑰僅取決于前一個塊的內(nèi)容。在本發(fā)明中,加密密鑰能夠取決于多個前面 的加密密鑰值的累積。例如,用于對下一個指令解密的密鑰能夠基于當前指令與前面兩個指令的密鑰的累積的組合。
發(fā)明內(nèi)容
本發(fā)明旨在解決通過軟件的分析和所述軟件的隨后篡改引起的安全性問題,同時使開銷最小化以便實現(xiàn)該解決方案并使它靈活并且適用于使用許多不同結構類型的軟件的系統(tǒng)。這是使用一種用于確保程序存儲器中的軟件的完整性的處理器實現(xiàn)的方法來實現(xiàn)的,所述軟件包括多個加密的指令,一個指令包括至少一個操作碼(opcode),所述方法使用初始化的指令密鑰并包括下面的步驟-讀取當前加密的指令,-使用指令密鑰對當前加密的指令解密,-使用基于指令密鑰的當前值和當前指令的摘要(digest)的計算更新指令密鑰,以便可利用更新的指令密鑰對要讀取的下一個加密的指令解密,-執(zhí)行當前指令。本發(fā)明能夠應用于其結構不必實際上是樹狀的程序,并且可以以軟件或完全硬件實現(xiàn),由此消除第三方攔截解密的指令或解密密鑰的可能性。
通過參照下面當結合附圖閱讀時對優(yōu)選實施例的詳細描述,將會最好地理解本發(fā)明,其中-圖I是本發(fā)明的實施例的簡化方框圖。-圖2是本發(fā)明的實施例的流程圖。-圖3是顯示根據(jù)本發(fā)明的實施例可如何處理軟件轉(zhuǎn)移或分支的簡化方框圖。
具體實施例方式如上所述,本發(fā)明旨在提供一種用于以安全方式運行軟件的裝置,由此軟件以加密形式存儲在存儲器中并逐指令地在安全處理器內(nèi)被解密和執(zhí)行,沒有被監(jiān)視的可能性。用于當前指令的解密的密鑰取決于已被正確解碼的至少一個以前的指令,而用于后面的指令的解密的密鑰取決于當前指令的正確解密。以這種方式,實現(xiàn)了用于保證一個軟件的完整性的自檢查裝置。軟件的成功執(zhí)行就在于保證流程和內(nèi)容都不被篡改,因為對一個指令進行的修改將會使得喪失對后面的指令解密的能力,導致程序的倉促終止或至少程序執(zhí)行跟蹤的崩潰。在本發(fā)明中使用的方案能夠以軟件實現(xiàn),但要注意的是,它能夠完全以硬件實現(xiàn),由此消除第三方攔截明文的指令或攔截所涉及的任何解密密鑰的可能性。與現(xiàn)有技術中的解決方案相比,本發(fā)明幾乎不導致開銷。該方案能夠應用于各種不同架構或結構的軟件(包括具有轉(zhuǎn)移和中斷的架構或結構),并且不限于稱為樹結構的結構。本發(fā)明因此提供一種在系統(tǒng)中確保防篡改軟件執(zhí)行的方法,該系統(tǒng)至少包括程序存儲器(PMEM),用于保存加密的程序指令(INSTP’,INSTCj,INSTF’ );解密模塊(DECR),用于對所述程序指令解密;數(shù)據(jù)處理單元(SCPU),用于執(zhí)行解密的程序指令(INSTP, INSTC, INSTF);和用于建立稱為指令密鑰(KP,KC,KF)的解密密鑰的裝置,該解密密鑰用于對加密的程序指令解密。用于建立指令密鑰的裝置當然能夠存在于數(shù)據(jù)處理單元 內(nèi)。解密模塊和數(shù)據(jù)處理單元優(yōu)選地存在于在現(xiàn)有技術中公知的任何類型的安全模塊內(nèi)。在加密的程序的執(zhí)行期間,當前加密的指令(INSTC’ )被從程序存儲器(PMEM)讀取,并使用當前解密密鑰(KC)被解密(DECR)以給出當前指令(INSTC),當前解密密鑰(KC)是從一方面的前一解密密鑰(KP)的摘要和另一方面的以前執(zhí)行的指令的摘要(DIG (INSTRP))的組合(Fn)建立的,如圖I中所示?!罢币馕吨鴳糜诓僮鲾?shù)的全部或一部分并產(chǎn)生輸出的任何操作。值得注意的是,當對操作數(shù)執(zhí)行摘要時,摘要可產(chǎn)生等于操作數(shù)自身的輸出。根據(jù)本發(fā)明的一個實施例,摘要包括關于操作數(shù)的單向函數(shù)。這允許進一步防止第三方反向工作并推斷以前的密鑰或以前的指令的任何嘗試。哈希函數(shù)是這種單向函數(shù)的例子(例如,SHA2、MD5)。“組合”意味著提及的操作數(shù)的任何形式的組合,無論它是邏輯組合、算術組合還是密碼組合。以這種方式,保證了程序的流程和內(nèi)容,因為如果當前加密的指令不是程序的創(chuàng)建者預期的指令,則當當前解密密鑰(KC)用于對當前加密的指令解密時,當前解密密鑰(KC)將會產(chǎn)生某一其它非預期值。以這種方式,我們獲得驗證了自身的一個軟件,因為軟件的完整性僅僅通過軟件的成功執(zhí)行得以保證。如果軟件已被篡改,則它將無法執(zhí)行。圖2顯示代表本發(fā)明的以上實施例的流程圖。這個表示從時間快照的視點描述本發(fā)明,而非談及具有其當前解密密鑰的當前指令和具有其前一密鑰的前一指令等,它僅參考當執(zhí)行每個指令時更新的指令密鑰(KI)。在任何處理單元中,程序計數(shù)器(PC)通常用于指示要執(zhí)行的下一指令的位置。在執(zhí)行指令之后,程序計數(shù)器增加,或者否則如果所述指令規(guī)定除簡單增加之外的不同形式的更新,則更新程序計數(shù)器。例如,如果指令包括從寄存器加載一個值的命令,則程序計數(shù)器將會通常簡單地被增加以指示下一個位置。然而,如果指令包括轉(zhuǎn)移到某一位置,則將會利用由該轉(zhuǎn)移指示的位置的值更新程序計數(shù)器。程序計數(shù)器(PC)和指令密鑰(KI)首先被初始化(INI PC, INI ΚΙ)。在由程序計數(shù)器指示的位置從程序存儲器讀取加密的指令(RD INST’c.f.PC),并使用指令密鑰對加密的指令解密(DCPT INST,KI)。執(zhí)行指令(EX INST),并且通過簡單的增加或者通過替換由指令規(guī)定的新值來更新程序計數(shù)器(UPD PC)。使用執(zhí)行的指令的摘要更新指令密鑰(UPDKI, INST)。指令密鑰的更新因此不僅考慮了剛被執(zhí)行的指令,還考慮用于對指令解密的密鑰的值。繼而,以前用于對前一指令解密的指令密鑰是從前一指令和用于對在該前一指令之前的指令解密的指令密鑰建立的。以這種方式,指令密鑰的值不僅取決于上一個執(zhí)行的指令,還取決于組合的所有以前執(zhí)行的指令。事實上,在本發(fā)明的實施例中,指令密鑰的更新考慮了上一個執(zhí)行的指令的值和至少兩個以前的執(zhí)行的指令的值。例如,用于對指令4解密的密鑰能夠是指令3的摘要、指令2的摘要和指令I的摘要的組合。如圖2中所示,本發(fā)明的方法包括循環(huán),其中使用以前執(zhí)行的指令更新指令密鑰。這導致了關于如何對程序中的第一個指令解密的問題。如果不存在以前執(zhí)行的指令,則如何計算第一個指令密鑰?在本發(fā)明的一個實施例中,程序中的第一個指令保留明文,而所有其它指令被加密。第一個指令因此被直接執(zhí)行,由此開始該循環(huán),并且使用基于第一個指令的指令密鑰對第二個指令解密,依此類推。在本發(fā)明的另一實施例中,包括第一個指令的整個程序被加密,并且使用將對第一個指令解密的值來初始化指令密鑰。這個值可以是內(nèi)置在安全模塊中或者以其它方式從外部傳送到安全模塊的主密鑰。在程序的執(zhí)行期間,可能出現(xiàn)這樣的情況存在于當前存儲器位置(C)的當前指令(INSTC’)可被超過一個的以前的指令(INSTP1,INSTP2)引用。換句話說,例如當遇到分支型指令(例如包括轉(zhuǎn)移、分支或調(diào)用)時,當前指令(或被調(diào)用者)可能被超過一個的調(diào)用者調(diào)用。圖3示出兩個調(diào)用者(INSTP1,INSTP2)引用一個被調(diào)用者(INSTC)的情形。在這種情況下,由于考慮到不同的可能的歷史而可能存在指令密鑰的兩個不同的值,所以取決于哪個密鑰將被用于對加密的被調(diào)用者解密,將會導致兩個不同的結果。這當然不是期望的情況,因為加密的被調(diào)用者僅能夠已通過一個密鑰被加密。為了避免這個問題,對計算進行修改(C0RR1,C0RR2)以便強迫所獲得的指令密鑰是所需要的值,從而正確地對被調(diào)用者解密。例如,存在于位置C的被調(diào)用者被存在于位置Pl和P2的兩個不同的調(diào)用者引用。正確地對在位置C的加密的指令(INSTC’)解密所需的指令密鑰是KCIN。然而,在存在于Pl的指令(INSTPl)的執(zhí)行之后的指令密鑰的值是KPltm,并且在存在于P2的指令(INSTP2)的執(zhí)行之后的指令密鑰的值是KP2qut。另外,合理地假設KP1QUT不等于KP2qut,并且KPIqut和KP20UT都不等于KCIN。該方法因此要求每當執(zhí)行分支型指令時,執(zhí)行修改(C0RR1,C0RR2),因此允許指令密鑰值變?yōu)樗璧闹?。由于對被調(diào)用者解密所需的密鑰的值是已知的(即,KCin)并且在調(diào)用者的執(zhí)行之后的密鑰的值是已知的,所以可預測每個調(diào)用者的修改值,其中當修改值用在計算中時,修改值將使指令密鑰變?yōu)樗璧闹怠H缓笤诿總€分支型指令實現(xiàn)合適的修改值,以便在每次使用這種類型的指令時對指令密鑰進行必要的修改-根據(jù)調(diào)用者執(zhí)行不同的修改。根據(jù)本發(fā)明的實施例,在如上所述的前一解密密鑰和前一指令的摘要的組合中引入該修改值作為另一操作數(shù)。 作為如何執(zhí)行上述對指令密鑰的修改的例子,我們考慮轉(zhuǎn)移指令。在本發(fā)明的優(yōu)選實施例中,作為轉(zhuǎn)移指令的通常情況,轉(zhuǎn)移指令包括目的地參數(shù),并且還包括修改參數(shù),例如JMP C, #C0RRlo隨后在前一指令密鑰和前一指令的全部或一部分的組合中,修改值(#C0RR1)用作另外的參數(shù)。注意到以下事實是有用的轉(zhuǎn)移指令的摘要已經(jīng)考慮了修改值,而非在組合步驟中從指令提取修改值并使用它作為額外的參數(shù)。下面的表Tl示出當程序的執(zhí)行通過上述類型的修改的轉(zhuǎn)移指令演進時指令密鑰的狀態(tài)。該表包括對指令解密所需的密鑰的值和在指令的執(zhí)行和新密鑰的計算之后的密鑰的值。由于對在Iablel處的指令解密所需的密鑰的值是已知的,所以能夠計算合適的校正值CORRl或C0RR2以便使未修改的值K4或K14變?yōu)樗璧闹礙91。Tl
所需的密鑰標簽_指令I得到的密鑰
Kl__指令 I_K2 _
K2__指令 2_IjO_
K3JMP Iabell K91=Fn(K4,CORMl) CORRI
KU__指令 Π_K12_K12__指令 12I K13KI3.IMPIabell, K91=Fn(K I4,(()RR2)
__CORR2_
K91_Iabeil_指令 91K92
K92................................................................................................................................................................................——92..................................................... I Κ93....................................................................................................................................................................在本發(fā)明的另一實施例中,替代于例如具有修改的轉(zhuǎn)移指令,使用標準的轉(zhuǎn)移指令,并且由以修改值作為參數(shù)的專用“修改”指令完成上述對指令密鑰的修改。這種修改指令的功能要基于修改值直接作用于指令密鑰。修改指令被正好放在分支或轉(zhuǎn)移型指令之前,因此允許指令密鑰被合適地更新以便正確地對被調(diào)用者解密。注意到以下事實是有用的如上所述的“修改”功能事實上可以是被設計用于對指令密鑰的值執(zhí)行希望的修改操作的多個指令。例如,如果正確地對被調(diào)用者解密所需的指令密鑰的值是#39,則正好在例如轉(zhuǎn)移指令之前,能夠存在指令密鑰(KI)與#39的XOR以發(fā)現(xiàn)修改值(CORRl),然后將CORR和KI相加以給出新的(校正的)KI值。作為另一例子,在被調(diào)用者“l(fā)abell”處的指令密鑰具有值Κ91。由于程序流程能夠從不同路徑到達的事實,正好在轉(zhuǎn)移之前添加校正指令Inst_C0RR,以便指令密鑰被更新為預定值K90。分支型指令(在這種情況下是轉(zhuǎn)移)的執(zhí)行將把指令密鑰從K90修改為K91。從以下的表T2中顯而易見,與校正指令(Inst_C0RR)關聯(lián)的校正值(Cl,C2)旨在把當前指令密鑰(K3,K13)修改為預定義的值Κ90。結果,轉(zhuǎn)移的執(zhí)行將把指令密鑰從Κ90更新為Κ91,即用于對在被調(diào)用者(Iabell)處的指令解密的值。在分支型指令具有不同值的情況下,例如當指令是短分支BRA時,由這個指令產(chǎn)生的摘要將會不同于由轉(zhuǎn)移指令產(chǎn)生的摘要。因此,附于校正指令Inst CORR的校正值C3應該考慮這種差異,并且在執(zhí)行該分支指令時的指令密鑰將不會與針對轉(zhuǎn)移指令的情況相同。然而,由于校正值C3,在短分枝指令的執(zhí)行之后的最終值將仍然是K91。T權利要求
1.一種用于確保程序存儲器中的軟件的完整性的處理器實現(xiàn)的方法,所述軟件包括多個加密的指令,一個指令包括至少一個操作碼,所述方法使用初始化的指令密鑰并包括下面的步驟 -讀取當前加密的指令, -使用指令密鑰對當前加密的指令的至少一部分解密, -使用基于指令密鑰的當前值的摘要和當前指令的摘要的計算來更新指令密鑰,以便能利用更新的指令密鑰對要讀取的下一個加密的指令解密, -執(zhí)行當前指令。
2.如權利要求I所述的方法,其中所述程序存儲器中的第一個指令未被加密。
3.如權利要求I或2中任一項所述的方法,其中當前指令還包括認證標簽,所述認證標簽用于在執(zhí)行之前對所述指令進行認證。
4.如權利要求I至3中任一項所述的方法,其中對指令密鑰進行修改,所述修改允許使用所述修改的指令密鑰對下一個加密的指令解密以給出可執(zhí)行指令。
5.如權利要求4所述的方法,其中當前指令還包括用于實現(xiàn)所述修改的修改值,所述修改值是從指令值提取的并且在確定下一個加密密鑰時作用于更新步驟。
6.如權利要求I至5中任一項所述的方法,其中對加密的指令解密、更新指令密鑰、對當前指令進行認證或執(zhí)行當前指令的處理中的任何處理或全部處理在安全模塊內(nèi)執(zhí)行。
7.如權利要求I至6中任一項所述的方法,其中所述摘要是應用于所述當前指令的全部或一部分的函數(shù)的結果,所述函數(shù)是從邏輯函數(shù)、算術函數(shù)、密碼函數(shù)或單向函數(shù)中選擇的。
8.如權利要求I至7中任一項所述的方法,其中所述指令密鑰的更新還基于修改值,所述修改值用于使指令密鑰變?yōu)橐阎闹怠?br>
9.如權利要求I至8中任一項所述的方法,其中主密鑰被用于初始化指令密鑰。
10.一種設備,包括程序計數(shù)器(PC)和用于存儲加密的程序的程序存儲器(PMEM),所述加密的程序包括多個加密的指令(INST’),所述指令至少包括操作碼,所述設備還包括解密模塊(DECR)和數(shù)據(jù)處理單元(SCPU),所述設備能訪問初始化的指令密鑰(KI),所述設備的特征在于,它還包括遞歸地基于所述指令密鑰的全部或一部分和至少一個以前執(zhí)行的指令的摘要來更新指令密鑰(KI)的裝置。
11.如權利要求10所述的設備,其中用于遞歸地更新指令密鑰的裝置以硬件實現(xiàn)。
12.如權利要求10或11所述的設備,其中指令密鑰的更新還基于修改值,所述修改值用于使指令密鑰變?yōu)橐阎闹怠?br>
全文摘要
本發(fā)明通過使用基于一個或多個以前的指令的全部或一部分的密鑰來加密程序的每個指令的全部或一部分,由此導致每個指令的不同的加密密鑰,從而提供一種保證軟件程序的完整性的問題的解決方案。本發(fā)明適用于其結構不必實際上是樹狀的軟件程序,并且當程序包括循環(huán)、轉(zhuǎn)移、調(diào)用或中斷等時也適用。本發(fā)明允許在加密的指令被錯誤地解密時標記出異常。第一個指令不需要為明文,因為指令密鑰可根據(jù)需要被適當?shù)爻跏蓟1景l(fā)明能夠以軟件或完全以硬件實現(xiàn),由此消除第三方攔截解密的指令或解密密鑰的可能性。
文檔編號G06F21/54GK102959556SQ201080067681
公開日2013年3月6日 申請日期2010年7月22日 優(yōu)先權日2010年7月22日
發(fā)明者M·馬切蒂, H·庫戴爾斯基 申請人:納格拉影像股份有限公司