專利名稱:保護(hù)Java字節(jié)碼代碼免受惡意運(yùn)行環(huán)境中的靜態(tài)和動態(tài)攻擊的系統(tǒng)和方法
技術(shù)領(lǐng)域:
本發(fā)明大體上涉及計(jì)算機(jī)軟件,更具體地涉及使計(jì)算機(jī)軟件抵抗惡意運(yùn)行環(huán)境中的靜態(tài)和動態(tài)攻擊的方法和系統(tǒng)。
背景技術(shù):
在計(jì)算機(jī)編程領(lǐng)域中,Java編程語言被用于各個(gè)主要的工業(yè)部分并且存在于各種各樣的裝置、計(jì)算機(jī)和網(wǎng)絡(luò)中。Java應(yīng)用程序被以Java編程語言編制,并且被編譯為與機(jī)器無關(guān)的字節(jié)碼,該字節(jié)碼在Java虛擬機(jī)(JVM)中執(zhí)行,Java虛擬機(jī)部署在主操作系統(tǒng) (OS)和主計(jì)算機(jī)處理單元(CPU)的指令集架構(gòu)(ISA)上。Java技術(shù)的多功能性、高效性、 平臺可移植性和安全性,使得其成為理想的網(wǎng)絡(luò)計(jì)算技術(shù)。從筆記本電腦到數(shù)據(jù)中心、從游戲機(jī)到系統(tǒng)的超級計(jì)算機(jī)、以及從移動電話到因特網(wǎng),到處都能發(fā)現(xiàn)Java編程語言。實(shí)際上、可移植性、可擴(kuò)展性、可通用性和可靠性是Java的核心優(yōu)勢。但是,如此普遍的存在也為黑客和相關(guān)電腦攻擊提供了大量的機(jī)會。為了阻止不受信任的應(yīng)用程序攻擊和未授權(quán)地訪問Java環(huán)境,Java技術(shù)包括 Java沙盒安全模型,以保護(hù)主機(jī)或設(shè)備的運(yùn)行環(huán)境,以免諸如病毒或惡意軟件的危險(xiǎn)軟件被非法地下載或安裝。在通常在需要高度保護(hù)的環(huán)境或系統(tǒng)(例如通信系統(tǒng)、運(yùn)輸系統(tǒng)、防御系統(tǒng)、工業(yè)自動化系統(tǒng)、電源管理系統(tǒng))上運(yùn)行的關(guān)鍵應(yīng)用程序的設(shè)計(jì)中,必須阻止該惡意攻擊。每年,越來越多的這樣的關(guān)鍵系統(tǒng)使用Java編程語言設(shè)計(jì)和執(zhí)行。同樣,消費(fèi)電子產(chǎn)業(yè)正在進(jìn)入一個(gè)新的時(shí)代,其中新興市場的先進(jìn)的技術(shù)和產(chǎn)品、 媒體數(shù)字化的快速需要、消費(fèi)電子的不斷降價(jià)和增長的可支配收入已經(jīng)刺激消費(fèi)電子市場以史無前例的速度和范圍進(jìn)行增長。許多消費(fèi)電子產(chǎn)品都依賴軟件應(yīng)用程序進(jìn)行工作。 Java編程語言的某些優(yōu)勢(例如可移植性、可擴(kuò)展性、通用性、可靠性和簡單性)降低消費(fèi)電子產(chǎn)品的總體開發(fā)和部署成本,因此確保越來越多的基于Java的平臺和應(yīng)用程序被部署到新的消費(fèi)產(chǎn)品中。幾乎所有消費(fèi)電子設(shè)備都需要運(yùn)行在不受信任環(huán)境中。在不受信任環(huán)境中,出于從受益(例如得到需要的服務(wù))到不期望(例如非法侵入設(shè)備)的不同目的,可以直接訪問消費(fèi)電子設(shè)備中的軟件。因此,與之前相比,越來越多的計(jì)算機(jī)應(yīng)用程序執(zhí)行在較為惡意的環(huán)境中。例如,手持設(shè)備(例如便攜式媒體播放機(jī)或智能電話)、家庭網(wǎng)絡(luò)(例如機(jī)頂盒、媒體播放機(jī)或個(gè)人計(jì)算機(jī))和基于網(wǎng)絡(luò)的環(huán)境都是攻擊者經(jīng)?;ㄙM(fèi)大量時(shí)間和資源的地方。因此,保護(hù)合法軟件免受攻擊已經(jīng)成為逐步升級的任務(wù)。此外,高性能的硬件和復(fù)雜的攻擊工具也為侵入者提供了很多新的優(yōu)勢。軟件經(jīng)銷商必須確保他們的軟件是穩(wěn)定的且能夠抵御攻擊。但是,具有時(shí)間、資源、工具和掌握其所控制的網(wǎng)絡(luò)的所有專業(yè)知識的攻擊者,經(jīng)常清楚地了解該已知的平臺和軟件。這種惡意攻擊的形勢經(jīng)常稱作“白盒”環(huán)境,其中所有內(nèi)容都能一覽無遺,因此易于直接訪問和竄改。與其相反的是“黑盒”環(huán)境,換句話說,就是信任和受保護(hù)的環(huán)境,其中內(nèi)容被隱藏或者以其它方式免受攻擊。在盛行的白盒環(huán)境的惡意形勢中,阻止或停止對軟件系統(tǒng)的直接和自動攻擊已經(jīng)成為最需要的安全性挑戰(zhàn)之一。此外,必須實(shí)現(xiàn)對白盒攻擊的穩(wěn)定防御,以確保正當(dāng)?shù)暮桶踩脑O(shè)備運(yùn)行。Java編程語言沒有被充分設(shè)計(jì),以處理這樣的安全性問題和挑戰(zhàn)。在此方面,與利用C或C++語言編程相比,Java的某些優(yōu)勢實(shí)際上導(dǎo)致了安全性的弱勢。與將C/C++代碼編譯為運(yùn)行在原始二進(jìn)制數(shù)據(jù)和指定目標(biāo)硬件(例如x86或 PowerPC)上的低級指令集的C/C++編譯器不同,Java編譯器將Java源代碼編譯為更高級別的可移植字節(jié)碼,該字節(jié)碼在執(zhí)行時(shí)以JVM可以解釋的類和基本類型來運(yùn)行。平臺的依賴關(guān)系被封裝在JVM中并且被從Java應(yīng)用程序中分離。并且,標(biāo)準(zhǔn)的Java編譯器不進(jìn)行在C/C++編譯器中普遍和通常存在的編譯時(shí)間的優(yōu)化。相反地,Java基于即時(shí)(JIT)編譯,以在運(yùn)行時(shí)進(jìn)行所有優(yōu)化,同時(shí)為了改善性能考慮執(zhí)行設(shè)定檔。在編譯時(shí)進(jìn)行主要的C/C++代碼的優(yōu)化。例如,順序置換(inline substitution)使得指定(成員)函數(shù)的拷貝分布在二進(jìn)制映象周圍;使用與編譯時(shí)間評估表達(dá)式(compile-time evaluation of expression)相結(jié)合的預(yù)處理器,可以不留下源代碼中限定的恒值的痕跡等。通常,復(fù)雜優(yōu)化后的代碼對于反向工程而言更難。更進(jìn)一步,當(dāng)類被加載時(shí),在運(yùn)行時(shí)解析Java程序的依賴關(guān)系。因此,類的名稱和其方法和域的名稱、以及所有的導(dǎo)入類、調(diào)用方法和訪問域的名稱都必須存在于類文件中。 另一方面,C/C++程序是靜態(tài)關(guān)聯(lián)的。因此,除從動態(tài)庫導(dǎo)出的名稱之外,類、成員和變量的名稱不必存在于編譯后或關(guān)聯(lián)后的程序中,最后,Java應(yīng)用程序被發(fā)布為一組Java歸檔(JAR)文件。JAR格式使多個(gè)文件打包到一個(gè)歸檔文件中,其實(shí)質(zhì)上是未加密的文件,并且很容易從中提取各個(gè)類。通過比較, C/C++應(yīng)用程序被發(fā)布為整體可執(zhí)行的,可以與幾個(gè)動態(tài)庫關(guān)聯(lián),因此不易識別程序信息和個(gè)別代碼。因此,與反匯編C/C++相比,將Java字節(jié)碼反編譯為Java源碼更加簡單且容易, 并因此可以是完全自動的。程序信息(例如類層次結(jié)構(gòu)、狀態(tài)說明、以及類、方法和域的名稱)都能夠從字節(jié)碼中重新得到。雖然可以使用很多免費(fèi)軟件和商業(yè)Java混淆工具,但是沒有一個(gè)提供保護(hù)以阻止對字節(jié)碼的執(zhí)行進(jìn)行直接攻擊。因此,Java反向工程現(xiàn)在已經(jīng)成為慣例。此外,JVM為Java應(yīng)用程序提供了開放的運(yùn)行時(shí)間環(huán)境。幾乎沒有內(nèi)置的安全措施,以保護(hù)JVM和使JVM自身穩(wěn)定。依附到JVM本身或使用JVM來啟動攻擊是很平常的。因此,不管用于Java應(yīng)用程序代碼的保護(hù)優(yōu)勢,因JVM的脆弱性,黑客為了實(shí)現(xiàn)白盒攻擊,可能總使用作為最薄弱環(huán)節(jié)的JVM。盡管更信任和穩(wěn)定的JVM可能保護(hù)Java應(yīng)用程序并且阻止白盒攻擊,但是這種方式將需要對當(dāng)前的Java安全模型進(jìn)行大量的改變,且需要大量的行業(yè)支持和適應(yīng)。因此希望在白盒環(huán)境中保護(hù)應(yīng)用程序的行業(yè)標(biāo)準(zhǔn)的JVM內(nèi)具有信任的和穩(wěn)定的組件。
發(fā)明內(nèi)容
本發(fā)明的目的在于消除和減輕先前Java平臺結(jié)構(gòu)的主要缺點(diǎn)。本發(fā)明提供了安全模塊,該安全模塊可以解決Java平臺的弱點(diǎn)并且在執(zhí)行時(shí)保護(hù)Java字節(jié)碼。作為一個(gè)例子,以C/C++語言來實(shí)現(xiàn)該安全模塊。因?yàn)樵搫?chuàng)新的安全模塊以 C/C++語言實(shí)現(xiàn),所以使用使C/C++軟件代碼安全的安全技術(shù)。對于本發(fā)明而言,適當(dāng)?shù)陌踩夹g(shù)由加拿大安大略省渥太華的Cloakware公司所提供。在共同擁有的先前美國專利中已經(jīng)充分地描述了這種適當(dāng)?shù)念A(yù)期安全技術(shù),這些美國專利包括2009年3月17日公布的 Chow 等人的題為“TAMPER RESISTANT SOFTWARE ENCODING AND ANALYSIS,,的第 7,506,177 號美國專利;2008年12月09日公開的約翰遜等人的題為“SE⑶RE METHOD AND SYSTEM FOR HANDLING AND DISTRIBUTING DIGITAL MEDIA”的第 7,464,269 號美國專利;2008 年 07 月 08 日公開的 Johnson 等人的題為 “SYSTEM AND METHOD FOR PROTECTING COMPUTER SOF TffARE FROM A WHITE BOX ATTACK”的第 7,397,916 號美國專利;2008 年 07 月 01 日公開的 Chow 等人的題為 “METHOD AND SYSTEM FOR SUSTAINABLE DIGITAL WATER MARKING” 的第 7,395,433號美國專利;2008年03月25日公開的Johnson等人的題為“TAMPER RESISTANT SOFTWARE-MASS DATA ENCODING” 的第 7,350, 085 號美國專利;2008 年 01 月 2 日公開的 Chow 等人的題為 “METHOD AND SYSTEM FOR SECURE ACCESS” 的第 7,325,141 號美國專利; 2005 年 01 月 11 日公開的 Chow 等人的題為 “TAMPER RESISTANT SOFTWARE ENCODING” 的第6,842,862號美國專利;2004年8月17日公開的Chow等人的題為“TAMPER RESISTANT SOFTWARE-CONTROL FLOW ENCODING”的第 6,779,114 號美國專利;以及 2003 年 07 月 15 日公開的 Chow 等人的題為“TAMPER RESISTANT SOFTWARE ENCODING”的第 6,594,761 號美國專利;上述每個(gè)專利的全部內(nèi)容通過引用并入本文。上述提及的專利中公開的現(xiàn)有的軟件安全技術(shù)和Cloakware公司的相關(guān)產(chǎn)品,都可用于在惡意(不信任)的運(yùn)行環(huán)境中保護(hù)合法的應(yīng)用程序、應(yīng)用程序的功能和知識產(chǎn)權(quán), 以阻止對這些應(yīng)用程序進(jìn)行白盒攻擊。該現(xiàn)有的軟件安全性技術(shù)包括應(yīng)用程序的源代碼和二進(jìn)制保護(hù)工具,該二進(jìn)制保護(hù)工具保護(hù)C/C++語言和本機(jī)編譯的代碼形式的應(yīng)用程序, 并且通過增強(qiáng)傳統(tǒng)的應(yīng)用程序的創(chuàng)建處理使軟件和安全性不可分離。在第一實(shí)施方式中,本發(fā)明提供了一種用于提高Java字節(jié)碼的防竄改能力的裝置,包括保護(hù)工具,用于在創(chuàng)建時(shí)將安全措施應(yīng)用于Java字節(jié)碼;安全模塊,從保護(hù)工具接收安全的Java字節(jié)碼,以及在運(yùn)行時(shí)啟動安全的Java字節(jié)碼;以及一個(gè)或多個(gè)保護(hù)機(jī)制,與保護(hù)工具和安全模塊集成在一起。其中,運(yùn)行一個(gè)或多個(gè)保護(hù)機(jī)制,以對抗對Java字節(jié)碼的靜態(tài)和動態(tài)攻擊。在本發(fā)明的另一實(shí)施方式中,裝置還包括安全的Java字節(jié)碼,該Java字節(jié)碼包括受保護(hù)的Java應(yīng)用程序字節(jié)碼存根、受保護(hù)的應(yīng)用程序有效載荷和加密的類字節(jié)碼幀,每個(gè)都在創(chuàng)建時(shí)由所述的保護(hù)工具來形成。在本發(fā)明的另一個(gè)實(shí)施方式中,安全模塊獨(dú)立地分配為Java虛擬機(jī)環(huán)境的功能擴(kuò)展,以提供受保護(hù)的Java應(yīng)用程序的可信任根源,并且根據(jù)用戶需要獨(dú)立地分配安全的 Java字節(jié)碼。在本發(fā)明的另一實(shí)施方式中,保護(hù)工具具有命令通過所述受保護(hù)的Java應(yīng)用程序字節(jié)碼存根啟動受保護(hù)的應(yīng)用程序有效載荷的機(jī)制。在本發(fā)明的另一實(shí)施方式中,安全模塊包括受保護(hù)的字節(jié)碼類加載器,保護(hù)工具包括命令使用受保護(hù)的字節(jié)碼類加載器通過所述加密的類字節(jié)碼幀啟動所述受保護(hù)的應(yīng)用程序有效載荷的機(jī)制。
在另一實(shí)施方式中,裝置由包括C、C++和Java語言中的一種或多種的編程語言實(shí)現(xiàn)的編程引擎來形成。在另一實(shí)施方式中,裝置由能夠與Java虛擬機(jī)接合的編程語言實(shí)現(xiàn)的編程引擎來形成。在另一實(shí)施方式中,可以根據(jù)配置選項(xiàng)來選擇一個(gè)或多個(gè)保護(hù)機(jī)制。保護(hù)機(jī)制還可以包括在保護(hù)工具中形成的靜態(tài)安全處理器和與安全模塊中一起形成的動態(tài)安全處理
ο在另一實(shí)施方式中,靜態(tài)安全處理器可以包括白盒(WB)靜態(tài)安全處理器,白盒靜態(tài)安全處理器用于從用戶處接收包括密鑰的密碼信息,以生成由一個(gè)或多個(gè)其它靜態(tài)安全處理器所使用的WB加密密鑰數(shù)據(jù),以及在安全模塊的動態(tài)運(yùn)行時(shí)保護(hù)過程中由一個(gè)或多個(gè)動態(tài)安全處理器所使用的WB解密密鑰數(shù)據(jù)和WB安全模塊實(shí)用工具。在另一實(shí)施方式中,靜態(tài)安全處理器可以包括字節(jié)碼完整性校驗(yàn)(BIV)靜態(tài)安全處理器和動態(tài)安全處理器,BIV靜態(tài)安全處理器響應(yīng)于保護(hù)標(biāo)記信息而將散列碼保護(hù)應(yīng)用于安全的Java字節(jié)碼,動態(tài)安全處理器包括用于在運(yùn)行時(shí)驗(yàn)證散列碼的BIV動態(tài)安全處理器,其中當(dāng)驗(yàn)證失敗時(shí),安全模塊調(diào)用竄改對策。在另一實(shí)施方式中,裝置還包括靜態(tài)安全處理器和動態(tài)安全處理器,靜態(tài)安全處理器可以包括安全加載字節(jié)碼(SLB)靜態(tài)安全處理器,SLB靜態(tài)安全處理器用于在創(chuàng)建時(shí)形成受保護(hù)的Java應(yīng)用程序字節(jié)碼存根、受保護(hù)的應(yīng)用程序有效載荷和加密的類字節(jié)碼幀,動態(tài)安全處理器包括SLB動態(tài)安全處理器,SLB動態(tài)安全處理器用于將與安全的Java 應(yīng)用程序字節(jié)碼相對應(yīng)的加密的類字節(jié)碼幀加載到存儲緩沖器中,通過與加密的類相對應(yīng)的WB解密密鑰數(shù)據(jù)將加密的類字節(jié)碼幀中所包括的每個(gè)加密類進(jìn)行解密,將每個(gè)解密的類字節(jié)碼通過安全模塊類加載器加載到應(yīng)用程序工作區(qū)域中,以在應(yīng)用程序工作區(qū)域中執(zhí)行Java應(yīng)用程序字節(jié)碼。通過結(jié)合附圖閱讀下面對本發(fā)明的具體實(shí)施方式
的詳細(xì)描述,本發(fā)明的其它方面和特征對于本領(lǐng)域技術(shù)人員來說是顯而易見的。附圖簡要說明現(xiàn)在將參照附圖僅以示例方式來描述本發(fā)明的實(shí)施方式,其中
圖1是橋接本機(jī)代碼和Java應(yīng)用程序的JNI的已知概述的示意圖。圖2是對Java應(yīng)用程序字節(jié)碼的靜態(tài)攻擊的已知機(jī)制的示意圖。圖3是對Java應(yīng)用程序字節(jié)碼動態(tài)攻擊的已知機(jī)制的示意圖。圖4是根據(jù)本發(fā)明的Java字節(jié)碼保護(hù)系統(tǒng)的概述的示意圖。圖5是如圖4的上部所示的創(chuàng)建時(shí)處理的示意圖,以根據(jù)本發(fā)明在創(chuàng)建時(shí)保護(hù) Java應(yīng)用程序的字節(jié)碼。圖6是如圖4的下部所示的運(yùn)行時(shí)處理的示意圖,以根據(jù)本發(fā)明在在運(yùn)行時(shí)保護(hù) Java應(yīng)用程序的字節(jié)碼。圖7是根據(jù)本發(fā)明在啟動和運(yùn)行時(shí)的反調(diào)試能力的示意圖。圖8是根據(jù)本發(fā)明的外部白盒(WB)密碼庫的示意圖。圖9是根據(jù)本發(fā)明的內(nèi)部WB密碼設(shè)備的示意圖。圖10是根據(jù)本發(fā)明的字節(jié)碼保護(hù)工具的預(yù)處理的示意圖。
圖11是根據(jù)本發(fā)明的字節(jié)碼完整性校驗(yàn)(BIV)靜態(tài)安全處理器的工作流程的示意圖。圖12是根據(jù)本發(fā)明的BIV動態(tài)安全處理器的工作流程的示意圖。圖13是根據(jù)本發(fā)明的安全加載字節(jié)碼(SLB)靜態(tài)安全處理器的工作流程的示意圖。圖14是根據(jù)本發(fā)明的SLB動態(tài)安全處理器的工作流程的示意圖。圖15是根據(jù)本發(fā)明的隱藏的Java應(yīng)用程序的引導(dǎo)接口和安全加載的示意圖。圖16是根據(jù)本發(fā)明的動態(tài)字節(jié)碼解密(DBD)靜態(tài)安全處理器的工作流程的示意圖。圖17是根據(jù)本發(fā)明的DBD時(shí)序表的示意圖。圖18是根據(jù)本發(fā)明的DBD動態(tài)安全處理器的工作流程的示意圖。
具體實(shí)施例方式如圖1所示,Java平臺100還包括Java本機(jī)接口(JNI) 102,Java本機(jī)接口 102 提供了一種橋接Java世界(其包括JVM 104、Java應(yīng)用程序106和在JVM中加載的字節(jié)碼形式的庫108)與本機(jī)代碼世界110 (以其它語言例如C/C++匯編程序編寫且編譯到主CPU ISA中的應(yīng)用或共享庫)之間的雙向互操作和相互作用的設(shè)備。通過使用Java編程語言和C/C++/匯編碼的JNI應(yīng)用程序編程接口(API),C/C++/匯編本機(jī)二進(jìn)制代碼可以從Java 中調(diào)用,也可以調(diào)用Java字節(jié)碼。存在兩種相互作用當(dāng)Java應(yīng)用代碼調(diào)用本機(jī)方法時(shí)的 “下行調(diào)用(down-calls) ”、以及當(dāng)本機(jī)方法訪問數(shù)據(jù)或通過JNI環(huán)境調(diào)用指定的Java應(yīng)用程序的方法時(shí)的“上行調(diào)用(up-calls)”。在運(yùn)行時(shí),本發(fā)明的安全模塊可以通過JNI在JVM中共同執(zhí)行,以便指定的Java 應(yīng)用程序可以調(diào)用創(chuàng)新性安全模塊內(nèi)的安全操作,在安全模塊中,該安全操作可以訪問 Java應(yīng)用程序及其它加載在JVM中的Java庫代碼,并且進(jìn)行保護(hù)。本發(fā)明的方法通過由JNI機(jī)制引入在JVM中完全受保護(hù)和受信任的安全模塊,對現(xiàn)有的JVM有效地附加安全措施。在運(yùn)行時(shí),安全模塊作為可信任根源,并且作為JVM中的保護(hù)“跳板(trampoline)和引擎”,以啟動和實(shí)施對Java字節(jié)碼的各種保護(hù)。以這種方式, 本發(fā)明不需要對現(xiàn)有的Java平臺進(jìn)行任何總體改變。相反地,現(xiàn)有的和新部署的系統(tǒng)和設(shè)備都可以立刻從這種方案中受益。換句話說,本發(fā)明可被認(rèn)為是對現(xiàn)有的Java基本結(jié)構(gòu)的安全性的擴(kuò)展,以解決當(dāng)前Java應(yīng)用程序所面臨的安全性問題。因此,本發(fā)明提供了一種 Java字節(jié)碼保護(hù)的安全模塊,其調(diào)節(jié)JNI的能力,以在運(yùn)行時(shí)訪問字節(jié)碼,且響應(yīng)于對Java 應(yīng)用程序的靜態(tài)和動態(tài)攻擊而執(zhí)行一組保護(hù)Java字節(jié)碼的方法。本發(fā)明提供了在Java字節(jié)碼保護(hù)系統(tǒng)中的高度信任的保護(hù)工具和安全模塊。本發(fā)明不依賴于僅基于JVM和Java安全性的Java應(yīng)用程序保護(hù)。相反地,本發(fā)明引入作為受信任區(qū)域的Java字節(jié)碼保護(hù)安全模塊(SM),該安全模塊能夠通過JNI與JVM —同工作, 以在運(yùn)行時(shí)啟動、執(zhí)行和管理Java字節(jié)碼保護(hù)。通過使用對編寫保護(hù)工具和安全模塊的 C/C++代碼的已知有效的安全保護(hù),來保證安全模塊的可信任度。使用該受信任的SM,可以通過本文中進(jìn)一步討論的由SM提供的某些保護(hù),將可信任度從SM擴(kuò)展到Java應(yīng)用程序和 JVM中
參照圖2和3,示出了對Java字節(jié)碼的典型的靜態(tài)和動態(tài)攻擊。通常,任何指定的Java應(yīng)用程序被以Java源代碼格式202進(jìn)行開發(fā),然后通過Java編譯器206被編譯成 Java字節(jié)碼204,在分配之前,Java字節(jié)碼204通過使用歸檔器公用程序210存儲在歸檔文件208(即JAR文件)中。這樣的分配可以采用許多形式,包括例如光盤(CD)或可下載文件的媒介。靜態(tài)攻擊者212通常使用反向工程工具(例如Java反編譯器),以從來自分配媒介的代碼中提取有用的知識產(chǎn)權(quán)信息214(即專有數(shù)據(jù)或軟件算法)。這樣做時(shí),攻擊者可能對代碼進(jìn)行非法改變或以其它方式危害底層代碼216。為了在指定的Java應(yīng)用程序分配期間防止對Java字節(jié)碼的這種靜態(tài)攻擊,本發(fā)明使用了對應(yīng)用程序字節(jié)碼的保護(hù)等級。在分配之前提供該保護(hù),以確保靜態(tài)攻擊非常困難。在通過本發(fā)明使用有效保護(hù)之后,嵌入應(yīng)用程序字節(jié)碼中的知識產(chǎn)權(quán)不易被反向工程,并且對受保護(hù)字節(jié)碼的任何竄改都變得不切實(shí)際。此外,因?yàn)槿魏胃Z改后的字節(jié)碼都不能被合法的JVM所加載及運(yùn)行,因此本發(fā)明的靜態(tài)保護(hù)是非常有利的。與對應(yīng)用程序字節(jié)碼的靜態(tài)攻擊相比,動態(tài)攻擊者302可以在JVM加載和運(yùn)行 Java應(yīng)用程序時(shí),通過使用動態(tài)攻擊工具來攻擊Java字節(jié)碼。通過使用動態(tài)攻擊工具和方法,攻擊者可以訪問JVM 304和應(yīng)用程序字節(jié)碼306,直接查看和修改字節(jié)碼308,從而可以根據(jù)其攻擊目的來了解或/和改變原有的指定行為和重要數(shù)值。此外,攻擊者可以從字節(jié)碼中獲得有價(jià)值的知識產(chǎn)權(quán)310和秘密,包括提取原有的字節(jié)碼306。為了阻止在運(yùn)行時(shí)對Java代碼進(jìn)行這樣的動態(tài)攻擊,本發(fā)明在分配之前形成和植入了對應(yīng)用程序字節(jié)碼的保護(hù)。此外,本發(fā)明在運(yùn)行時(shí)執(zhí)行這些保護(hù),以確保任何動態(tài)攻擊都是不切實(shí)際的。本發(fā)明不僅用來阻止動態(tài)攻擊,而且增加了所保護(hù)的應(yīng)用程序檢測動態(tài)攻擊并且能夠減輕動態(tài)攻擊的能力,以及使該攻擊對于任何未來的攻擊者而言都需要在時(shí)間和資源上進(jìn)行很大的努力。圖4是根據(jù)本發(fā)明的字節(jié)碼保護(hù)系統(tǒng)400和相關(guān)方法的概述。在本文中,Java字節(jié)碼保護(hù)系統(tǒng)包括兩個(gè)部分創(chuàng)建時(shí)間保護(hù)工具402和運(yùn)行時(shí)間安全模塊404。如所提到的,使用如上所述的可從加拿大安大略省渥太華的Cloakware公司得到的技術(shù),可以C/C++ 實(shí)現(xiàn)字節(jié)碼保護(hù)系統(tǒng)和有關(guān)方法。在部署之前,Java字節(jié)碼保護(hù)工具402用于使Java字節(jié)碼406安全(即“隱藏” (cloak))。該Java字節(jié)碼保護(hù)工具402允許在創(chuàng)建時(shí)規(guī)定的安全設(shè)置和保護(hù)機(jī)制。該工具在輸入原始Java應(yīng)用程序字節(jié)碼406時(shí)采用安全規(guī)范和WB密鑰,生成并生成與Java 字節(jié)碼保護(hù)安全模塊404 —起運(yùn)行的“隱藏后”的Java字節(jié)碼。Java字節(jié)碼保護(hù)工具402 包括規(guī)定如何啟動字節(jié)碼(例如通過受保護(hù)的應(yīng)用程序字節(jié)碼存根或受保護(hù)的字節(jié)碼類加載器)的選項(xiàng)、和規(guī)定用于部署后的安全Java字節(jié)碼的安全技術(shù)的選項(xiàng)。Java應(yīng)用程序的隱藏后的字節(jié)碼被分成兩部分1)受保護(hù)的Java應(yīng)用程序字節(jié)碼存根408,其被加載到目標(biāo)JVM環(huán)境410中,以及2)受保護(hù)的數(shù)據(jù)文件412和白盒安全模塊(WBSM)工具414,其將在運(yùn)行時(shí)分別由SM加載和訪問。創(chuàng)新的Java字節(jié)碼保護(hù)安全模塊404可以根據(jù)應(yīng)用程序的配置方法,通過這兩部分或者獨(dú)立地分配。通常,安全模塊404通??梢员灰淮涡缘匕惭b以及應(yīng)用于任何Java應(yīng)用程序的隱藏后的字節(jié)碼。用于創(chuàng)新的字節(jié)碼保護(hù)的各種方法可以與現(xiàn)有的Java字節(jié)碼保護(hù)系統(tǒng)400 —起使用。每種這樣的字節(jié)碼保護(hù)方法以字節(jié)碼的形式解決了對Java應(yīng)用程序的靜態(tài)和動態(tài)攻擊。一種字節(jié)碼保護(hù)方法包括白盒密碼或“WB密碼”,這是一種獨(dú)特的保護(hù)密碼算法的密碼技術(shù),以使它們的操作可以在惡意環(huán)境中執(zhí)行,而不泄漏密鑰及其它密碼值。換句話說,WB加密方法可以被執(zhí)行來抵御直接攻擊。本發(fā)明包括兩種WB密碼技術(shù),其包括外部WB 密碼庫和內(nèi)部WB密碼設(shè)備。外部WB密碼庫由C語言實(shí)現(xiàn),并且通過隱藏密鑰及其它密碼信息以防竄改特性進(jìn)行保護(hù),以便WB密碼操作能夠在不泄露包括密鑰在內(nèi)的有價(jià)值信息的情況下被受保護(hù)的 Java應(yīng)用程序使用并執(zhí)行。創(chuàng)新的內(nèi)部WB密碼設(shè)備是創(chuàng)建時(shí)保護(hù)工具402的功能組件,其接收密碼信息和密鑰,生成并生成用于創(chuàng)新保護(hù)工具和安全模塊404的WB密鑰數(shù)據(jù)和實(shí)用工具,以用于加密和解密不同形式的Java應(yīng)用程序字節(jié)碼和相關(guān)信息。另一創(chuàng)新的字節(jié)碼保護(hù)方法包括字節(jié)碼完整性校驗(yàn)(BIV)。在加載類或運(yùn)行Java 方法時(shí),通過BIV的保護(hù)可以檢測到和減輕對Java類或方法代碼的靜態(tài)和動態(tài)的竄改攻擊。在創(chuàng)建時(shí),創(chuàng)新方法從原始應(yīng)用程序歸檔文件中計(jì)算JAR文件、類和方法字節(jié)碼的靜態(tài)散列值。在加載和運(yùn)行時(shí),該創(chuàng)新方法通過尋址由JVM 410加載的類和方法字節(jié)碼來計(jì)算動態(tài)散列值,并且通過相對于靜態(tài)散列值核查動態(tài)散列值來進(jìn)行完整性校驗(yàn)。另一創(chuàng)新的字節(jié)碼保護(hù)方法包括隨后在附圖7中示出和描述的反調(diào)試(AD)。AD是如圖4所示的動態(tài)安全處理器416之一。AD保護(hù)可以通過在運(yùn)行時(shí)使用調(diào)試器(debugger) 來阻止和檢測動態(tài)攻擊。AD包括通過在啟動時(shí)和運(yùn)行時(shí)監(jiān)測系統(tǒng)環(huán)境的內(nèi)部和外部狀態(tài)來檢測攻擊的技術(shù)。一旦檢測到反調(diào)試攻擊,則調(diào)用相應(yīng)的對抗措施。另一創(chuàng)新的字節(jié)碼保護(hù)方法是安全加載字節(jié)碼(SLB)。該SLB保護(hù)方法在歸檔文件和Java類代碼加載到JVM 410之前,阻止和檢測對歸檔文件和Java類代碼的靜態(tài)反向工程和竄改攻擊。在創(chuàng)建時(shí),SLB保護(hù)方法對JAR文件和從原始應(yīng)用程序歸檔文件中選擇的類字節(jié)碼進(jìn)行加密,并且引入應(yīng)用程序存根類。當(dāng)JVM 410加載受保護(hù)的應(yīng)用程序時(shí), JVM410首先加載應(yīng)用程序存根類,然后觸發(fā)受保護(hù)的應(yīng)用程序的加載。下面在本文中進(jìn)一步描述的SLB動態(tài)安全處理器416是創(chuàng)新的Java字節(jié)碼保護(hù)安全模塊404的功能組件,在運(yùn)行時(shí)SLB動態(tài)安全處理器416通過JNI418與JVM 410連接。SLB動態(tài)安全處理器416對受保護(hù)的Java應(yīng)用程序字節(jié)碼加載到JVM 410的工作區(qū)域中進(jìn)行管理和控制。另一創(chuàng)新的字節(jié)碼保護(hù)方法是動態(tài)字節(jié)碼解密(DBD)。DBD保護(hù)方法阻止和減輕在運(yùn)行時(shí)對Java類或方法代碼的動態(tài)攻擊。另一組創(chuàng)新的字節(jié)碼保護(hù)方法包括轉(zhuǎn)移執(zhí)行和部分執(zhí)行。這兩種保護(hù)方法將原始執(zhí)行的一部分移到安全模塊404中,并且確保在僅一部分執(zhí)行暴露在JVM 410中,以阻止和減輕在運(yùn)行時(shí)引發(fā)攻擊的動態(tài)代碼。例如,某些Java字節(jié)碼可以轉(zhuǎn)化成C語言代碼(J2C), 其可以在安全模塊404中被保護(hù)和執(zhí)行。另一創(chuàng)新的字節(jié)碼保護(hù)方法包括字節(jié)碼轉(zhuǎn)換??梢酝ㄟ^包括數(shù)據(jù)流轉(zhuǎn)換和控制流轉(zhuǎn)換的技術(shù)來實(shí)現(xiàn)這種保護(hù)。字節(jié)碼轉(zhuǎn)換可以將原始字節(jié)碼轉(zhuǎn)換成不同的代碼結(jié)構(gòu),同時(shí)仍保持原有功能。轉(zhuǎn)換后的字節(jié)碼變得難以被反向工程或竄改。參照圖5,Java字節(jié)碼保護(hù)工具402將不同的保護(hù)技術(shù)應(yīng)用于原始應(yīng)用程序字節(jié)碼。因此,Java字節(jié)碼保護(hù)工具402生成生成受保護(hù)的字節(jié)碼和相關(guān)數(shù)據(jù)和實(shí)用工具,該字節(jié)碼和相關(guān)數(shù)據(jù)和實(shí)用工具在運(yùn)行時(shí)與Java字節(jié)碼安全模塊一同工作,以對Java字節(jié)碼執(zhí)行那些指定的保護(hù)技術(shù)。Java字節(jié)碼保護(hù)工具402通過用戶接口 518接收密碼信息的三個(gè)輸入和密鑰502、原始JAR文件504和配置選項(xiàng)506,并且執(zhí)行這三種操作。第一基本操作包括生成WB密鑰數(shù)據(jù)和實(shí)用工具。WB靜態(tài)處理器使用密碼信息和密鑰502生成WB加密密鑰數(shù)據(jù)510,WB加密密鑰數(shù)據(jù)510由不同的靜態(tài)安全處理器(每一個(gè)都將在下文中進(jìn)行更詳細(xì)地描述)和工具自身所使用。此外,保護(hù)工具402的創(chuàng)建時(shí)處理生成WB解密密鑰數(shù)據(jù),該WB解密密鑰數(shù)據(jù)被存儲成數(shù)據(jù)保護(hù)文件夾514中的運(yùn)行時(shí)數(shù)據(jù)512的一部分。通過設(shè)置WB安全模塊(SM)實(shí)用工具516,從而在運(yùn)行時(shí)使用WB解密密鑰數(shù)據(jù)執(zhí)行由動態(tài)安全處理器調(diào)用的WB解密操作。第二基本操作包括保護(hù)技術(shù)的應(yīng)用。根據(jù)配置選項(xiàng),Java字節(jié)碼保護(hù)工具402使用不同的靜態(tài)安全處理器,以將應(yīng)用程序字節(jié)碼從原始形式修改為受保護(hù)的形式。這樣做時(shí),該操作生成受保護(hù)的Java應(yīng)用程序字節(jié)碼存根408和相關(guān)的保護(hù)數(shù)據(jù)文件,該相關(guān)的保護(hù)數(shù)據(jù)文件包含各種保護(hù)形式的受保護(hù)的應(yīng)用程序字節(jié)碼和重要的運(yùn)行時(shí)數(shù)據(jù)。第三基本操作包括封裝受保護(hù)的Java字節(jié)碼的可部署形式。在處理的后期,Java 字節(jié)碼保護(hù)工具402將正確地構(gòu)造和封裝所有輸出文件,以便可以通過JVM 410加載Java 應(yīng)用程序字節(jié)碼存根408。該Java應(yīng)用程序字節(jié)碼存根408是啟動隱藏的Java應(yīng)用程序的進(jìn)入點(diǎn),其可以采用各種形式,包括可以由外部程序啟動的類文件、通過另一 Java類啟動的類文件或Java類加載器。Java字節(jié)碼保護(hù)工具402還將正確地構(gòu)造和封裝所有輸出文件,以使WB SM工具516可以被Java字節(jié)碼安全模塊的功能組件所調(diào)用。更進(jìn)一步,Java 字節(jié)碼保護(hù)工具402還將正確地構(gòu)造和封裝所有輸出文件,以便所有保護(hù)數(shù)據(jù)文件可以被 Java字節(jié)碼安全模塊404的某些功能組件所訪問。圖5示出保護(hù)Java應(yīng)用程序字節(jié)碼的上述創(chuàng)建時(shí)處理的概圖。參照圖5,現(xiàn)在將描述主要的功能組件和數(shù)據(jù)文件。Java字節(jié)碼保護(hù)工具402包括用戶接口 518,其用于與用戶交互以接收用戶指令和主要輸入。該指令和輸入可以包括包括密碼算法選擇的密碼信息和密鑰502、以及原始密鑰材料;包括將被保護(hù)的未保護(hù)字節(jié)碼的原始應(yīng)用程序字節(jié)碼歸檔文件504、和配置選項(xiàng)506,配置選項(xiàng)506包括用戶選項(xiàng),以管理Java字節(jié)碼保護(hù)工具402在什么方面以及如何保護(hù)應(yīng)用程序字節(jié)碼,例如,用戶可以指定特定的類和方法是否將被保護(hù)。Java字節(jié)碼保護(hù)工具402還包括保護(hù)管理器520。保護(hù)管理器520被設(shè)置成解釋配置選項(xiàng)506,以及以相互關(guān)聯(lián)的順序協(xié)調(diào)不同的保護(hù)技術(shù)使其關(guān)聯(lián),以便生成的整體保護(hù)強(qiáng)于每個(gè)單獨(dú)的保護(hù)。此外,管理器520包括通常由Java字節(jié)碼保護(hù)工具402的其它功能組件所使用的實(shí)用工具。Java字節(jié)碼保護(hù)工具402還包括靜態(tài)安全處理器522。每個(gè)單獨(dú)的靜態(tài)處理器都可以被保護(hù)管理器520所調(diào)用,以執(zhí)行各個(gè)預(yù)定的保護(hù)技術(shù)。在所示的實(shí)施方式中,示出了 WB靜態(tài)處理器508、BIV靜態(tài)處理器524、AD靜態(tài)處理器526、SLB靜態(tài)處理器5^、DBD靜態(tài)處理器530、轉(zhuǎn)移執(zhí)行靜態(tài)處理器532、部分執(zhí)行靜態(tài)處理器534和代碼轉(zhuǎn)換工具536。在下文中將詳細(xì)地描述每個(gè)靜態(tài)安全處理器。保護(hù)管理器520和靜態(tài)安全處理器522被設(shè)計(jì)成一同工作以提供嵌入機(jī)制,從而通過容易地將其它新安全處理器與保護(hù)工具集成來添加或擴(kuò)展安全能力和新的保護(hù)。
Java字節(jié)碼保護(hù)工具402還包括由WB靜態(tài)安全處理器508所生成的WB加密密鑰510。WB加密密鑰數(shù)據(jù)510由管理器520和靜態(tài)安全處理器522所使用,以加密某些形式的字節(jié)碼和保護(hù)數(shù)據(jù)。Java字節(jié)碼保護(hù)工具402還包括由WB靜態(tài)安全處理器510所生成的WB SM實(shí)用工具516。WB SM實(shí)用工具516由安全模塊404中的動態(tài)安全處理器(在下文中進(jìn)一步描述)所使用。Java字節(jié)碼保護(hù)工具402還包括受保護(hù)的Java應(yīng)用程序字節(jié)碼存根408。存根 408僅包括用于JVM 410的受保護(hù)的Java應(yīng)用程序的引導(dǎo)(boot-strap),以首先加載然后觸發(fā)安全字節(jié)碼加載器函數(shù)來從保護(hù)數(shù)據(jù)文件中加載實(shí)際受保護(hù)的字節(jié)碼。Java字節(jié)碼保護(hù)工具402還包括由工具生成的受保護(hù)的J2C庫538。受保護(hù)的 J2C庫包括已經(jīng)從Java字節(jié)碼轉(zhuǎn)化的各種C語言形式的受保護(hù)代碼。該庫通過Java字節(jié)碼安全模塊動態(tài)地鏈接和調(diào)用。Java字節(jié)碼保護(hù)工具402還包括受保護(hù)的字節(jié)碼數(shù)據(jù)MO。該受保護(hù)的字節(jié)碼數(shù)據(jù)540是由工具生成的一種受保護(hù)的數(shù)據(jù)文件,并且其包括各種受保護(hù)的字節(jié)碼。Java字節(jié)碼保護(hù)工具402還包括運(yùn)行時(shí)數(shù)據(jù)512。該運(yùn)行時(shí)數(shù)據(jù)512包括各種與安全有關(guān)的信息,例如但不限于,WB解密密鑰數(shù)據(jù)、完整性校驗(yàn)靜態(tài)散列值、受保護(hù)的類和方法信息以及表格。還應(yīng)當(dāng)理解,Java字節(jié)碼保護(hù)工具402顯示出可下載能力。因而,在運(yùn)行時(shí),此保護(hù)工具的所有輸出(包括受保護(hù)的Java應(yīng)用程序字節(jié)碼存根408、受保護(hù)的J2C庫538、受保護(hù)的字節(jié)碼數(shù)據(jù)540和運(yùn)行時(shí)數(shù)據(jù)51 都是可下載的。在圖6中,示出了根據(jù)本發(fā)明通過圖4所示的Java字節(jié)碼保護(hù)安全模塊404來保護(hù)Java應(yīng)用程序字節(jié)碼的運(yùn)行時(shí)處理的概圖。如上所述,Java字節(jié)碼保護(hù)安全模塊404被以C編程語言開發(fā),并且其自身通過防竄改技術(shù)(例如加拿大安大略省渥太華的Cloakware 公司提供的技術(shù))進(jìn)行保護(hù),從而是穩(wěn)定且防竄改的。應(yīng)當(dāng)理解,Java字節(jié)碼保護(hù)工具402 和安全模塊404后臺的編程引擎可以是用其它編程語言開發(fā)的引擎。實(shí)際上,本發(fā)明后臺的Java虛擬機(jī)安全模塊404可以由其它編程語言開發(fā),條件是該語言能夠與Java虛擬機(jī)進(jìn)行接口連接。當(dāng)開始運(yùn)行時(shí),當(dāng)JVM 410加載任何正常的Java應(yīng)用程序時(shí),JVM410加載受保護(hù)的Java應(yīng)用程序字節(jié)碼存根408。這觸發(fā)了 Java應(yīng)用程序字節(jié)碼存根408通過JNI 602 與安全模塊404的相互作用,從而引導(dǎo)受信任的且受保護(hù)的Java應(yīng)用程序字節(jié)碼。在運(yùn)行時(shí),安全模塊404用來管理和控制數(shù)據(jù)流,以使Java應(yīng)用程序字節(jié)碼和執(zhí)行變得安全且受保護(hù),從而因此阻止對字節(jié)碼和執(zhí)行的動態(tài)攻擊。進(jìn)一步參照圖6,現(xiàn)在將描述主要的功能組件和數(shù)據(jù)文件。數(shù)據(jù)和流量控制通過 Java應(yīng)用程序字節(jié)碼工作區(qū)域604流向安全模塊404或來自安全模塊404。工作區(qū)域604 是JVM 410中用于Java應(yīng)用程序的虛擬工作區(qū)域。在包括加載和執(zhí)行應(yīng)用程序的運(yùn)行時(shí)的不同狀態(tài)中,可以有區(qū)別地管理位于JVM 410中的實(shí)際應(yīng)用程序字節(jié)碼。工作區(qū)域的每個(gè)狀態(tài)都包括合法的和完全有效的應(yīng)用程序字節(jié)碼,但不包括所有的應(yīng)用程序字節(jié)碼。任選地,基于創(chuàng)建時(shí)配置的設(shè)置(例如以Java和C語言執(zhí)行選項(xiàng)進(jìn)行轉(zhuǎn)移執(zhí)行),這些字節(jié)碼的某些部分總是被保持成其受保護(hù)形式。當(dāng)要求執(zhí)行這部分字節(jié)碼時(shí),安全模塊404將即時(shí)地將工作區(qū)域中這部分字節(jié)碼加載和還原到JVM 410中,然后在執(zhí)行后將其移除。此外, 某些原始方法的字節(jié)碼已經(jīng)被譯成C語言函數(shù),該C語言函數(shù)不能從JVM410中直接看到, 只能通過安全模塊404進(jìn)行調(diào)用。在此方法中,攻擊者只能在運(yùn)行時(shí)的任何指定時(shí)刻處,看到原始應(yīng)用程序字節(jié)碼的片段,這使得難以進(jìn)行整個(gè)應(yīng)用程序字節(jié)碼的反向工程。安全模塊404 (SM)還包括圖6中被稱為JNI SM橋418的橋接機(jī)制。JNI SM橋418 是相互作用組件,其通過JNI 602在JVM 410與安全模塊404之間進(jìn)行連接和共同作用。 JNI SM橋418的子組件包括JNI 602,以在JVM 410與本機(jī)代碼之間提供單獨(dú)的相互作用機(jī)制。下行調(diào)用存根612和上行調(diào)用存根608也包括在子組件中。這些存根提供應(yīng)用編程接口,以通過本機(jī)編程代碼形式的安全模塊404將下行調(diào)用從JVM 410的Java應(yīng)用程序字節(jié)碼工作區(qū)域604重新定向至動態(tài)安全處理器611,并且將上行調(diào)用從安全模塊404重新定向至JVM 610。示出的第三子組件是SM管理器610。SM管理器是用于安全模塊404的控制器和協(xié)調(diào)器。它不僅管理和維持對Java應(yīng)用程序字節(jié)碼的各種指定保護(hù),還管理和維持對安全模塊404自身的各種指定保護(hù)。SM管理器還包括通常由安全模塊404的其它功能部件所使用的實(shí)用工具。安全模塊404還包括多個(gè)動態(tài)安全處理器611。每個(gè)單獨(dú)的動態(tài)安全處理器611 都被調(diào)用以執(zhí)行特定的保護(hù)技術(shù)。如圖所示,根據(jù)某些實(shí)施方式的動態(tài)安全處理器可以包括WB動態(tài)安全處理器614、字節(jié)碼完整性校驗(yàn)動態(tài)安全處理器616、反調(diào)試動態(tài)安全處理器 618、SLB動態(tài)安全處理器620、DBD動態(tài)安全處理器622、轉(zhuǎn)移執(zhí)行動態(tài)安全處理器624、部分執(zhí)行動態(tài)安全處理器擬6和代碼轉(zhuǎn)換628。動態(tài)安全處理器611的細(xì)節(jié)將隨后在下文中進(jìn)行描述。SM管理器610和動態(tài)安全處理器611還被設(shè)計(jì)成與創(chuàng)建時(shí)Java字節(jié)碼保護(hù)工具 402相協(xié)調(diào),以使它們一同工作,從而提供嵌入機(jī)制,通過容易地將其它新的動態(tài)安全處理器與安全模塊集成來添加或擴(kuò)展安全能力和新的保護(hù)。在圖7中,示出了用于外部反調(diào)試監(jiān)測的創(chuàng)新性方法的一個(gè)實(shí)施方式。在本文中, Java平臺調(diào)試架構(gòu)(JPDA)有助于調(diào)試Java應(yīng)用程序。該創(chuàng)新性的方法集中于根據(jù)JPDA 檢測調(diào)試的能力和隨后的調(diào)試活動。如圖所示,多層防御策略用于使獲得運(yùn)行的JVM處理中的靜態(tài)和動態(tài)的調(diào)試活動的機(jī)會最大化。在圖7所示的AD方法中示出的3個(gè)代理可被配置成執(zhí)行正常的或合法的調(diào)試活動。3個(gè)代理包括內(nèi)核監(jiān)測代理(Kernel Monitor Agent, KMA) 702、調(diào)試器連接監(jiān)測代理(Debugger Attachment Monitor Agent,DAMA) 710 和調(diào)試程 Hljftii (Debugging Procedure Monitor Agent,DPMA) 718。對于訪問內(nèi)核空間701的KMA 702,需要在可以執(zhí)行任何調(diào)試功能之前,使JVM處理將調(diào)試庫705加載到其存儲空間中。當(dāng)Java應(yīng)用程序啟動時(shí),派生(Spawn)KMA 702。KMA 702定期地從內(nèi)核中檢查其自身的進(jìn)程圖703,以確定與JDPA相關(guān)的庫是否已經(jīng)加載到其存儲空間中。如果發(fā)現(xiàn)這些庫,就采取適當(dāng)?shù)南嚓P(guān)活動。對于DAMA 710,該代理提供了第二道防線。DAMA 710設(shè)有Java虛擬機(jī)工具接口 (JVMTI)能力并且當(dāng)JVM啟動700時(shí)被加載。設(shè)置回調(diào)函數(shù)來不斷監(jiān)測在運(yùn)行時(shí)生成的每個(gè)線程的線程啟動篩選。每當(dāng)JVM加載執(zhí)行調(diào)試所必要的某些線程時(shí),都可以獲得Java應(yīng)用程序中任何附接的JDPA調(diào)試器的活動。由此,AMA使線程啟動監(jiān)聽器707以檢測新的線程啟動709并檢測與JDPA有關(guān)的線程711。
對于DPMA 718,該代理設(shè)置為第三道防線。DPMA 718也可以運(yùn)行在JVMTI環(huán)境中。 只要采取這樣的活動,就會觸發(fā)監(jiān)測調(diào)試程序(例如,碰到斷點(diǎn)線)的回調(diào)函數(shù)。=例如線程和其斷點(diǎn)位置的詳細(xì)信息可以被收集。由此,DMPA啟動換行符監(jiān)聽器713、檢測調(diào)試活動 715和報(bào)告任何線程和方法信息717。KMA,DAMA和DPMA中每一個(gè)都可以觸發(fā)JVM7^的活動和禁用。 現(xiàn)在將更詳細(xì)地描述上述靜態(tài)和動態(tài)安全處理器。WB安全處理器包括如圖8所示的外部WB密碼庫和如圖9所示的內(nèi)部WB密碼設(shè)備。由WB動態(tài)安全處理器614提供的圖8中的外部WB密碼庫提供可以通過JNI安全模塊接口 804由用于WB加密與解密函數(shù)的Java應(yīng)用程序所使用的庫。WB靜態(tài)處理器508 從用戶處接收密碼信息和原始密鑰502,并且生成可根據(jù)需要進(jìn)行分配和循環(huán)的密鑰數(shù)據(jù) 803,然后密碼庫可用于安全密碼操作。內(nèi)部WB密碼設(shè)備包括WB靜態(tài)處理器508,在圖9中示出了多個(gè)靜態(tài)和動態(tài)組件。 WB靜態(tài)處理器508從用戶處接收密碼信息和原始密鑰502,并且生成WB加密密鑰數(shù)據(jù)904, 然后其它靜態(tài)安全處理器用906將該WB加密密鑰數(shù)據(jù)904用作不同保護(hù)技術(shù)的一部分以對不同形式的應(yīng)用程序字節(jié)碼進(jìn)行加密操作。WB靜態(tài)處理器508還生成WB解密密鑰數(shù)據(jù) 908并設(shè)置WB安全模塊實(shí)用工具630,WB解密密鑰數(shù)據(jù)908和WB安全模塊實(shí)用工具630由動態(tài)安全處理器611所使用以在安全模塊914執(zhí)行動態(tài)保護(hù)時(shí)進(jìn)行解密操作。Java字節(jié)碼保護(hù)工具402還包括如圖10所示的預(yù)處理方法。預(yù)處理工具1001接收原始Java應(yīng)用程序字節(jié)碼歸檔文件1005并將它們譯為原始應(yīng)用程序字節(jié)碼的內(nèi)部表示 (Internal Representation, IR)。然后特定的類和方法根據(jù)用戶選項(xiàng)1003被標(biāo)記以用于其保護(hù)和保護(hù)方式。因此生成保護(hù)標(biāo)記信息1004。頂形式的原始應(yīng)用程序字節(jié)碼1000和保護(hù)標(biāo)記信息1004被每個(gè)靜態(tài)安全處理器522所使用以進(jìn)行期望的保護(hù)。在Java保護(hù)工具402的每個(gè)靜態(tài)安全處理器中都設(shè)有字節(jié)碼完整性校驗(yàn) (Bytecode Integrity Verif ication,BIV)。圖 11 示出了 BIV 靜態(tài)安全處理器 524 的工作流程。同樣,圖12示出BIV動態(tài)安全處理器616的工作流程。在本文中,BIV通過在運(yùn)行時(shí)引入動態(tài)完整性校驗(yàn)?zāi)芰Φ絁ava字節(jié)碼中,從而提供了特定的防竄改保護(hù)。通常,在創(chuàng)建時(shí),工具用于標(biāo)記需要BIV保護(hù)的類和方法,并在其中生成BIV數(shù)據(jù)1202,然后該類和方法被保護(hù),并且BIV活動創(chuàng)建到Java字節(jié)碼中。在運(yùn)行時(shí),通過用于BIV保護(hù)的類和方法的 Java字節(jié)碼保護(hù)安全模塊404觸發(fā)BIV活動,其中為類和方法的各個(gè)字節(jié)碼即時(shí)地計(jì)算動態(tài)安全散列值。靜態(tài)和動態(tài)安全散列值被表示為安全形式,并且利用成功和/或失敗回調(diào)函數(shù)被提供到防竄改守衛(wèi)器(Tamper Resistance Gate Keeper, TRGK)1216。TRGK1216 確定BIV檢查成功還是失敗,而無需明確地比較靜態(tài)和動態(tài)安全散列值。這可以通過特別設(shè)計(jì)的數(shù)學(xué)計(jì)算形式的適當(dāng)算法來實(shí)現(xiàn)。如果靜態(tài)和動態(tài)安全散列值是相同的,那么通常表示BIV檢查通過,并且可以調(diào)用成功的回調(diào)函數(shù)。否則,如果靜態(tài)和動態(tài)安全散列值不同, 那么表示檢測到特定類或方法的竄改,并且BIV檢查失敗。因此,可以調(diào)用失敗回調(diào)函數(shù)。 這些回調(diào)函數(shù)是用戶定義的阻抗措施,以對竄改攻擊進(jìn)行檢測。在本發(fā)明中,Java字節(jié)碼的動態(tài)安全散列值1214的計(jì)算處理不同于正常的本機(jī)二進(jìn)制代碼的通常的計(jì)算處理,在本機(jī)二進(jìn)制代碼計(jì)算中,計(jì)算僅需要從被分配成可執(zhí)行的存儲器中直接挑選本機(jī)代碼來進(jìn)行。通常,應(yīng)用程序代碼無法在Java運(yùn)行時(shí)直接從存儲器中得到代碼段。相反地,應(yīng)用程序代碼通過JVM 410機(jī)制獲取類或方法的字節(jié)碼。在本發(fā)明中,安全模塊通過使用上行至JVM 410的上行調(diào)用來調(diào)節(jié)該能力和JNI接口以檢索字節(jié)碼,然后計(jì)算安全的動態(tài)散列值1214并且相對于預(yù)先記錄的散列值執(zhí)行檢索后的字節(jié)碼的完整性校驗(yàn)檢查。參照圖11,可以看出,字節(jié)碼完整性校驗(yàn)靜態(tài)安全處理器5 包括字節(jié)碼標(biāo)記。 BIV靜態(tài)安全處理器524的主要功能之一是貫查應(yīng)用程序字節(jié)碼,并且使用保護(hù)標(biāo)記信息 1105檢查每一個(gè)類和方法,以確定哪個(gè)類或方法需要BIV保護(hù)。如果類或方法需要BIV保護(hù),則通過對特定的類或方法字節(jié)碼1106、1107使用安全的散列計(jì)算來計(jì)算特定的散列值。一般而言,通常使用計(jì)算領(lǐng)域中已知的安全的散列計(jì)算算法。這些生成的散列值以被組織且被構(gòu)造的方式存儲為BIV數(shù)據(jù)1108,以便在運(yùn)行時(shí)可以有效地對其進(jìn)行使用。字節(jié)碼完整性校驗(yàn)靜態(tài)安全處理器的BIV數(shù)據(jù)1108是數(shù)據(jù)容器,該數(shù)據(jù)容器包括類和方法的靜態(tài)散列值的數(shù)據(jù)以及諸如WB BIV解密密鑰數(shù)據(jù)的其它信息。在運(yùn)行時(shí)通過動態(tài)BIV安全處理器使用該數(shù)據(jù)。為了對該數(shù)據(jù)進(jìn)行更加有效地使用,根據(jù)與待保護(hù)的類和方法以及它們的靜態(tài)散列值有關(guān)的對應(yīng)信息來構(gòu)造BIV數(shù)據(jù)1108。字節(jié)碼完整性校驗(yàn)靜態(tài)安全處理器5 還用來轉(zhuǎn)換和加密BIV數(shù)據(jù)1108。保持 BIV數(shù)據(jù)1108的完整性是非常重要的??梢酝ㄟ^網(wǎng)絡(luò)來傳送或下載BIV數(shù)據(jù)。相應(yīng)地,本發(fā)明對它們進(jìn)行轉(zhuǎn)換和加密作為為了使用而對其進(jìn)行封裝的一部分。在沒有保護(hù)的情況下, 對BIV數(shù)據(jù)的任何竄改都可以是破壞BIV保護(hù)的方式。在封裝時(shí),BIV靜態(tài)安全處理器對 BIV數(shù)據(jù)進(jìn)行雙重保護(hù),以防止對敏感BIV數(shù)據(jù)的靜態(tài)攻擊。首先,BIV靜態(tài)安全處理器524 對靜態(tài)散列值進(jìn)行數(shù)據(jù)轉(zhuǎn)換,以使這些值可以在運(yùn)行時(shí)以轉(zhuǎn)換后的形式通過動態(tài)BIV安全處理器616進(jìn)行操作。這用來確保實(shí)明值(real plain value)從不被暴露。然后,BIV靜態(tài)安全處理器5M對這些轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行加密,以便在被動態(tài)地使用之前防止對轉(zhuǎn)換后的數(shù)值所進(jìn)行的任何竄改。應(yīng)當(dāng)理解,BIV數(shù)據(jù)1108是一種運(yùn)行時(shí)數(shù)據(jù),在運(yùn)行時(shí)通過動態(tài)安全處理器611 使用BIV數(shù)據(jù)1108。根據(jù)用戶選項(xiàng),運(yùn)行時(shí)數(shù)據(jù)可以編制和存儲到單個(gè)文件中或多個(gè)文件中。形成多個(gè)運(yùn)行時(shí)數(shù)據(jù)文件具有一些優(yōu)點(diǎn),例如可以以更加精細(xì)的方式更新和下載這些數(shù)據(jù)信息。例如,可以構(gòu)造BIV數(shù)據(jù)1108,以用于每一個(gè)將被保護(hù)的Java類。以這種方式, 可以基于每個(gè)類更可行地實(shí)施BIV保護(hù)。 字節(jié)碼完整性校驗(yàn)靜態(tài)安全處理器5 還提供特定的BIV觸發(fā)。通過外部BIV API 和內(nèi)部BIV觸發(fā)器可以提供兩種運(yùn)行時(shí)觸發(fā)BIV的方法。作為根據(jù)本發(fā)明設(shè)計(jì)的系統(tǒng)的一部分的第一種方法,為用戶提供一組外部BIV API,以在用戶明確想執(zhí)行BIV檢查的Java代碼內(nèi)的正確位置中使用這組外部BIV API。用戶可以指示哪個(gè)Java類或方法需要BIV檢查。通過使用回調(diào)函數(shù),用戶將完全控制減輕行為。另一種方法是通過用戶調(diào)用外部API 來替換觸發(fā)。相反地,BIV觸發(fā)器可以預(yù)先創(chuàng)建在Java字節(jié)碼保護(hù)安全模塊的某些函數(shù)中。 Java應(yīng)用程序每次調(diào)用那些函數(shù)時(shí),可以以預(yù)先設(shè)置的方式觸發(fā)內(nèi)部BIV活動。某些減輕行為被預(yù)定義,并且由安全模塊在內(nèi)部使用。然而,用戶仍然部分地控制減輕行為。這使得通過提供用于用戶的預(yù)置API來預(yù)先設(shè)置由安全模塊采用的減輕動作,從而能夠按照設(shè)置相應(yīng)地進(jìn)行活動。通常,用戶可對是否和在哪里使用外部BIV API進(jìn)行完全控制,并且對是否在創(chuàng)建時(shí)使用內(nèi)部BIV觸發(fā)來進(jìn)行間接控制。當(dāng)內(nèi)部BIV被安全模塊隱藏或控制時(shí),用戶不控制在哪里觸發(fā)內(nèi)部BIV。參照圖12,可出看出字節(jié)碼完整性校驗(yàn)動態(tài)安全處理器616包括BIV初始化。BIV 初始化被設(shè)置成加載安全的靜態(tài)BIV數(shù)據(jù)1202并使用WBBIV解密密鑰數(shù)據(jù)1203對所加載的BIV數(shù)據(jù)進(jìn)行解密,之后以安全的形式將它們加載到存儲器中。可以以兩種方式執(zhí)行BIV 初始化作為安全模塊初始化的一部分或者在動態(tài)BIV期間根據(jù)需要來進(jìn)行。對于第一種方式,當(dāng)加載受保護(hù)的Java應(yīng)用程序時(shí),BIV初始化可以一次性地實(shí)現(xiàn)為SM初始化的一部分。對于第二種方式,通過加載在動態(tài)BIV期間需要的內(nèi)容來實(shí)現(xiàn)BIV初始化。當(dāng)類需要 BIV時(shí),可以進(jìn)行BIV初始化??梢栽陬惣墑e下組織BIV數(shù)據(jù)文件。對于特定的類,可以僅為此類加載和解密BIV數(shù)據(jù)。第二種方式可以為用戶提供更大的靈活性,以便在類的字節(jié)碼改變時(shí)對BIV數(shù)據(jù)所需要的小變化進(jìn)行調(diào)節(jié)。字節(jié)碼完整性校驗(yàn)動態(tài)安全處理器還執(zhí)行動態(tài)BIV 1210。如上所述,可以通過外部BIV API調(diào)用或者其它功能調(diào)用,將類或方法的動態(tài)BIV從受保護(hù)的Java應(yīng)用程序發(fā)送到安全模塊,該安全模塊包含預(yù)先安排的內(nèi)部BIV觸發(fā)。實(shí)施動態(tài)BIV至少包括以下關(guān)鍵行為得到最新的字節(jié)碼、計(jì)算動態(tài)安全散列值、以及提供防竄改守衛(wèi)(TRGK) 1216。通過上行調(diào)用得到最新的字節(jié)碼。為了可靠地計(jì)算用于安全模塊中的類或方法的安全動態(tài)散列值,必須經(jīng)由JNI通過至JVM 410的上行調(diào)用來獲得類或方法的最新字節(jié)碼。 相同的字節(jié)碼自身應(yīng)該被解釋或編譯為二進(jìn)制,同時(shí)執(zhí)行加載到JVM 410的類或方法。如果沒有對字節(jié)碼的竄改攻擊,字節(jié)碼應(yīng)該是與已經(jīng)計(jì)算的靜態(tài)安全散列值相同的字節(jié)碼。動態(tài)安全散列值的計(jì)算活動包括通常已知的散列計(jì)算,但是生成的值是受保護(hù)的形式,并且將以受保護(hù)的形式被使用。將TRGK 1216設(shè)置成包括兩次輸入。TRGK 1216使用用于特定的類或方法的靜態(tài)和動態(tài)安全散列值(SSHV 1212、DSHV 1214),以驗(yàn)證類或方法的字節(jié)碼的完整性是否被損害。如果對字節(jié)碼有任何竄改,則其DSHV 1214與其SSHV 1212不同。TRGK 1216可以檢測到對字節(jié)碼的任何竄改。如果BIV驗(yàn)證通過,則TRGK 1216將觸發(fā)成功回調(diào)函數(shù)或返回到原BIV觸發(fā);否則,TRGK 1216將觸發(fā)失敗回調(diào)函數(shù)作為用戶的減輕行為。字節(jié)碼完整性校驗(yàn)動態(tài)安全處理器616還包括BIV關(guān)閉形式的終止步驟。作為安全模塊一部分的BIV關(guān)閉將清理存儲空間和由BIV動態(tài)安全處理器使用的其它信息。參照圖13,示出了安全加載字節(jié)碼(Secure Loading Bytecode, SLB)的靜態(tài)安全處理器528。SLB靜態(tài)安全處理器5 接收原始Java應(yīng)用程序字節(jié)碼1301的內(nèi)部表示、WB 加密數(shù)據(jù)1302和解密密鑰數(shù)據(jù)1304以及保護(hù)標(biāo)記信息1306.SLB靜態(tài)安全處理器5 的重要輸出是應(yīng)用程序存根1308。應(yīng)用程序存根1308包括引導(dǎo)類,以在運(yùn)行時(shí)通過安全模塊啟動加載程序。通過JVM 410加載應(yīng)用程序存根1308。 應(yīng)用程序存根1308包含使應(yīng)用程序獨(dú)立執(zhí)行或通過另一 Java應(yīng)用程序執(zhí)行所必需的每個(gè)外部公共API。應(yīng)用程序存根1308包含對至安全模塊的下行調(diào)用函數(shù)進(jìn)行調(diào)用的方法,該方法將解密Java應(yīng)用程序并將Java應(yīng)用程序加載到JVM上以用于執(zhí)行。為了準(zhǔn)備應(yīng)用程序存根,SLB靜態(tài)安全處理器5 包括應(yīng)用程序字節(jié)碼工作幀 1310和加密后的應(yīng)用程序字節(jié)碼工作幀1312。應(yīng)用程序字節(jié)碼工作幀1310不同于原始應(yīng)用程序字節(jié)碼1301。通常,應(yīng)用程序字節(jié)碼工作幀1310中的類不需要保護(hù),因此它將與原始的類相同。如果需要可靠地加載類,則由類存根來替代原始的類字節(jié)碼,因此類字節(jié)碼
16是原始的字節(jié)碼。在創(chuàng)建時(shí),通過經(jīng)由靜態(tài)安全處理器5 使用應(yīng)用程序WB加密密鑰數(shù)據(jù) 1302來加密應(yīng)用程序字節(jié)碼工作幀1310,從而獲得加密的幀1312,在運(yùn)行時(shí),通過經(jīng)由動態(tài)安全處理器620使用應(yīng)用程序WB解密密鑰數(shù)據(jù)1304來解密經(jīng)加密的幀1312。除應(yīng)用程序存根1308之外,還生成應(yīng)用程序的有效載荷(payload) 1314。應(yīng)用程序的有效載荷1314包括加密后的應(yīng)用程序工作幀1312和應(yīng)用程序的WB解密密鑰數(shù)據(jù) 1316。受保護(hù)的應(yīng)用程序有效載荷中的應(yīng)用程序的WB解密密鑰數(shù)據(jù)1316是以下密鑰數(shù)據(jù), 該密鑰數(shù)據(jù)由WB靜態(tài)安全處理器508生成、并傳送至SLB靜態(tài)安全處理器5 作為WB解密密鑰數(shù)據(jù)1302的一部分。在運(yùn)行時(shí),它用于對加密的應(yīng)用程序字節(jié)碼工作幀1312進(jìn)行解密。如圖13所示,底層代碼可以形成為類字節(jié)碼1318、類存根1320或加密的類字節(jié)碼1322。類字節(jié)碼1318是原始字節(jié)碼。類存根1320包括引導(dǎo)方法,以在運(yùn)行時(shí)通過安全模塊執(zhí)行信任的類加載處理,從而在必要時(shí)加載加密的類字節(jié)碼1322。在封裝時(shí),分析類字節(jié)碼1318。由對安全模塊調(diào)用下行調(diào)用方法的方法來替代標(biāo)記方法,在該調(diào)用方法中,安全模塊通過封裝時(shí)指定的安全處理器方法來調(diào)用原始字節(jié)碼的功能。在創(chuàng)建時(shí),通過經(jīng)由靜態(tài)安全處理器5 使用類WB加密密鑰數(shù)據(jù)1302加密類字節(jié)碼1318,來獲取加密的類字節(jié)碼1322,在運(yùn)行時(shí)通過經(jīng)由動態(tài)安全處理器620使用類WB解密密鑰數(shù)據(jù)1304來解密加密的幀1312。加密的類字節(jié)碼幀13 通過SLB靜態(tài)安全處理器5 來生成。加密的類字節(jié)碼幀13M包括用于一個(gè)或多個(gè)類的加密的類字節(jié)碼和類的WB解密密鑰。用戶具有在加密類字節(jié)碼1322中控制幀可以包括多少類的選項(xiàng)。用戶具有將它們在運(yùn)行時(shí)一同加載或分別加載的選項(xiàng)。類的WB解密密鑰數(shù)據(jù)通過WB靜態(tài)安全處理器508來生成,并且傳到SLB靜態(tài)安全處理器5 作為WB解密密鑰數(shù)據(jù)1304的一部分。在運(yùn)行時(shí),類的WB解密密鑰數(shù)據(jù) 1304用于解密該加密的類字節(jié)碼1322。用戶具有是否生成一個(gè)或多個(gè)類的WB加密與解密密鑰的選項(xiàng)。對于圖14,示出了 SLB動態(tài)安全處理器620的工作流程。SLB動態(tài)安全處理器620 是安全模塊的功能部件,其在字節(jié)碼執(zhí)行期間通過JNI與JVM410連接。SLB動態(tài)安全處理器620對受保護(hù)的Java應(yīng)用程序字節(jié)碼加載到JVM410的工作區(qū)域中進(jìn)行管理和控制。有利地,這樣的能力確保原Java應(yīng)用程序字節(jié)碼被保護(hù)且以被保護(hù)的形式進(jìn)行分配,以阻止在將應(yīng)用程序字節(jié)碼加載到JVM410之前任何對應(yīng)用程序字節(jié)碼的靜態(tài)攻擊。SLB D處理器620包括兩個(gè)主要的功能部件,兩個(gè)主要的功能部件包括安全的應(yīng)用程序加載和安全的類加載。安全的應(yīng)用程序加載包括受保護(hù)的應(yīng)用程序存根1404,應(yīng)用程序存根1404位于類路徑中且通常通過JVM進(jìn)行加載。加載之后,執(zhí)行主要的引導(dǎo)方法,然后經(jīng)由JNI SM橋 418通過下行調(diào)用的API來調(diào)用應(yīng)用程序引導(dǎo)方法。這觸發(fā)了 SLB動態(tài)安全處理器620的下列應(yīng)用程序的加載行為。首先,從受保護(hù)的數(shù)據(jù)文件夾中加載受保護(hù)的應(yīng)用程序有效載荷1408。這包括將加密的應(yīng)用程序字節(jié)碼工作幀1410從有效載荷1408中加載到存儲緩沖器,然后通過使用應(yīng)用程序的WB解密密鑰數(shù)據(jù)1304僅在存儲器中對加密的應(yīng)用程序字節(jié)碼工作幀1410進(jìn)行解密。接著,貫查解密的應(yīng)用程序字節(jié)碼工作幀1412,以通過使用特定的SM類加載器1414,將每個(gè)類字節(jié)碼和類存根從工作幀中加載到應(yīng)用程序的工作區(qū)域。SM類加載器1414使用安全模塊來加載加密的字節(jié)碼,并且解密字節(jié)碼以將字節(jié)碼加載到JVM 410中??梢园ㄆ渌陌踩詸z查,以將BIV保護(hù)添加到SM類加載器1414中,以及還可以包括在加載和運(yùn)行時(shí)對類加載器等級和完整性的檢查。最后,執(zhí)行工作區(qū)域中主要應(yīng)用程序類的主要方法。安全類加載包括觸發(fā)如圖15所示的類引導(dǎo)方法。通常,加密類字節(jié)碼幀可以在執(zhí)行受保護(hù)的應(yīng)用程序之前預(yù)先安裝或下載到設(shè)備上,或者在執(zhí)行受保護(hù)的應(yīng)用程序期間下載到設(shè)備上。這取決于應(yīng)用程序的功能屬性。當(dāng)在執(zhí)行受保護(hù)的應(yīng)用程序期間需要具有類存根的類時(shí),觸發(fā)類引導(dǎo)方法,通過JNI SM橋執(zhí)行下面的步驟1500,從而從加密的類字節(jié)碼幀中加載需要的類。首先,將相應(yīng)的加密類字節(jié)碼幀加載到存儲緩沖器中。接著,通過使用每個(gè)特定的類WB解密密鑰數(shù)據(jù)來解密僅在存儲器中的幀中所包括的每一個(gè)加密的類。 然后,通過使用SM類加載器,將解密的類字節(jié)碼加載到應(yīng)用程序的工作區(qū)域中。然后,在工作區(qū)域中繼續(xù)應(yīng)用程序的執(zhí)行。應(yīng)當(dāng)注意,與必須首先加載所有代碼的本機(jī)應(yīng)用程序的運(yùn)行不同,JVM實(shí)時(shí)地加載新類。只有當(dāng)需要新類時(shí)才加載類,這動態(tài)地?cái)U(kuò)展了應(yīng)用程序。此外,該Java特性為使用 SLB安全類加載以防發(fā)送攻擊的代碼提供了很好的機(jī)會。此外,在受保護(hù)的類被SLB可靠地加載和執(zhí)行后,本發(fā)明可以提供選項(xiàng)以通過將類恢復(fù)到其類存根來維持類在保護(hù)狀態(tài)。在這種方式中,僅在剛執(zhí)行時(shí),類的原始字節(jié)碼可從JVM映射中獲得,同時(shí)對于其它時(shí)間,受保護(hù)的類保持受保護(hù)形勢。通常,只有在運(yùn)行的Java程序調(diào)用加密方法時(shí),動態(tài)字節(jié)碼解密(Dynamic Bytecode Decryption, DBD)才包括對受保護(hù)的方法字節(jié)碼的解密。這確保所有的應(yīng)用程序的未加密字節(jié)碼不會同時(shí)常駐在存儲器中。圖16示出了 DBD靜態(tài)安全處理器530的創(chuàng)建時(shí)的工作流程。在創(chuàng)建時(shí),將每個(gè)不受保護(hù)的類字節(jié)碼文件1602都加載到內(nèi)部緩沖區(qū),以及使用保護(hù)標(biāo)記信息1306為將要由 DBD保護(hù)的類構(gòu)造新的類字節(jié)碼工作幀,其中標(biāo)記方法被方法存根所替換。這將調(diào)用下行調(diào)用方法,以在運(yùn)行時(shí)觸發(fā)DBD動態(tài)安全處理器530的調(diào)用。對于每個(gè)將被保護(hù)的Java方法,通過使用方法的WB加密密鑰和將該加密方法存儲到加密方法字節(jié)碼幀1606中,來加密每個(gè)將被保護(hù)的Java方法的字節(jié)碼,該加密方法字節(jié)碼幀1606 與WB解密密鑰數(shù)據(jù)1608 —同封裝,以作為保護(hù)的字節(jié)碼數(shù)據(jù)的一部分進(jìn)行分配。用于分配的受保護(hù)的類字節(jié)碼工作幀1610替代原始字節(jié)碼類。圖18示出DBD動態(tài)安全處理器622的執(zhí)行時(shí)的工作流程。當(dāng)在JVM上執(zhí)行保護(hù)的Java應(yīng)用程序時(shí),調(diào)用加密的DBD Java方法,首先執(zhí)行方法存根,然后在DBD動態(tài)安全處理器622中調(diào)用下行調(diào)用(方法引導(dǎo)180 。DBD動態(tài)安全處理器622通過使用WB方法解密密鑰數(shù)據(jù)來從加密方法的字節(jié)碼幀1804中識別和解密加密方法,并且將其實(shí)際的字節(jié)碼還原到JVM中。將類字節(jié)碼還原到JVM可以包括將類的拷貝還原到JVM中,同時(shí)對類進(jìn)行重新命名以免在JVM的命名空間中出現(xiàn)命名沖突。圖17中示出了其實(shí)施例,其中將部分解密的類以一個(gè)新的類名加載到JVM中。在圖18中,如果需要時(shí),一旦原始字節(jié)碼被還原到JVM中,則DBD動態(tài)安全處理器622就可以將該類的狀態(tài)拷貝到實(shí)際的字節(jié)碼實(shí)體中,這個(gè)選項(xiàng)在創(chuàng)建時(shí)被確定。然后, DBD動態(tài)安全處理器622調(diào)用JVM 410中未加密的方法。只要完成方法的調(diào)用,安全處理器622就將實(shí)際狀態(tài)從未加密類實(shí)體還原到加密的實(shí)體,并且控制返回到初始的下行調(diào)用方法。圖17示出在調(diào)用未加密方法之前的樣本方法調(diào)用和狀態(tài)拷貝操作1700。只要未加密的方法被完全執(zhí)行,則通過DBD動態(tài)安全處理器622以受保護(hù)的方法存根將狀態(tài)拷貝回類實(shí)體??刂票环祷厥鼙Wo(hù)的方法,同時(shí)安全處理器從JVM 410中移除未加密的類和實(shí)體。
本發(fā)明的上述實(shí)施方式僅是示例性的。在不背離僅由本發(fā)明的權(quán)利要求書所限定的本發(fā)明范圍的情況下,本領(lǐng)域技術(shù)人員可以對具體實(shí)施方式
進(jìn)行替換、修改和改變。
權(quán)利要求
1.用于提高Java字節(jié)碼防竄改能力的裝置,包括保護(hù)工具,用于在創(chuàng)建時(shí)將安全措施應(yīng)用于Java字節(jié)碼;安全模塊,從所述保護(hù)工具中接收安全的Java字節(jié)碼,并且在運(yùn)行時(shí)啟動所述安全的 Java字節(jié)碼;以及一個(gè)或多個(gè)保護(hù)機(jī)制,與所述保護(hù)工具和所述安全模塊集成在一起;其中,運(yùn)行所述一個(gè)或多個(gè)保護(hù)機(jī)制來對抗對所述Java字節(jié)碼的靜態(tài)和動態(tài)攻擊。
2.如權(quán)利要求1所述的裝置,其中,所述安全的Java字節(jié)碼包括受保護(hù)的Java應(yīng)用程序字節(jié)碼存根、受保護(hù)的應(yīng)用程序有效載荷和加密的類字節(jié)碼幀,其中每個(gè)都在創(chuàng)建時(shí)由所述保護(hù)工具形成。
3.如權(quán)利要求2所述的裝置,其中,所述安全模塊被獨(dú)立分配為Java虛擬機(jī)環(huán)境的功能擴(kuò)展,以提供受保護(hù)的Java應(yīng)用程序的可信任根源,并且所述安全的Java字節(jié)碼根據(jù)用戶需要被獨(dú)立分配。
4.如權(quán)利要求3所述的裝置,其中,所述保護(hù)工具包括命令通過所述受保護(hù)的Java應(yīng)用程序字節(jié)碼存根啟動所述受保護(hù)的應(yīng)用程序有效載荷的機(jī)制。
5.如權(quán)利要求3所述的裝置,其中,所述安全模塊包括受保護(hù)的字節(jié)碼類加載器,所述保護(hù)工具包括命令使用所述受保護(hù)的字節(jié)碼類加載器通過所述加密的類字節(jié)碼幀啟動所述受保護(hù)的應(yīng)用程序有效載荷的機(jī)制。
6.如權(quán)利要求1所述的裝置,其中,所述裝置由包括C、C++和Java語言中的一種或多種編程語言實(shí)現(xiàn)的編程引擎形成。
7.如權(quán)利要求1所述的裝置,其中,所述裝置由能夠與Java虛擬機(jī)接合的編程語言實(shí)現(xiàn)的編程引擎形成。
8.如權(quán)利要求1所述的裝置,其中,能夠根據(jù)配置選項(xiàng)選擇所述一個(gè)或多個(gè)保護(hù)機(jī)制。
9.如權(quán)利要求8所述的裝置,其中,所述一個(gè)或多個(gè)保護(hù)機(jī)制包括靜態(tài)安全處理器和動態(tài)安全處理器,所述靜態(tài)安全處理器形成在所述保護(hù)工具中,所述動態(tài)安全處理器與所述安全模塊一起形成。
10.如權(quán)利要求9所述的裝置,其中,所述靜態(tài)安全處理器包括白盒(WB)靜態(tài)安全處理器,所述白盒靜態(tài)安全處理器用于從用戶處接收包括密鑰的密碼信息,以生成由一個(gè)或多個(gè)其它的所述靜態(tài)安全處理器使用的WB加密密鑰數(shù)據(jù),以及在所述安全模塊的動態(tài)運(yùn)行時(shí)保護(hù)期間由一個(gè)或多個(gè)所述動態(tài)安全處理器所使用的 WB解密密鑰數(shù)據(jù)和WB安全模塊實(shí)用工具。
11.如權(quán)利要求10所述的裝置,其中,所述靜態(tài)安全處理器包括字節(jié)碼完整性校驗(yàn) (BIV)靜態(tài)安全處理器,所述字節(jié)碼完整性校驗(yàn)靜態(tài)安全處理器響應(yīng)于保護(hù)標(biāo)記信息將散列碼保護(hù)應(yīng)用于所述安全的Java字節(jié)碼,所述動態(tài)安全處理器包括BIV動態(tài)安全處理器, 所述BIV動態(tài)安全處理器在運(yùn)行時(shí)驗(yàn)證所述散列碼保護(hù),其中,當(dāng)驗(yàn)證失敗時(shí),所述安全模塊調(diào)用防竄改對策。
12.如權(quán)利要求10所述的裝置,其中,所述靜態(tài)安全處理器包括安全加載字節(jié)碼(SLB)靜態(tài)安全處理器,用于在創(chuàng)建時(shí)形成受保護(hù)的Java應(yīng)用程序字節(jié)碼存根、受保護(hù)的應(yīng)用程序有效載荷和加密的類字節(jié)碼幀;以及所述動態(tài)安全處理器包括SLB動態(tài)安全處理器,所述SLB動態(tài)安全處理器用于將與所述安全的Java應(yīng)用程序字節(jié)碼相對應(yīng)的所述加密的類字節(jié)碼幀加載到緩沖存儲器,通過與所述加密的類相對應(yīng)的所述WB解密密鑰數(shù)據(jù)對所述加密的類字節(jié)碼中所包括的每個(gè)加密的類進(jìn)行解密,通過安全模塊類加載器將每個(gè)解密的類字節(jié)碼加載到應(yīng)用程序的工作區(qū)域中,從而在所述應(yīng)用程序的工作區(qū)域中執(zhí)行所述Java應(yīng)用程序。
全文摘要
本發(fā)明提供了一種方法和系統(tǒng),可以解決Java平臺的弱點(diǎn)和在執(zhí)行時(shí)保護(hù)Java字節(jié)碼。作為一個(gè)例子,以C/C++語言來實(shí)現(xiàn)該安全模塊。因?yàn)樵搫?chuàng)新的安全模塊以C/C++語言實(shí)現(xiàn),所以可以使用使C/C++軟件代碼安全的安全技術(shù)。
文檔編號G06F9/455GK102598017SQ201080048082
公開日2012年7月18日 申請日期2010年11月12日 優(yōu)先權(quán)日2009年11月13日
發(fā)明者嘎尼·亞當(dāng)斯, 杰克·容, 顧元祥 申請人:埃德圖加拿大公司