一種JAVA卡字節碼引用訪問測試方法與流程
2023-06-04 18:45:46 3

本發明涉及智慧卡技術領域,尤其涉及一種JAVA卡字節碼引用訪問測試方法。
背景技術:
Java卡技術因其開放性使得java卡在金融卡、電信卡的市場上被廣泛使用。但是其開放性帶來的安全問題,也逐漸被人關注。一些後下載應用會構造虛假引用來非法讀取卡上存儲內容,對這一安全威脅的防範能力成為java卡平臺的關鍵質量指標之一。
由於java卡應用通過字節碼在java卡平臺上執行相應的操作,因此需要測試字節碼訪問引用的功能是否正確。對於不存在或受限的引用,應不予訪問並拋出異常。
目前對字節碼的引用訪問測試僅限於applet能構造出來的對象引用,比如測試應用內的全局變量和局部變量,共享接口傳遞的其它上下文中的數組引用。常規Java Card Applet無法構造虛假引用,也就無法測試字節碼訪問虛假引用的情況。
技術實現要素:
針對上述技術缺陷,本發明提出一種JAVA卡字節碼引用訪問測試方法。
為了解決上述技術問題,本發明的技術方案如下:
一種JAVA卡字節碼引用訪問測試方法,包括如下步驟:
1)構建java語言編寫的測試用源程序;
2)在所述java源程序的基礎上,添加一個帶有short類型入參的測試方法,通過編譯、轉換得到CAP文件;
3)在所述CAP文件中的測試方法中,找到待測試字節碼的位置,然後向前,定位到將其訪問的引用壓棧的字節碼;
4)將所述壓棧字節碼替換為「XX」;所述「XX」為將測試方法short類型參數值壓棧的字節碼。
進一步的,所述的測試用源程序,其特徵在於,創建並初始化一個對象或數組類型的全局變量,用於一次性建立一個引用,代替在測試方法中建立數組。避免在測試過程中,反覆調用測試方法,反覆建立數組,消耗E方空間,影響測試流程。
進一步的,在所述java源程序的基礎上,添加的一個帶有short類型入參的測試方法,該測試方法包括且僅包括以下內容:
帶有一個short類型的參數。。
創建一個對象或數組類型的局部變量,將其值初始化為所述的一個對象或數組類型的全局變量。
編寫一個語句,該語句調用待測試字節碼,並使其訪問所述的一個對象或數組類型的局部變量。
進一步的,所述的「XX」,其特徵在於,是將測試方法short類型參數值壓棧的字節碼,替換前的字節碼作用是將一個引用壓入到棧中,該引用指向的對象是實際存在的。替換後的字節碼作用是將一個short數值壓入到棧中,待測試字節碼從棧中取得這個數據,仍將它作為引用來進行訪問。因此替換字節碼動作實現了構造虛假引用的目的。
進一步的,所述的一個對象或數組類型的全局變量,其特徵在於,其類型與待測試字節碼要訪問的對象類型一致,即如果字節碼要訪問byte類型數組,則全局變量定義為一個byte類型數組,如果字節碼要訪問一個對象,則全局變量定義為同一個類的對象。
進一步的,所述的帶有一個short類型的參數,其特徵在於,該參數值會從卡外,通過APDU命令傳入到所述CAP文件在卡上安裝的測試應用,通過測試應用傳入到所述測試方法,通過測試方法傳入到棧中字節碼要讀取引用的位置。測試人員在卡外設置該short類型參數的值,決定測試字節碼要訪問的引種值。從而達到測試字節碼引用訪問功能的目的。
進一步的,所述的一個對象或數組類型的局部變量,其特徵在於,其類型與所述一個對象或數組類型的全局變量的類型一致。
進一步的,所述的一個對象或數組類型的局部變量,其特徵在於,使用局部變量作為字節碼訪問的初始引用,可以簡化測試流程,並使得測試流程可控,如果使用全局變量作為字節碼訪問的初始引用,則將全局變量引用壓棧的字節碼可能在cap下載時被修改操作數,使得下載到卡上的應用不能做期望的操作,達不到測試目的。
本發明的有益效果在於:本發明在字節碼層面對JavaCard CAP文件進行修改,生成的特殊Java Card Applet可用於構造虛假引用,並將其提交給字節碼進行測試,解決了常規Java Card Applet無法構造虛假引用,也就無法測試字節碼訪問虛假引用的情況的問題。
附圖說明
圖1是用於baload字節碼測試的java源程序基本結構圖;
圖2是引用壓棧字節碼在cap文件中的定位;
圖3是用於baload字節碼測試的流程;
具體實施方式
下面將結合附圖和具體實施例對本發明做進一步的說明。
圖1指出了一個以baload為測試對象的基礎的java源程序baload.java的基本結構,baload是一個繼承於Applet的JavaCard小應用程式子類。全局變量baa為byte數組,其類型與baload要訪問的引用類型一致。方法process負責處理APDU命令,當收到的命令類型為0x00時,調用方法M1(ad),ad為命令的兩個字節數據域中的值,process同時捕獲異常,期望平臺拋出安全異常。方法M1(ad)執行字節碼訪問引用ad的測試,其中局部變量ba為byte數組,其類型與全局變量baa一致,並被初始化為baa。該程序經過編譯、轉換後生成一個名為baload.cap的文件。
圖2示意了baload.java的方法M1代碼在cap文件中的形式。一個Java Card CAP文件是一個java源程序經過編譯、轉換而成的二進位流文件,內容為java源程序中java語句對應的JCVM字節碼。首先找到baload,在P:0005,然後向前,找到將baload要讀取的引用壓棧的字節碼,為aload_2,在P:0003。將aload_2修改為「1D」,「1D」在java卡指令集中對應「sload_1」,將參數ad的值壓入棧中,代替了ba的引用。
圖3示意了利用baload.cap對baload進行測試的流程。首先下載baload.cap到卡上,安裝應用創建應用實例,初始化一個short變量SV為0x0000。然後循環的選擇測試應用並發送測試命令,測試命令攜帶SV為數據域,每循環一次SV加1,直到0xFFFF終止循環。測試命令發送完畢後,如果值為SV的引用允許baload在當前上下文中訪問,則期望測試命令返回0x9000;否則期望測試應用能捕獲到安全異常,或者平臺關閉與卡外會話。如果不是以上的情況,則退出測試並報告測試失敗。
顯然,本領域的技術人員可以對本發明進行各種改動和變形而不脫離本發明的精神和範圍。這樣,倘若本發明的這些修改和變形屬於本發明權利要求及其等同技術的範圍之內,則本發明也意圖包含這些改動和變型在內。