本發(fā)明涉及Java卡技術(shù)領(lǐng)域,尤其涉及一種Java卡防攻擊方法、裝置。
背景技術(shù):
Java卡對(duì)象訪問通常通過幾條匯編指令來完成,如讀取對(duì)象的成員變量用getfield相關(guān)指令,成員變量賦值用putfield相關(guān)指令,每條指令后面跟一個(gè)或者兩個(gè)字節(jié)的常量,說明要訪問對(duì)象的成員變量的偏移,Java卡虛擬機(jī)通過實(shí)現(xiàn)這些相關(guān)的訪問指令來實(shí)現(xiàn)對(duì)對(duì)象成員變量的訪問控制。虛擬機(jī)通常的實(shí)現(xiàn)流程如下:首先從運(yùn)行堆棧中取出要訪問的對(duì)象引用(即對(duì)象的標(biāo)識(shí)),然后從存儲(chǔ)代碼的地方(即代碼區(qū))讀取要訪問的成員變量的偏移,系統(tǒng)通過對(duì)象引用計(jì)算并定位對(duì)象的存儲(chǔ)位置,然后校驗(yàn)對(duì)象的訪問權(quán)限,最后通過計(jì)算出的偏移就可以實(shí)現(xiàn)對(duì)成員變量的訪問控制,如讀取、寫入等。
Java卡的對(duì)象分為數(shù)組對(duì)象和非數(shù)組對(duì)象,數(shù)組對(duì)象的訪問控制是在運(yùn)行時(shí)實(shí)現(xiàn)的,而非數(shù)組是由一系列的成員變量構(gòu)成,對(duì)這些成員變量的訪問控制是在編譯階段實(shí)現(xiàn)的,例如,如果用戶編寫一段代碼試圖訪問非數(shù)組對(duì)象不存在的成員變量,編譯器立即就會(huì)發(fā)現(xiàn),也就是說,用戶無法通過直接編寫Java代碼的方式來實(shí)現(xiàn)訪問非數(shù)組對(duì)象所有成員之外的數(shù)據(jù)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的主要目的在于提出一種Java卡防攻擊方法、裝置,旨在解決上述Java可能存在的安全風(fēng)險(xiǎn)問題。
為實(shí)現(xiàn)上述目的,本發(fā)明提供的一種Java卡防攻擊方法,包括:
在創(chuàng)建非數(shù)組對(duì)象時(shí),將所述非數(shù)組對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭中;
當(dāng)所述非數(shù)組對(duì)象被訪問時(shí),校驗(yàn)所述非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的對(duì)象頭中保存的大小信息一致,如果不一致,則拒絕訪問。
可選地,其中,所述將所述非數(shù)組對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭中,包括:
將所述對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中。
可選地,其中,所述當(dāng)所述非數(shù)組對(duì)象被防問時(shí),所述檢驗(yàn)所述非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的對(duì)象頭中保存的大小信息一致,包括:
當(dāng)所述非數(shù)組對(duì)象被訪問時(shí),從運(yùn)行堆棧取出所述非數(shù)組對(duì)象的對(duì)象引用,定位被訪問的非數(shù)組對(duì)象的存儲(chǔ)位置,從所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中讀取所述非數(shù)組對(duì)象的大小信息,從代碼區(qū)讀取被訪問的非數(shù)組對(duì)象的成員變量的偏移值,校驗(yàn)被訪問的非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的大小信息一致。
可選地,其中,所述校驗(yàn)被訪問的非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的大小信息一致,如果不一致,則拒絕訪問,包括:
當(dāng)被訪問的非數(shù)組對(duì)象的成員變量的偏移值大于或等于所述非數(shù)組對(duì)象的大小時(shí),拒絕對(duì)所述非數(shù)組對(duì)象的訪問;當(dāng)所述非數(shù)組對(duì)象的成員變量的偏移值小于所述非數(shù)組對(duì)象的大小并且大于或者等于0時(shí),校驗(yàn)所述非數(shù)組對(duì)象的訪問權(quán)限通過后,根據(jù)計(jì)算出的偏移值實(shí)現(xiàn)對(duì)所述成員變量的訪問。
可選地,其中,所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭與所述非數(shù)組對(duì)象的數(shù)據(jù)分別保存,呈一一對(duì)應(yīng)關(guān)系。
本發(fā)明還提供了一種Java卡防攻擊裝置,包括:
對(duì)象創(chuàng)建模塊,用于在創(chuàng)建非數(shù)組對(duì)象時(shí),將所述非數(shù)組對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭中;
訪問控制模塊,用于當(dāng)所述非數(shù)組對(duì)象被訪問時(shí),校驗(yàn)所述非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的對(duì)象頭中保存的大小信息一致,如果不一致,則拒絕訪問。
可選地,其中,所述將所述非數(shù)組對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭中,包括:
將所述對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中。
可選地,其中,所述訪問控制模塊包括校驗(yàn)單元,用于當(dāng)所述非數(shù)組對(duì)象被訪問時(shí),從運(yùn)行堆棧取出所述非數(shù)組對(duì)象的對(duì)象引用,定位被訪問的非數(shù)組對(duì)象的存儲(chǔ)位置,從所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中讀取所述非數(shù)組對(duì)象的大小信息,從代碼區(qū)讀取被訪問的非數(shù)組對(duì)象的成員變量的偏移值,校驗(yàn)被訪問的非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的大小信息一致。
可選地,其中,所述訪問控制模塊還包括訪問控制單元和訪問執(zhí)行單元:
所述訪問控制單元,用于當(dāng)被訪問的非數(shù)組對(duì)象的成員變量的偏移值大于或等于所述非數(shù)組對(duì)象的大小時(shí),拒絕對(duì)所述非數(shù)組對(duì)象的訪問;
所述訪問執(zhí)行單元,用于當(dāng)所述非數(shù)組對(duì)象的成員變量的偏移值小于所述非數(shù)組對(duì)象的大小并且大于或者等于0時(shí),校驗(yàn)所述非數(shù)組對(duì)象的訪問權(quán)限通過后,根據(jù)計(jì)算出的偏移值實(shí)現(xiàn)對(duì)所述成員變量的訪問。
可選地,其中所述對(duì)象創(chuàng)建模塊還包括存儲(chǔ)單元,用于將所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭與所述非數(shù)組對(duì)象的數(shù)據(jù)分別保存,呈一一對(duì)應(yīng)關(guān)系。
本發(fā)明還提供一種Java卡,包括上述任一項(xiàng)所述的防攻擊裝置。
本發(fā)明實(shí)施例提供的技術(shù)方案,在創(chuàng)建非數(shù)組對(duì)象時(shí),保存該非數(shù)組對(duì)象的大小信息,能夠在非數(shù)組對(duì)象被訪問時(shí)快速確定非數(shù)組對(duì)象的大小,通過比較非數(shù)組對(duì)象的成員變量的偏移值和該非數(shù)組對(duì)象的大小,防止非法用戶惡意修改訪問非數(shù)組對(duì)象的二進(jìn)制執(zhí)行文件中的成員變量的偏移值訪問非數(shù)組對(duì)象所有成員之外的數(shù)據(jù),在不損失Java卡性能的情況下,保證Java卡數(shù)據(jù)訪問的安全性。
附圖說明
圖1為本發(fā)明第一實(shí)施例的Java卡防攻擊方法的流程示意圖;
圖2為本發(fā)明第二實(shí)施例的Java卡防攻擊裝置的模塊示意圖;
圖3為本發(fā)明第二實(shí)施例的Java卡防攻擊裝置的模塊單元示意圖;
圖4為本發(fā)明的包含防攻擊裝置的Java卡結(jié)構(gòu)示意圖;
本發(fā)明目的的實(shí)現(xiàn)、功能特點(diǎn)及優(yōu)點(diǎn)將結(jié)合實(shí)施例,參照附圖做進(jìn)一步說明。
具體實(shí)施方式
應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
下面將結(jié)合附圖及實(shí)施例對(duì)本發(fā)明的技術(shù)方案進(jìn)行更詳細(xì)的說明。
需要說明的是,如果不沖突,本發(fā)明實(shí)施例以及實(shí)施例中的各個(gè)特征可以相互結(jié)合,均在本發(fā)明的保護(hù)范圍之內(nèi)。另外,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
現(xiàn)在將參考附圖描述實(shí)現(xiàn)本發(fā)明各個(gè)實(shí)施例的移動(dòng)終端。在后續(xù)的描述中,使用用于表示元件的諸如“模塊”、“部件”或“單元”的后綴僅為了有利于本發(fā)明的說明,其本身并沒有特定的意義。因此,"模塊"與"部件"可以混合地使用。
現(xiàn)有技術(shù)中非數(shù)組對(duì)象的成員變量的偏移是一個(gè)固定的值,對(duì)象固定后,其中每個(gè)成員的偏移值就固定了。每次訪問非數(shù)組對(duì)象的時(shí)候,編譯器將這個(gè)固定的偏移值寫到二進(jìn)制執(zhí)行文件(即CAP文件)中,然后下載到卡片上執(zhí)行,卡片上的解釋執(zhí)行器讀取這個(gè)偏移值對(duì)應(yīng)的數(shù)據(jù)區(qū)存儲(chǔ)的數(shù)據(jù),如果非法用戶惡意修改了這個(gè)CAP文件中的相關(guān)的偏移值,就可以跳過編譯器的保護(hù)來訪問非數(shù)組對(duì)象所有成員之外的數(shù)據(jù),這是一個(gè)極大的安全漏洞。顯然,對(duì)于一個(gè)具有安全要求的產(chǎn)品來說,如果不采取防范措施,就有潛在的被惡意攻擊的危險(xiǎn)。
針對(duì)上述問題,本發(fā)明第一實(shí)施例提出一種Java卡防攻擊方法,如圖1所示,包括:
步驟10:在創(chuàng)建非數(shù)組對(duì)象時(shí),將所述非數(shù)組對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭中;
在Java卡實(shí)現(xiàn)中,每個(gè)對(duì)象包括兩個(gè)部分:對(duì)象頭和對(duì)象數(shù)據(jù),對(duì)象頭是對(duì)對(duì)象的描述,如對(duì)象的擁有者、對(duì)象的運(yùn)行上下文、對(duì)象所在的包和類等,對(duì)于數(shù)組對(duì)象,對(duì)象頭中還包括數(shù)組的大小信息(對(duì)象的數(shù)量大小),在創(chuàng)建數(shù)組對(duì)象時(shí),該數(shù)組對(duì)象的大小信息相應(yīng)確定了該對(duì)象的成員數(shù)量。
但是,現(xiàn)有Java技術(shù)中,非數(shù)組對(duì)象的對(duì)象頭沒有包含非數(shù)組對(duì)象的大小信息,非數(shù)組對(duì)象的大小信息包含在該對(duì)象的類信息中,類信息又保存在類組件中,要獲取非數(shù)組對(duì)象的大小信息需要經(jīng)過以下幾步:根據(jù)非數(shù)組對(duì)象頭中的包信息定位包的類組件信息,再根據(jù)類組件信息定位對(duì)象類信息,最后從類信息中取得該非數(shù)組對(duì)象的大小。如果每次訪問非數(shù)組對(duì)象都采用這樣的流程,Java卡對(duì)非數(shù)組對(duì)象訪問的性能將變得非常緩慢,直接影響整個(gè)產(chǎn)品性能。
本實(shí)施例提出了在每次創(chuàng)建非數(shù)組對(duì)象時(shí),就將所述非數(shù)組對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭中;非數(shù)組對(duì)象的對(duì)象頭如果有多余的字節(jié),就將該非數(shù)組對(duì)象的大小信息保存到對(duì)象頭的多余字節(jié)中,如果非數(shù)組對(duì)象的對(duì)象頭沒有多余的字節(jié),就擴(kuò)充對(duì)象頭的長(zhǎng)度,在擴(kuò)展的字節(jié)中添加該非數(shù)組對(duì)象的大小信息,以便在訪問非數(shù)組對(duì)象時(shí)能夠快速獲得該非數(shù)組對(duì)象的大小信息(即非數(shù)組對(duì)象的成員數(shù)量的大小)。
步驟12:當(dāng)所述非數(shù)組對(duì)象被訪問時(shí),校驗(yàn)所述非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的對(duì)象頭中保存的大小信息一致,如果不一致,則拒絕訪問。
本發(fā)明實(shí)施例在每次創(chuàng)建非數(shù)組對(duì)象時(shí),就在該非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中保存了該非數(shù)組對(duì)象的大小信息,該大小信息限定了該非數(shù)組對(duì)象的成員數(shù)量;因此,當(dāng)非數(shù)組對(duì)象被訪問時(shí),可以校驗(yàn)非數(shù)組對(duì)象的偏移值(或非數(shù)組對(duì)象的索引)與該非數(shù)組對(duì)象的對(duì)象頭中保存的非數(shù)組對(duì)象大小信息(非數(shù)組對(duì)象的成員數(shù)量)是否一致,如果不一致,表明可能有非法用戶惡意修改了非數(shù)組對(duì)象的成員變量的偏移值,試圖訪問非數(shù)組對(duì)象的成員以外的數(shù)據(jù)區(qū),拒絕Java卡對(duì)該非數(shù)組對(duì)象的訪問。
JAVA卡是一種可以運(yùn)行JAVA程序的CPU智能卡,因此上述方法可以通過Java卡中的CPU/虛擬機(jī)和存儲(chǔ)器進(jìn)行實(shí)施。
本發(fā)明實(shí)施例提供的方法,在創(chuàng)建非數(shù)組對(duì)象時(shí),保存該非數(shù)組對(duì)象的大小信息,在非數(shù)組對(duì)象被訪問時(shí),通過比較非數(shù)組對(duì)象的成員偏移值和該非數(shù)組對(duì)象的大小,可以防止非法用戶惡意修改非數(shù)組對(duì)象的二進(jìn)制執(zhí)行文件(即CAP文件)中的成員變量的偏移值訪問非數(shù)組對(duì)象的所有成員之外的數(shù)據(jù),提高Java卡的安全性。
可選地、上述將所述非數(shù)組對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭中,包括:
將所述對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中。
由于現(xiàn)有技術(shù)中沒有考慮在非數(shù)組對(duì)象的對(duì)象頭中保存非數(shù)組對(duì)象的大小信息問題,因此,在創(chuàng)建非數(shù)組對(duì)象時(shí),該非數(shù)組對(duì)象的大小信息可能無法直接在非數(shù)組對(duì)象的對(duì)象頭字節(jié)中保存(例如當(dāng)非數(shù)組對(duì)象的頭部沒有多余的字節(jié)或者預(yù)留的字節(jié)),則需要擴(kuò)展非數(shù)組對(duì)象的對(duì)象頭的字節(jié)數(shù),以便保存該非數(shù)組對(duì)象的大小信息,擴(kuò)展的對(duì)象頭字節(jié)數(shù)的大小,根據(jù)需要保存的非數(shù)組對(duì)象的大小信息確定。非數(shù)組對(duì)象的大小信息,是指該非數(shù)組對(duì)象的成員變量的數(shù)量(或成員變量的索引號(hào)數(shù)量信息)。
可選地,上述方法中,當(dāng)所述非數(shù)組對(duì)象被訪問時(shí),所述檢驗(yàn)所述非數(shù)組對(duì)象的成員變量的偏移是否與所述非數(shù)組對(duì)象的對(duì)象頭中保存的大小信息一致,包括:
當(dāng)所述非數(shù)組對(duì)象被訪問時(shí),從運(yùn)行堆棧取出所述非數(shù)組對(duì)象的對(duì)象引用,定位被訪問的非數(shù)組對(duì)象的存儲(chǔ)位置,從所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中讀取所述非數(shù)組對(duì)象的大小信息,從代碼區(qū)讀取被訪問的非數(shù)組對(duì)象的成員變量的偏移,校驗(yàn)被訪問的非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的大小信息一致。
本發(fā)明實(shí)施例中,需要對(duì)現(xiàn)有Java對(duì)象訪問控制相關(guān)指令getfield和putfield的流程進(jìn)行修改,修改后的相關(guān)流程如下:
首先從運(yùn)行堆棧中取出要訪問的非數(shù)組對(duì)象引用,通過對(duì)象引用計(jì)算定位所述非數(shù)組對(duì)象的存儲(chǔ)位置,從所述非數(shù)組對(duì)象的存儲(chǔ)位置讀取對(duì)象頭部中的對(duì)象大小信息,然后從代碼區(qū)讀取要訪問該非數(shù)組對(duì)象的成員變量的偏移值,校驗(yàn)非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的大小信息一致,即是否超過了對(duì)象的大小。
顯然,也可以先獲取訪問非數(shù)組對(duì)象的成員變量的偏移值,再獲取所述非數(shù)組對(duì)象的大小信息,然后校驗(yàn)非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的大小信息一致。
非數(shù)組對(duì)象的成員偏移值,表示該非數(shù)組對(duì)象的成員索引(序號(hào));非數(shù)組對(duì)象的大小信息,表示該非數(shù)組對(duì)象的成員變量的數(shù)量(或可索引范圍)。由于本發(fā)明在創(chuàng)建非數(shù)組對(duì)象時(shí),就在該非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中保存了該非數(shù)組對(duì)象的大小信息(成員變量的數(shù)量或可索引范圍),因此可以比較非數(shù)組對(duì)象的成員偏移值是否與所述非數(shù)組對(duì)象的大小信息一致。顯然,正常訪問非數(shù)組對(duì)象的成員變量時(shí),該非數(shù)組對(duì)象的成員變量的偏移值與所述非數(shù)組對(duì)象的大小信息應(yīng)該是一致的,即非數(shù)組對(duì)象的成員變量的偏移值(或索引)不應(yīng)該超出該非數(shù)組對(duì)象的成員變量的數(shù)量范圍或成員變量的可索引范圍。
可選地、其中,當(dāng)被訪問的非數(shù)組對(duì)象的成員變量的偏移值大于或等于所述非數(shù)組對(duì)象的大小時(shí),拒絕對(duì)所述非數(shù)組對(duì)象的訪問;當(dāng)所述非數(shù)組對(duì)象的成員變量的偏移值小于所述非數(shù)組對(duì)象的大小時(shí)并且大于或者等于0,校驗(yàn)所述非數(shù)組對(duì)象的訪問權(quán)限通過時(shí),根據(jù)計(jì)算出的偏移值實(shí)現(xiàn)對(duì)所述成員變量的訪問。
本發(fā)明實(shí)施例中,如果校驗(yàn)發(fā)現(xiàn)被訪問的非數(shù)組對(duì)象的成員變量的偏移值大于或等于所述非數(shù)組對(duì)象的大小,例如,被訪問的非數(shù)組對(duì)象的成員變量的索引,超過了該非數(shù)組對(duì)象的成員變量的數(shù)量大小或成員變量的可索引范圍,則表明該非數(shù)組對(duì)象的成員變量的偏移值與所述非數(shù)組對(duì)象的大小信息不一致,訪問所述非數(shù)組對(duì)象的二進(jìn)制執(zhí)行文件異常或可能遭受惡意修改,執(zhí)行程序試圖訪問該非數(shù)組對(duì)象的成員變量以外的數(shù)據(jù)區(qū),因此拒絕對(duì)所述非數(shù)組對(duì)象的訪問,防止Java卡的數(shù)據(jù)區(qū)受到惡意攻擊。
可選地,在發(fā)現(xiàn)非法訪問非數(shù)組變量時(shí),可以告警提示,也可以終止卡片的運(yùn)行。
可選地,上述方法中,所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭,與所述非數(shù)組對(duì)象的數(shù)據(jù)分別保存,呈一一對(duì)應(yīng)關(guān)系。
現(xiàn)有技術(shù)中非數(shù)組對(duì)象的對(duì)象頭和數(shù)據(jù)區(qū)是保存在同一存儲(chǔ)空間的,對(duì)象頭并不保存該非數(shù)組對(duì)象的大小信息。本發(fā)明實(shí)施例中,在創(chuàng)建非數(shù)組對(duì)象時(shí),將該非數(shù)組對(duì)象的大小信息保存到該非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭時(shí),可以參照現(xiàn)有的非數(shù)組對(duì)象的存儲(chǔ)空間分配方式進(jìn)行保存該非數(shù)組對(duì)象。
優(yōu)選地,為便于快速檢索校驗(yàn),盡可能減少對(duì)Java卡技術(shù)性能的影響,可以將非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭在單獨(dú)劃分的存儲(chǔ)空間進(jìn)行保存,而將非數(shù)組對(duì)象的數(shù)據(jù)區(qū)在另外劃分的存儲(chǔ)空間保存,使非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭與所述非數(shù)組對(duì)象的數(shù)據(jù)區(qū),呈一一對(duì)應(yīng)關(guān)系,以便能夠快速定位非數(shù)組對(duì)象的大小,在不損失Java卡性能的情況下,保證Java卡數(shù)據(jù)訪問的安全性。
本發(fā)明實(shí)施例提供的方法,在創(chuàng)建非數(shù)組對(duì)象時(shí),保存該非數(shù)組對(duì)象的大小信息,能夠在非數(shù)組對(duì)象被訪問時(shí)快速確定非數(shù)組對(duì)象的大小,通過比較非數(shù)組對(duì)象的成員變量的偏移值和該非數(shù)組對(duì)象的大小,防止非法用戶惡意修改訪問非數(shù)組對(duì)象的二進(jìn)制執(zhí)行文件中的成員變量的偏移值訪問非數(shù)組對(duì)象所有成員之外的數(shù)據(jù),在不損失Java卡性能的情況下,保證Java卡數(shù)據(jù)訪問的安全性。
相應(yīng)地,本發(fā)明第二實(shí)施例還提供了一種Java卡防攻擊裝置,如圖2所示,包括:
對(duì)象創(chuàng)建模塊20,用于在創(chuàng)建非數(shù)組對(duì)象時(shí),將所述非數(shù)組對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭中;
訪問控制模塊22,用于當(dāng)所述非數(shù)組對(duì)象被訪問時(shí),校驗(yàn)所述非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的對(duì)象頭中保存的大小信息一致,如果不一致,則拒絕訪問。
JAVA卡是一種可以運(yùn)行JAVA程序的CPU智能卡,因此上述裝置可以通過Java卡中的CPU/虛擬機(jī)和存儲(chǔ)器進(jìn)行實(shí)施。
本發(fā)明實(shí)施例提供的裝置,在創(chuàng)建非數(shù)組對(duì)象時(shí),保存該非數(shù)組對(duì)象的大小信息,在非數(shù)組對(duì)象被訪問時(shí),比較非數(shù)組對(duì)象的成員變量的偏移值和該非數(shù)組對(duì)象的大小,可以防止非法用戶惡意修改訪問非數(shù)組對(duì)象的二進(jìn)制執(zhí)行文件中的成員變量的偏移值訪問非數(shù)組對(duì)象的所有成員之外的數(shù)據(jù),提高Java卡的安全性。
可選地,上述裝置中,將所述非數(shù)組對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭中,包括:
將所述對(duì)象的大小信息保存到所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中。
可選地,如圖3所示,所述訪問控制模塊包括校驗(yàn)單元221,用于當(dāng)所述非數(shù)組對(duì)象被訪問時(shí),從運(yùn)行堆棧取出所述非數(shù)組對(duì)象的對(duì)象引用,定位被訪問的非數(shù)組對(duì)象的存儲(chǔ)位置,從所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭中讀取所述非數(shù)組對(duì)象的大小信息,從代碼區(qū)讀取被訪問的非數(shù)組對(duì)象的成員變量的偏移,校驗(yàn)被訪問的非數(shù)組對(duì)象的成員變量的偏移值是否與所述非數(shù)組對(duì)象的大小信息一致。
可選地,如圖3所示,所述訪問控制模塊還包括控制單元222和執(zhí)行單元223:
所述控制單元222,用于當(dāng)被訪問的非數(shù)組對(duì)象的成員變量的偏移值大于所述非數(shù)組對(duì)象的大小時(shí),拒絕對(duì)所述非數(shù)組對(duì)象的訪問;
所述執(zhí)行單元223,用于當(dāng)所述非數(shù)組對(duì)象的偏移值小于或等于所述非數(shù)組對(duì)象的大小時(shí),校驗(yàn)所述非數(shù)組對(duì)象的訪問權(quán)限,根據(jù)計(jì)算出的偏移值實(shí)現(xiàn)對(duì)所述成員變量的訪問。
可選地,如圖3所示,所述裝置的對(duì)象創(chuàng)建模塊還包括存儲(chǔ)單元201,用于將所述非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭與所述非數(shù)組對(duì)象的數(shù)據(jù)分別保存,呈一一對(duì)應(yīng)關(guān)系。
本發(fā)明實(shí)施例提供的裝置,在創(chuàng)建非數(shù)組對(duì)象時(shí),保存該非數(shù)組對(duì)象的大小信息,在非數(shù)組對(duì)象被訪問時(shí)能夠快速確定非數(shù)組對(duì)象的大小,通過比較非數(shù)組對(duì)象的成員偏移值和該非數(shù)組對(duì)象的大小,防止非法用戶惡意修改訪問非數(shù)組對(duì)象的二進(jìn)制執(zhí)行文件中的成員變量的偏移值訪問非數(shù)組對(duì)象的所有成員之外的數(shù)據(jù),在不損失Java卡性能的情況下,保證Java卡數(shù)據(jù)訪問的安全性。
下面通過一個(gè)示范性實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步的說明。假定非數(shù)組對(duì)象abc包含5個(gè)成員變量A、B、C、D、E,各個(gè)成員變量的索引分別a1、a2、a3、a4、a5(或索引號(hào)0~4);正常情況下,虛擬機(jī)從運(yùn)行堆棧中取出要訪問的對(duì)象引用(即對(duì)象的標(biāo)識(shí),此處假定為abc),系統(tǒng)通過對(duì)象引用計(jì)算可以定位對(duì)象存儲(chǔ)位置,例如00FF0000H地址,然后取出對(duì)象的大小5(索引號(hào)的總共個(gè)數(shù)),之后從存儲(chǔ)代碼的代碼區(qū)讀取要訪問的成員變量的偏移(例如a1~a5中的任一索引號(hào)0~4),校驗(yàn)對(duì)象的訪問權(quán)限(例允許只讀或允許讀、寫等等)通過后,進(jìn)一步校驗(yàn)對(duì)象訪問的索引值是否和對(duì)象頭中的索引值是否一致,如果一致,則根據(jù)該對(duì)象的存儲(chǔ)位置和對(duì)象成員變量的偏移值(如a1~a5或0~4),對(duì)相應(yīng)的成員變量A、B、C、D或E進(jìn)行訪問,如讀取、寫入等等。非數(shù)組對(duì)象的存儲(chǔ)位置和其中的成員變量的偏移值,唯一確定了相應(yīng)的成員變量的數(shù)據(jù)存儲(chǔ)區(qū)位置。
現(xiàn)有技術(shù)中如果非法用戶惡意修改CAB文件,將成員變量的偏移值修改為a6或索引號(hào)為5(即超過了非數(shù)組對(duì)象的成員變量的數(shù)量5或成員變量的可索引范圍0~4),如果不做防護(hù),則可以訪問或惡意修改非數(shù)組變量abc的正常成員變量之外的數(shù)據(jù)空間,如讀取或修改數(shù)據(jù),從而破壞Java卡的數(shù)據(jù)安全性。
本實(shí)施例中,在創(chuàng)建非數(shù)組對(duì)象abc時(shí),就在該非數(shù)組對(duì)象的對(duì)象頭或擴(kuò)展的對(duì)象頭字節(jié)中保存了該非數(shù)組對(duì)象的大小信息(例如,此處為成員變量索引個(gè)數(shù):5);在執(zhí)行訪問該非數(shù)組對(duì)象時(shí),需要先通過比較非數(shù)組對(duì)象abc的成員變量的偏移值是否與該非數(shù)組對(duì)象abc的對(duì)象頭中保存的數(shù)組大小信息是否一致。此時(shí),如果非法用戶惡意修改訪問該非數(shù)組對(duì)象abc的二進(jìn)制可執(zhí)行文件,將該非數(shù)組對(duì)象的成員變量的偏移值修改為a6,則可以發(fā)現(xiàn)a6(即索引號(hào)為5,而不是0~4)超過了該非數(shù)組對(duì)象abc的大小(即成員數(shù)量5或索引號(hào)0~4的范圍),拒絕對(duì)所述非數(shù)組對(duì)象abc的訪問,從而保護(hù)Java卡數(shù)據(jù)區(qū)保存的數(shù)據(jù)免遭惡意讀取或修改破壞。
顯然只要訪問該非數(shù)組對(duì)象的成員變量的偏移值,超出了創(chuàng)建該非數(shù)組對(duì)象時(shí)的對(duì)象大小,即是試圖訪問該非數(shù)組對(duì)象的成員以外的數(shù)據(jù)區(qū),例如,該非數(shù)組對(duì)象的大小為5或可索引的成員變量的偏移值為0~4;只要訪問該非數(shù)組對(duì)象的二進(jìn)制可執(zhí)行文件中的成員變量的偏移值超出了0~4的范圍或者超過了該非數(shù)組對(duì)象的大小(即成員變量數(shù)5),例如將訪問非數(shù)組對(duì)象的成員變量的偏移值修改為10,本發(fā)明實(shí)施例對(duì)該非數(shù)組對(duì)象的成員變量的數(shù)據(jù)區(qū)執(zhí)行操作之前,即可校驗(yàn)發(fā)現(xiàn)該偏移值10超過所述非數(shù)組對(duì)象的大小(即5或非數(shù)組對(duì)象的成員變量可索引范圍0~4),屬于非法操作,拒絕對(duì)所述非數(shù)組對(duì)象的訪問。同時(shí),可以告警提示。
需要說明的是,在本文中,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者裝置不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者裝置所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)……”限定的要素,并不排除在包括該要素的過程、方法、物品或者裝置中還存在另外的相同要素。
上述本發(fā)明實(shí)施例序號(hào)僅僅為了描述,不代表實(shí)施例的優(yōu)劣。
通過以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到上述實(shí)施例方法可借助軟件加必需的通用硬件平臺(tái)的方式來實(shí)現(xiàn),當(dāng)然也可以通過硬件,但很多情況下前者是更佳的實(shí)施方式?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)(如ROM/RAM)中,包括若干指令用以使得一臺(tái)終端設(shè)備(如Java卡)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述的方法。
以上僅為本發(fā)明的優(yōu)選實(shí)施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運(yùn)用在其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。