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