文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.179014
中文引用格式: 崔炳榮,劉亮,甘杰,等. Java卡虛擬機(jī)的安全攻擊技術(shù)及防御技術(shù)研究[J].電子技術(shù)應(yīng)用,2017,43(10):12-15,19.
英文引用格式: Cui Bingrong,Liu Liang,Gan Jie,et al. The offensive and defensive technology of the Java card virtual machine[J].Application of Electronic Technique,2017,43(10):12-15,19.
0 引言
金融、移動(dòng)通信、身份認(rèn)證等領(lǐng)域?qū)?a class="innerlink" href="http://theprogrammingfactory.com/tags/Java卡" title="Java卡" target="_blank">Java卡多應(yīng)用軟件平臺(tái)的需求在近幾年變得日益迫切,多應(yīng)用軟件平臺(tái)支持產(chǎn)品發(fā)行后還可以后下載應(yīng)用,所以Java卡技術(shù)在給使用者帶來(lái)開(kāi)放式便利性的同時(shí),也帶來(lái)了極大的安全風(fēng)險(xiǎn)。針對(duì)智能卡嵌入式軟件安全技術(shù)的研究,已經(jīng)成為智能卡行業(yè)近兩年的熱點(diǎn)。北京智芯微電子科技有限公司的Java卡團(tuán)隊(duì)在Java卡軟件平臺(tái)的安全攻擊及防御方面做了很多工作,本文主要介紹其基于Java卡虛擬機(jī)的安全攻擊及防御技術(shù)方面的研究成果。
1 Java卡軟件平臺(tái)簡(jiǎn)介
Java卡軟件平臺(tái)是智能卡嵌入式軟件的發(fā)展趨勢(shì)。目前金融卡及部分其他行業(yè)卡片都已經(jīng)要求是平臺(tái)卡,電信行業(yè)先前已有成熟的Java平臺(tái)卡發(fā)行?;谝苿?dòng)支付的卡片已經(jīng)明確規(guī)定是多應(yīng)用的平臺(tái)卡,而Java平臺(tái)卡是智能卡平臺(tái)卡的絕對(duì)主流。
Java卡系統(tǒng)架構(gòu)如圖1所示。
Java卡產(chǎn)品應(yīng)用于金融以及移動(dòng)支付領(lǐng)域,其安全性是不容忽視的,需要很高的安全保障才可以進(jìn)入市場(chǎng)。如圖2所示,Java卡平臺(tái)需要達(dá)到31分以上才可獲得EMVco的平臺(tái)安全證書(shū)(參考Brightsight機(jī)構(gòu)的數(shù)據(jù))。
Java卡虛擬機(jī)是Java卡軟件平臺(tái)的引擎,在整個(gè)平臺(tái)中起著核心的作用,其實(shí)現(xiàn)了一個(gè)軟CPU,用于解釋執(zhí)行Java卡代碼(包括Java卡平臺(tái)的系統(tǒng)代碼以及Java卡應(yīng)用代碼),它維護(hù)下面一些主要的系統(tǒng)資源:
(1)PC:程序地址指針;
(2)棧:用于維護(hù)Java卡應(yīng)用執(zhí)行時(shí)的方法調(diào)用現(xiàn)場(chǎng);
(3)寄存器:用于維護(hù)棧幀結(jié)構(gòu)的寄存器變量;
(4)字節(jié)碼解釋器:解析應(yīng)用代碼編譯出的目標(biāo)字節(jié)碼。
通過(guò)攻擊以上資源,攻擊者可以破壞Java卡虛擬機(jī),獲取到一些卡片敏感數(shù)據(jù),甚至可以控制代碼流程非法跳轉(zhuǎn)到攻擊者的惡意代碼進(jìn)行執(zhí)行。
2 Java卡虛擬機(jī)的安全攻擊研究
2.1 針對(duì)虛擬機(jī)的攻擊技術(shù)研究
Java卡軟件平臺(tái)是否安全,其重點(diǎn)在于:
(1)黑客是不是能隨意安裝應(yīng)用程序;
(2)虛擬機(jī)如何抵御惡意代碼;
(3)如何抵御旁路攻擊;
(4)如何抵御程序執(zhí)行流程和數(shù)據(jù)被惡意干擾;
(5)平臺(tái)是否遵守硬件的安全要求。
對(duì)于以上第(1)種攻擊可以通過(guò)GP(GlobalPlatform)技術(shù)中的安全通道等方式進(jìn)行防御;對(duì)于第(5)種,軟件平臺(tái)會(huì)依賴(lài)芯片平臺(tái)的安全保障。而對(duì)于其余的(2)、(3)、(4)種,Java卡虛擬機(jī)本身需要具備很強(qiáng)的防攻擊能力,承擔(dān)重要的安全防御角色。
研究發(fā)現(xiàn),針對(duì)Java卡軟件平臺(tái)較為有效的攻擊方式有以下幾種。
(1)混淆數(shù)據(jù)類(lèi)型攻擊
Java卡支持byte、short、int和 reference(對(duì)象)數(shù)據(jù),這些數(shù)據(jù)在卡片上的物理存儲(chǔ)方式一致。攻擊者可以使用不同類(lèi)型數(shù)組對(duì)象之間的混淆訪(fǎng)問(wèn)、簡(jiǎn)單對(duì)象和數(shù)組對(duì)象之間的混淆訪(fǎng)問(wèn)、基本類(lèi)型數(shù)據(jù)和對(duì)象數(shù)據(jù)之間的混淆訪(fǎng)問(wèn)、偽造對(duì)象、對(duì)象域作為數(shù)組成員等方式進(jìn)行攻擊。其目的在于迷惑虛擬機(jī)讀取越界數(shù)據(jù)給卡外,從而造成嚴(yán)重的信息泄露。
(2)操作數(shù)棧攻擊
在Java卡中棧是方法運(yùn)行的基礎(chǔ),棧中保存了調(diào)用方法的現(xiàn)場(chǎng)信息,也為被調(diào)用方法提供了運(yùn)行時(shí)的操作空間。對(duì)當(dāng)前方法操作數(shù)棧進(jìn)行攻擊(比如通過(guò)持續(xù)壓?;蚱渌绞酵黄茥吔?,進(jìn)而改變方法棧邊界外的數(shù)據(jù)就能破壞掉整個(gè)系統(tǒng)的有序運(yùn)行狀態(tài),攻擊者可以通過(guò)這種方式修改PC指針,使程序跳轉(zhuǎn)到惡意代碼地址進(jìn)行執(zhí)行,也可以改變方法對(duì)??臻g資源的占用情況導(dǎo)致其他不可預(yù)期的錯(cuò)誤。攻擊者通過(guò)上述方法能有效提升非法獲取信息的可能性。
(3)局部變量攻擊
局部變量存在于方法棧中,針對(duì)局部變量的攻擊手段有許多種,產(chǎn)生的效果也不盡相同。比如可以對(duì)cap文件中對(duì)應(yīng)方法的局部變量大小信息進(jìn)行修改,達(dá)到突破局部變量邊界,造成數(shù)據(jù)和代碼混亂的目的;也可以針對(duì)局部變量的讀寫(xiě)進(jìn)行非法操作(比如將short數(shù)據(jù)當(dāng)作對(duì)象數(shù)據(jù)讀取使用),以達(dá)到非法數(shù)據(jù)訪(fǎng)問(wèn)的目的。
(4)字節(jié)碼篡改攻擊
字節(jié)碼執(zhí)行流程如圖3所示。
通過(guò)激光攻擊等手段更改數(shù)據(jù)總線(xiàn)上讀出的字節(jié)碼,按照?qǐng)D3所示使得虛擬機(jī)跳轉(zhuǎn)到錯(cuò)誤字節(jié)碼解釋執(zhí)行,導(dǎo)致不可預(yù)知的后果。
借助標(biāo)準(zhǔn)的JCDK工具,手動(dòng)修改字節(jié)碼也可以達(dá)到激光攻擊同樣的效果。人工修改的方式可以控制攻擊的預(yù)期效果,比激光攻擊更加有效和可控,危害性更高。
2.2 虛擬機(jī)的攻擊方式
目前主流的攻擊方式為準(zhǔn)備一個(gè)CAP,采用以下方式:(1)數(shù)據(jù)類(lèi)型混淆;(2)破壞虛擬機(jī)棧幀結(jié)構(gòu);(3)破壞虛擬機(jī)解釋執(zhí)行流程。
對(duì)CAP進(jìn)行篡改,以自定義方法或者Java Card平臺(tái)標(biāo)準(zhǔn)API方法為切入點(diǎn),對(duì)卡片進(jìn)行安全攻擊。另外還可以采用激光篡改卡片內(nèi)部數(shù)據(jù)的攻擊方式。
2.2.1 混合攻擊示例
首先編寫(xiě)源文件,然后對(duì)源文件目標(biāo)文件即CAP文件里的字節(jié)碼進(jìn)行惡意修改,將其修改為CAP’,然后下載到Java卡軟件平臺(tái)上執(zhí)行,從而達(dá)到攻擊目的。
源文件如下:
Public void process(APDU apdu) {
if (selectingApplet()) {
return;
}
byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS]) {
case (byte) 0x00:
M1(buf);
apdu.setOutgoingAndSend((short) 0, (short) 2);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
Public void M1(byte[] buf) {
byte[] ba = newbyte[2];
shorti = 258;
Util.setShort(buf, (short) 0, i);
}
2.2.2 修改CAP文件
通過(guò)修改源文件編譯出來(lái)的CAP文件,即修改method組件中M1方法的method_head_info值,由0x0322修改為其他兩字節(jié)的任意數(shù)值(通常會(huì)從0x0000遍歷到0xFFFF),然后重新生成新的攻擊CAP′文件,下載到Java卡軟件平臺(tái)上選擇并執(zhí)行。CAP文件中方法信息存在于方法組件中,方法組件信息如圖4所示。
圖4中出現(xiàn)的字段信息如下:
(1)tag:虛擬機(jī)規(guī)范中定義的方法組件的標(biāo)識(shí),值為7
(2)size:方法組件數(shù)據(jù)長(zhǎng)度
(3)handler_count:異常個(gè)數(shù)
(4)exception_handler_info:異常信息
(5)method_info:所有的方法信息標(biāo)識(shí)
(6)methods[n]:第n個(gè)方法的信息
(7)method_header_info:方法頭信息標(biāo)識(shí)
(8)Data:方法頭信息的數(shù)據(jù)
(9)flags:標(biāo)志位信息
(10)max_stack:方法最大棧使用量
(11)nargs:參數(shù)個(gè)數(shù)
(12)max_locals:局部變量個(gè)數(shù)
(13)bytecodes:方法內(nèi)容對(duì)應(yīng)的字節(jié)碼
2.2.3 測(cè)試結(jié)果
圖4中method_header_info前兩個(gè)字代表了方法的操作數(shù)棧的大小、參數(shù)的個(gè)數(shù)和局部變量的個(gè)數(shù)。篡改此數(shù)據(jù)使其從0000-ffff遍歷,期望卡返回?cái)?shù)據(jù)為0x0102,或者拋出異常。安全的Java卡軟件平臺(tái)不會(huì)返回其他任何數(shù)據(jù)。如果虛擬機(jī)不夠安全,執(zhí)行過(guò)程中可能會(huì)拋出各種數(shù)據(jù)。
3 Java卡虛擬機(jī)的安全防御技術(shù)研究及實(shí)現(xiàn)
根據(jù)上面章節(jié)的分析明確了Java卡虛擬機(jī)內(nèi)核被攻擊的重點(diǎn)所在。接著從以下幾個(gè)方面來(lái)闡述如何對(duì)Java卡虛擬機(jī)進(jìn)行安全防護(hù)。
3.1 棧幀保護(hù)
(1)操作數(shù)棧完整性檢查
在方法調(diào)用時(shí)記錄操作數(shù)棧基于棧底的偏移位置,作為現(xiàn)場(chǎng)信息的一部分記錄在幀頭中,在方法返回時(shí)從幀頭信息中讀取出來(lái)并和SP(棧當(dāng)前位置指針)進(jìn)行比對(duì),兩值應(yīng)該相等。如果不等,說(shuō)明棧幀的出入數(shù)據(jù)不對(duì)應(yīng),表明是操作數(shù)棧受到了惡意攻擊。
(2)操作數(shù)棧邊界檢查
在進(jìn)行操作數(shù)的出入棧操作時(shí),檢查其訪(fǎng)問(wèn)到的地址邊界是否超出操作數(shù)棧的邊界,超出則表示異常發(fā)生。
(3)參數(shù)和局部變量邊界檢查
在方法執(zhí)行過(guò)程中對(duì)于參數(shù)和局部變量的訪(fǎng)問(wèn)應(yīng)該符合方法頭中對(duì)于其個(gè)數(shù)的限定,并保障其地址范圍在此方法棧的起始位置和操作數(shù)棧之間(不同的棧結(jié)構(gòu)設(shè)計(jì)可能有不同的限制條件)。
(4)方法棧的參數(shù)準(zhǔn)確性檢查
方法的最大棧使用情況和局部變量數(shù)據(jù)都是方法運(yùn)行時(shí)數(shù)據(jù),對(duì)于這兩個(gè)值的修改不會(huì)影響方法的正常執(zhí)行。但是參數(shù)是先于方法執(zhí)行被壓入棧中的,如果方法頭中參數(shù)個(gè)數(shù)被修改,方法運(yùn)行過(guò)程中的安全機(jī)制會(huì)進(jìn)行相關(guān)防護(hù)。比如參數(shù)個(gè)數(shù)被改小,那么正常的參數(shù)訪(fǎng)問(wèn)就可能被參數(shù)邊界檢查判錯(cuò);如果參數(shù)改大,會(huì)導(dǎo)致方法出棧時(shí)上一個(gè)方法的執(zhí)行環(huán)境被修改從而產(chǎn)生連鎖的防御反應(yīng)。
以上所有防護(hù)在產(chǎn)生問(wèn)題的時(shí)候軟件平臺(tái)都會(huì)認(rèn)為受到了惡意攻擊,應(yīng)該報(bào)錯(cuò)并采取進(jìn)一步的防御措施,如安全審計(jì)、卡片靜默等。
3.2 字節(jié)碼保護(hù)
3.2.1 運(yùn)行時(shí)類(lèi)型檢查
(1)byte/short/int/reference類(lèi)型數(shù)組檢查
規(guī)范中定義的數(shù)組類(lèi)型分別為byte數(shù)組、short數(shù)組、int數(shù)組和reference型數(shù)組,數(shù)組對(duì)象在字節(jié)碼層面的訪(fǎng)問(wèn)入口為讀指令BALOAD、SALOAD、IALOAD、AALOAD和寫(xiě)指令BASTORE、SASTORE、IASTORE、AASTORE。軟件平臺(tái)通過(guò)對(duì)象數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)可以記錄當(dāng)前數(shù)組對(duì)象的具體類(lèi)型,進(jìn)而在字節(jié)碼指令訪(fǎng)問(wèn)時(shí)進(jìn)行對(duì)應(yīng)性檢查來(lái)屏蔽掉不合法的數(shù)組對(duì)象訪(fǎng)問(wèn)。
(2)簡(jiǎn)單對(duì)象/數(shù)組對(duì)象混淆檢查
與數(shù)組類(lèi)型檢查類(lèi)似,簡(jiǎn)單對(duì)象和數(shù)組對(duì)象也可以通過(guò)對(duì)象數(shù)據(jù)結(jié)構(gòu)中的相應(yīng)標(biāo)識(shí)來(lái)進(jìn)行區(qū)分。在訪(fǎng)問(wèn)簡(jiǎn)單對(duì)象的字節(jié)碼指令中應(yīng)該進(jìn)行判斷保證此對(duì)象非數(shù)組對(duì)象,反之亦然。
(3)對(duì)象/基本數(shù)據(jù)類(lèi)型(byte/short/int)混淆檢查
對(duì)于這種混淆檢查需要設(shè)計(jì)一種新的防護(hù)方式:添加一個(gè)類(lèi)型棧。此棧記錄操作數(shù)棧中數(shù)據(jù)的類(lèi)型。執(zhí)行字節(jié)碼指令時(shí)按照此指令對(duì)操作數(shù)類(lèi)型的要求,結(jié)合類(lèi)型棧的記錄進(jìn)行一致性判斷。這樣就保證了棧數(shù)據(jù)訪(fǎng)問(wèn)的一致性。
3.2.2 對(duì)象/數(shù)組/靜態(tài)域邏輯邊界檢查
Java卡虛擬機(jī)在訪(fǎng)問(wèn)數(shù)組時(shí)需要做數(shù)組邊界的運(yùn)行時(shí)檢查;對(duì)象管理數(shù)據(jù)結(jié)構(gòu)中應(yīng)記錄相應(yīng)的size(針對(duì)域和方法),防止攻擊者訪(fǎng)問(wèn)到非法空間;靜態(tài)域的讀寫(xiě)訪(fǎng)問(wèn)時(shí)檢查當(dāng)前訪(fǎng)問(wèn)的包的靜態(tài)域邊界。
3.2.3 防篡改檢查
為了防止錯(cuò)誤注入攻擊,可適當(dāng)添加關(guān)鍵數(shù)據(jù)的冗余校驗(yàn)機(jī)制,保證程序運(yùn)行流程不受攻擊干擾。
以上所有檢查在發(fā)現(xiàn)錯(cuò)誤時(shí)都表示系統(tǒng)異常,應(yīng)采取相應(yīng)的安全措施。
3.3 特殊數(shù)據(jù)保護(hù)
在Java Card規(guī)范中定義了全局對(duì)象和入口點(diǎn)對(duì)象,這些對(duì)象的訪(fǎng)問(wèn)不受防火墻控制,同時(shí)也沒(méi)有外部接口供應(yīng)用創(chuàng)建。Java Card平臺(tái)自身不受限制,可以使用私有方式創(chuàng)建一些全局對(duì)象或者入口點(diǎn)對(duì)象來(lái)承載特殊的使命(如內(nèi)部的快速訪(fǎng)問(wèn)等)。為了保證這些數(shù)據(jù)不被非法訪(fǎng)問(wèn),需要添加對(duì)應(yīng)的防護(hù)手段。APDU數(shù)組作為全局對(duì)象不僅負(fù)責(zé)命令數(shù)據(jù)的傳輸,在標(biāo)準(zhǔn)外部接口中還被當(dāng)做返回?cái)?shù)據(jù)緩沖區(qū)使用,這些數(shù)據(jù)具有一定的敏感性以防止被非法竊取,需要在使用后及時(shí)清理。
3.4 執(zhí)行流程保護(hù)
針對(duì)此攻擊可以采取在下載器中進(jìn)行方法跳轉(zhuǎn)指令的越界判斷,如果有越界情況發(fā)生,則不允許外部下載。另外為了防止執(zhí)行時(shí)的字節(jié)碼流程跑飛,也可以在下載時(shí)記錄方法邊界,在字節(jié)碼執(zhí)行時(shí)進(jìn)行越界判斷。此實(shí)現(xiàn)機(jī)制稍微復(fù)雜一些,會(huì)增加下載器的處理復(fù)雜度以及影響執(zhí)行時(shí)的性能。
3.5 虛擬機(jī)系統(tǒng)關(guān)鍵數(shù)據(jù)的保護(hù)
虛擬機(jī)中的關(guān)鍵系統(tǒng)變量可以進(jìn)行備份處理,在相應(yīng)的流程節(jié)點(diǎn)上進(jìn)行比對(duì),這樣可以防止關(guān)鍵數(shù)據(jù)被惡意篡改;也可以結(jié)合有安全功能的Java芯片提供的保護(hù)機(jī)制,進(jìn)行軟硬件的聯(lián)合防護(hù),以達(dá)到關(guān)鍵系統(tǒng)變量不能被惡意代碼隨意更改的目的。
4 測(cè)試結(jié)果及結(jié)論
北京智芯微電子科技有限公司針對(duì)Java卡虛擬機(jī)安全攻擊的研究成果,設(shè)計(jì)開(kāi)發(fā)了具有自主知識(shí)產(chǎn)權(quán)的安全攻擊用例庫(kù),包含如下幾個(gè)方面:API攻擊、邊界攻擊、執(zhí)行流程攻擊、局部變量攻擊、操作數(shù)棧攻擊、參數(shù)攻擊、共享接口攻擊、特殊數(shù)據(jù)訪(fǎng)問(wèn)攻擊、事務(wù)機(jī)制攻擊、類(lèi)型混淆攻擊和防火墻攻擊。腳本示意如圖5所示。
北京智芯微電子科技有限公司自研的Java卡軟件平臺(tái)通過(guò)了自研安全攻擊平臺(tái)的攻擊測(cè)試。此外通過(guò)了金融卡檢測(cè)中心(BCTC)的安全攻擊測(cè)試。金融卡檢測(cè)中心的嵌入式軟件安全攻擊測(cè)試被公認(rèn)是目前國(guó)內(nèi)攻擊水平最高的第三方測(cè)試。事實(shí)證明,北京智芯微電子科技有限公司的安全攻擊技術(shù)及防御技術(shù)研究是卓有成效的。
安全領(lǐng)域的攻與防是個(gè)永恒的話(huà)題,北京智芯微電子科技有限公司以后還會(huì)沿著這條路繼續(xù)前進(jìn),加強(qiáng)自研能力,跟進(jìn)國(guó)際最新的攻擊技術(shù)和防御技術(shù),持續(xù)提升安全技術(shù)水平。
參考文獻(xiàn)
[1] 鄧赟,周道雙,李宇.基于智能卡的COS安全設(shè)計(jì)與實(shí)現(xiàn)[J].通信技術(shù),2016(3):352-355.
[2] 徐江珮,烏力吉,楊向軍,等.Java卡COS安全漏洞的一種探測(cè)與分析方法[J].微電子學(xué)與計(jì)算機(jī),2014(12):71-74.
[3] 李奕.智能卡的安全體系研究[J].電子技術(shù),2015(5):19-22.
[4] Guillaume Bouffard,Julien Iguchi-Cartigny,Jean-Louis Lanet.Combined software and hardware attacks on the Java Card control flow[C].10th IFIP WG 8.8/11.2 International Conference,CARDIS,2011.
[5} 于暉.基于混合攻擊的Java卡3.0安全性研究[J].信息安全與通信保密,2014(9):125-128.
[6] 蔣龍龍.JCVM相關(guān)安全性分析與優(yōu)化[D].廣州:廣東工業(yè)大學(xué),2014.
[7] 孫立元.基于漏洞攻擊的Java卡安全性分析[J].計(jì)算機(jī)光盤(pán)軟件與應(yīng)用,2013(5):212-214.
作者信息:
崔炳榮1,2,劉 亮1,2,甘 杰1,2,張海峰1,陳 雷1,2,尹國(guó)龍3
(1.北京智芯微電子科技有限公司,國(guó)家電網(wǎng)公司重點(diǎn)實(shí)驗(yàn)室電力芯片設(shè)計(jì)分析實(shí)驗(yàn)室,北京100192;
2.北京智芯微電子科技有限公司,北京市電力高可靠性集成電路設(shè)計(jì)工程技術(shù)研究中心,北京100192;
3.國(guó)網(wǎng)寧夏電力公司電力科學(xué)研究院,寧夏 銀川750002)