一种Java卡防攻击方法及装置与流程

文档序号:12177843阅读:244来源:国知局
一种Java卡防攻击方法及装置与流程

本发明涉及Java卡技术领域,尤其涉及一种Java卡防攻击方法、装置。



背景技术:

Java卡对象访问通常通过几条汇编指令来完成,如读取对象的成员变量用getfield相关指令,成员变量赋值用putfield相关指令,每条指令后面跟一个或者两个字节的常量,说明要访问对象的成员变量的偏移,Java卡虚拟机通过实现这些相关的访问指令来实现对对象成员变量的访问控制。虚拟机通常的实现流程如下:首先从运行堆栈中取出要访问的对象引用(即对象的标识),然后从存储代码的地方(即代码区)读取要访问的成员变量的偏移,系统通过对象引用计算并定位对象的存储位置,然后校验对象的访问权限,最后通过计算出的偏移就可以实现对成员变量的访问控制,如读取、写入等。

Java卡的对象分为数组对象和非数组对象,数组对象的访问控制是在运行时实现的,而非数组是由一系列的成员变量构成,对这些成员变量的访问控制是在编译阶段实现的,例如,如果用户编写一段代码试图访问非数组对象不存在的成员变量,编译器立即就会发现,也就是说,用户无法通过直接编写Java代码的方式来实现访问非数组对象所有成员之外的数据。



技术实现要素:

本发明的主要目的在于提出一种Java卡防攻击方法、装置,旨在解决上述Java可能存在的安全风险问题。

为实现上述目的,本发明提供的一种Java卡防攻击方法,包括:

在创建非数组对象时,将所述非数组对象的大小信息保存到所述非数组对象的对象头中;

当所述非数组对象被访问时,校验所述非数组对象的成员变量的偏移值是否与所述非数组对象的对象头中保存的大小信息一致,如果不一致,则拒绝访问。

可选地,其中,所述将所述非数组对象的大小信息保存到所述非数组对象的对象头中,包括:

将所述对象的大小信息保存到所述非数组对象的对象头或扩展的对象头中。

可选地,其中,所述当所述非数组对象被防问时,所述检验所述非数组对象的成员变量的偏移值是否与所述非数组对象的对象头中保存的大小信息一致,包括:

当所述非数组对象被访问时,从运行堆栈取出所述非数组对象的对象引用,定位被访问的非数组对象的存储位置,从所述非数组对象的对象头或扩展的对象头中读取所述非数组对象的大小信息,从代码区读取被访问的非数组对象的成员变量的偏移值,校验被访问的非数组对象的成员变量的偏移值是否与所述非数组对象的大小信息一致。

可选地,其中,所述校验被访问的非数组对象的成员变量的偏移值是否与所述非数组对象的大小信息一致,如果不一致,则拒绝访问,包括:

当被访问的非数组对象的成员变量的偏移值大于或等于所述非数组对象的大小时,拒绝对所述非数组对象的访问;当所述非数组对象的成员变量的偏移值小于所述非数组对象的大小并且大于或者等于0时,校验所述非数组对象的访问权限通过后,根据计算出的偏移值实现对所述成员变量的访问。

可选地,其中,所述非数组对象的对象头或扩展的对象头与所述非数组对象的数据分别保存,呈一一对应关系。

本发明还提供了一种Java卡防攻击装置,包括:

对象创建模块,用于在创建非数组对象时,将所述非数组对象的大小信息保存到所述非数组对象的对象头中;

访问控制模块,用于当所述非数组对象被访问时,校验所述非数组对象的成员变量的偏移值是否与所述非数组对象的对象头中保存的大小信息一致,如果不一致,则拒绝访问。

可选地,其中,所述将所述非数组对象的大小信息保存到所述非数组对象的对象头中,包括:

将所述对象的大小信息保存到所述非数组对象的对象头或扩展的对象头中。

可选地,其中,所述访问控制模块包括校验单元,用于当所述非数组对象被访问时,从运行堆栈取出所述非数组对象的对象引用,定位被访问的非数组对象的存储位置,从所述非数组对象的对象头或扩展的对象头中读取所述非数组对象的大小信息,从代码区读取被访问的非数组对象的成员变量的偏移值,校验被访问的非数组对象的成员变量的偏移值是否与所述非数组对象的大小信息一致。

可选地,其中,所述访问控制模块还包括访问控制单元和访问执行单元:

所述访问控制单元,用于当被访问的非数组对象的成员变量的偏移值大于或等于所述非数组对象的大小时,拒绝对所述非数组对象的访问;

所述访问执行单元,用于当所述非数组对象的成员变量的偏移值小于所述非数组对象的大小并且大于或者等于0时,校验所述非数组对象的访问权限通过后,根据计算出的偏移值实现对所述成员变量的访问。

可选地,其中所述对象创建模块还包括存储单元,用于将所述非数组对象的对象头或扩展的对象头与所述非数组对象的数据分别保存,呈一一对应关系。

本发明还提供一种Java卡,包括上述任一项所述的防攻击装置。

本发明实施例提供的技术方案,在创建非数组对象时,保存该非数组对象的大小信息,能够在非数组对象被访问时快速确定非数组对象的大小,通过比较非数组对象的成员变量的偏移值和该非数组对象的大小,防止非法用户恶意修改访问非数组对象的二进制执行文件中的成员变量的偏移值访问非数组对象所有成员之外的数据,在不损失Java卡性能的情况下,保证Java卡数据访问的安全性。

附图说明

图1为本发明第一实施例的Java卡防攻击方法的流程示意图;

图2为本发明第二实施例的Java卡防攻击装置的模块示意图;

图3为本发明第二实施例的Java卡防攻击装置的模块单元示意图;

图4为本发明的包含防攻击装置的Java卡结构示意图;

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

下面将结合附图及实施例对本发明的技术方案进行更详细的说明。

需要说明的是,如果不冲突,本发明实施例以及实施例中的各个特征可以相互结合,均在本发明的保护范围之内。另外,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

现在将参考附图描述实现本发明各个实施例的移动终端。在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身并没有特定的意义。因此,"模块"与"部件"可以混合地使用。

现有技术中非数组对象的成员变量的偏移是一个固定的值,对象固定后,其中每个成员的偏移值就固定了。每次访问非数组对象的时候,编译器将这个固定的偏移值写到二进制执行文件(即CAP文件)中,然后下载到卡片上执行,卡片上的解释执行器读取这个偏移值对应的数据区存储的数据,如果非法用户恶意修改了这个CAP文件中的相关的偏移值,就可以跳过编译器的保护来访问非数组对象所有成员之外的数据,这是一个极大的安全漏洞。显然,对于一个具有安全要求的产品来说,如果不采取防范措施,就有潜在的被恶意攻击的危险。

针对上述问题,本发明第一实施例提出一种Java卡防攻击方法,如图1所示,包括:

步骤10:在创建非数组对象时,将所述非数组对象的大小信息保存到所述非数组对象的对象头中;

在Java卡实现中,每个对象包括两个部分:对象头和对象数据,对象头是对对象的描述,如对象的拥有者、对象的运行上下文、对象所在的包和类等,对于数组对象,对象头中还包括数组的大小信息(对象的数量大小),在创建数组对象时,该数组对象的大小信息相应确定了该对象的成员数量。

但是,现有Java技术中,非数组对象的对象头没有包含非数组对象的大小信息,非数组对象的大小信息包含在该对象的类信息中,类信息又保存在类组件中,要获取非数组对象的大小信息需要经过以下几步:根据非数组对象头中的包信息定位包的类组件信息,再根据类组件信息定位对象类信息,最后从类信息中取得该非数组对象的大小。如果每次访问非数组对象都采用这样的流程,Java卡对非数组对象访问的性能将变得非常缓慢,直接影响整个产品性能。

本实施例提出了在每次创建非数组对象时,就将所述非数组对象的大小信息保存到所述非数组对象的对象头中;非数组对象的对象头如果有多余的字节,就将该非数组对象的大小信息保存到对象头的多余字节中,如果非数组对象的对象头没有多余的字节,就扩充对象头的长度,在扩展的字节中添加该非数组对象的大小信息,以便在访问非数组对象时能够快速获得该非数组对象的大小信息(即非数组对象的成员数量的大小)。

步骤12:当所述非数组对象被访问时,校验所述非数组对象的成员变量的偏移值是否与所述非数组对象的对象头中保存的大小信息一致,如果不一致,则拒绝访问。

本发明实施例在每次创建非数组对象时,就在该非数组对象的对象头或扩展的对象头中保存了该非数组对象的大小信息,该大小信息限定了该非数组对象的成员数量;因此,当非数组对象被访问时,可以校验非数组对象的偏移值(或非数组对象的索引)与该非数组对象的对象头中保存的非数组对象大小信息(非数组对象的成员数量)是否一致,如果不一致,表明可能有非法用户恶意修改了非数组对象的成员变量的偏移值,试图访问非数组对象的成员以外的数据区,拒绝Java卡对该非数组对象的访问。

JAVA卡是一种可以运行JAVA程序的CPU智能卡,因此上述方法可以通过Java卡中的CPU/虚拟机和存储器进行实施。

本发明实施例提供的方法,在创建非数组对象时,保存该非数组对象的大小信息,在非数组对象被访问时,通过比较非数组对象的成员偏移值和该非数组对象的大小,可以防止非法用户恶意修改非数组对象的二进制执行文件(即CAP文件)中的成员变量的偏移值访问非数组对象的所有成员之外的数据,提高Java卡的安全性。

可选地、上述将所述非数组对象的大小信息保存到所述非数组对象的对象头中,包括:

将所述对象的大小信息保存到所述非数组对象的对象头或扩展的对象头中。

由于现有技术中没有考虑在非数组对象的对象头中保存非数组对象的大小信息问题,因此,在创建非数组对象时,该非数组对象的大小信息可能无法直接在非数组对象的对象头字节中保存(例如当非数组对象的头部没有多余的字节或者预留的字节),则需要扩展非数组对象的对象头的字节数,以便保存该非数组对象的大小信息,扩展的对象头字节数的大小,根据需要保存的非数组对象的大小信息确定。非数组对象的大小信息,是指该非数组对象的成员变量的数量(或成员变量的索引号数量信息)。

可选地,上述方法中,当所述非数组对象被访问时,所述检验所述非数组对象的成员变量的偏移是否与所述非数组对象的对象头中保存的大小信息一致,包括:

当所述非数组对象被访问时,从运行堆栈取出所述非数组对象的对象引用,定位被访问的非数组对象的存储位置,从所述非数组对象的对象头或扩展的对象头中读取所述非数组对象的大小信息,从代码区读取被访问的非数组对象的成员变量的偏移,校验被访问的非数组对象的成员变量的偏移值是否与所述非数组对象的大小信息一致。

本发明实施例中,需要对现有Java对象访问控制相关指令getfield和putfield的流程进行修改,修改后的相关流程如下:

首先从运行堆栈中取出要访问的非数组对象引用,通过对象引用计算定位所述非数组对象的存储位置,从所述非数组对象的存储位置读取对象头部中的对象大小信息,然后从代码区读取要访问该非数组对象的成员变量的偏移值,校验非数组对象的成员变量的偏移值是否与所述非数组对象的大小信息一致,即是否超过了对象的大小。

显然,也可以先获取访问非数组对象的成员变量的偏移值,再获取所述非数组对象的大小信息,然后校验非数组对象的成员变量的偏移值是否与所述非数组对象的大小信息一致。

非数组对象的成员偏移值,表示该非数组对象的成员索引(序号);非数组对象的大小信息,表示该非数组对象的成员变量的数量(或可索引范围)。由于本发明在创建非数组对象时,就在该非数组对象的对象头或扩展的对象头中保存了该非数组对象的大小信息(成员变量的数量或可索引范围),因此可以比较非数组对象的成员偏移值是否与所述非数组对象的大小信息一致。显然,正常访问非数组对象的成员变量时,该非数组对象的成员变量的偏移值与所述非数组对象的大小信息应该是一致的,即非数组对象的成员变量的偏移值(或索引)不应该超出该非数组对象的成员变量的数量范围或成员变量的可索引范围。

可选地、其中,当被访问的非数组对象的成员变量的偏移值大于或等于所述非数组对象的大小时,拒绝对所述非数组对象的访问;当所述非数组对象的成员变量的偏移值小于所述非数组对象的大小时并且大于或者等于0,校验所述非数组对象的访问权限通过时,根据计算出的偏移值实现对所述成员变量的访问。

本发明实施例中,如果校验发现被访问的非数组对象的成员变量的偏移值大于或等于所述非数组对象的大小,例如,被访问的非数组对象的成员变量的索引,超过了该非数组对象的成员变量的数量大小或成员变量的可索引范围,则表明该非数组对象的成员变量的偏移值与所述非数组对象的大小信息不一致,访问所述非数组对象的二进制执行文件异常或可能遭受恶意修改,执行程序试图访问该非数组对象的成员变量以外的数据区,因此拒绝对所述非数组对象的访问,防止Java卡的数据区受到恶意攻击。

可选地,在发现非法访问非数组变量时,可以告警提示,也可以终止卡片的运行。

可选地,上述方法中,所述非数组对象的对象头或扩展的对象头,与所述非数组对象的数据分别保存,呈一一对应关系。

现有技术中非数组对象的对象头和数据区是保存在同一存储空间的,对象头并不保存该非数组对象的大小信息。本发明实施例中,在创建非数组对象时,将该非数组对象的大小信息保存到该非数组对象的对象头或扩展的对象头时,可以参照现有的非数组对象的存储空间分配方式进行保存该非数组对象。

优选地,为便于快速检索校验,尽可能减少对Java卡技术性能的影响,可以将非数组对象的对象头或扩展的对象头在单独划分的存储空间进行保存,而将非数组对象的数据区在另外划分的存储空间保存,使非数组对象的对象头或扩展的对象头与所述非数组对象的数据区,呈一一对应关系,以便能够快速定位非数组对象的大小,在不损失Java卡性能的情况下,保证Java卡数据访问的安全性。

本发明实施例提供的方法,在创建非数组对象时,保存该非数组对象的大小信息,能够在非数组对象被访问时快速确定非数组对象的大小,通过比较非数组对象的成员变量的偏移值和该非数组对象的大小,防止非法用户恶意修改访问非数组对象的二进制执行文件中的成员变量的偏移值访问非数组对象所有成员之外的数据,在不损失Java卡性能的情况下,保证Java卡数据访问的安全性。

相应地,本发明第二实施例还提供了一种Java卡防攻击装置,如图2所示,包括:

对象创建模块20,用于在创建非数组对象时,将所述非数组对象的大小信息保存到所述非数组对象的对象头中;

访问控制模块22,用于当所述非数组对象被访问时,校验所述非数组对象的成员变量的偏移值是否与所述非数组对象的对象头中保存的大小信息一致,如果不一致,则拒绝访问。

JAVA卡是一种可以运行JAVA程序的CPU智能卡,因此上述装置可以通过Java卡中的CPU/虚拟机和存储器进行实施。

本发明实施例提供的装置,在创建非数组对象时,保存该非数组对象的大小信息,在非数组对象被访问时,比较非数组对象的成员变量的偏移值和该非数组对象的大小,可以防止非法用户恶意修改访问非数组对象的二进制执行文件中的成员变量的偏移值访问非数组对象的所有成员之外的数据,提高Java卡的安全性。

可选地,上述装置中,将所述非数组对象的大小信息保存到所述非数组对象的对象头中,包括:

将所述对象的大小信息保存到所述非数组对象的对象头或扩展的对象头中。

可选地,如图3所示,所述访问控制模块包括校验单元221,用于当所述非数组对象被访问时,从运行堆栈取出所述非数组对象的对象引用,定位被访问的非数组对象的存储位置,从所述非数组对象的对象头或扩展的对象头中读取所述非数组对象的大小信息,从代码区读取被访问的非数组对象的成员变量的偏移,校验被访问的非数组对象的成员变量的偏移值是否与所述非数组对象的大小信息一致。

可选地,如图3所示,所述访问控制模块还包括控制单元222和执行单元223:

所述控制单元222,用于当被访问的非数组对象的成员变量的偏移值大于所述非数组对象的大小时,拒绝对所述非数组对象的访问;

所述执行单元223,用于当所述非数组对象的偏移值小于或等于所述非数组对象的大小时,校验所述非数组对象的访问权限,根据计算出的偏移值实现对所述成员变量的访问。

可选地,如图3所示,所述装置的对象创建模块还包括存储单元201,用于将所述非数组对象的对象头或扩展的对象头与所述非数组对象的数据分别保存,呈一一对应关系。

本发明实施例提供的装置,在创建非数组对象时,保存该非数组对象的大小信息,在非数组对象被访问时能够快速确定非数组对象的大小,通过比较非数组对象的成员偏移值和该非数组对象的大小,防止非法用户恶意修改访问非数组对象的二进制执行文件中的成员变量的偏移值访问非数组对象的所有成员之外的数据,在不损失Java卡性能的情况下,保证Java卡数据访问的安全性。

下面通过一个示范性实施例,对本发明进行进一步的说明。假定非数组对象abc包含5个成员变量A、B、C、D、E,各个成员变量的索引分别a1、a2、a3、a4、a5(或索引号0~4);正常情况下,虚拟机从运行堆栈中取出要访问的对象引用(即对象的标识,此处假定为abc),系统通过对象引用计算可以定位对象存储位置,例如00FF0000H地址,然后取出对象的大小5(索引号的总共个数),之后从存储代码的代码区读取要访问的成员变量的偏移(例如a1~a5中的任一索引号0~4),校验对象的访问权限(例允许只读或允许读、写等等)通过后,进一步校验对象访问的索引值是否和对象头中的索引值是否一致,如果一致,则根据该对象的存储位置和对象成员变量的偏移值(如a1~a5或0~4),对相应的成员变量A、B、C、D或E进行访问,如读取、写入等等。非数组对象的存储位置和其中的成员变量的偏移值,唯一确定了相应的成员变量的数据存储区位置。

现有技术中如果非法用户恶意修改CAB文件,将成员变量的偏移值修改为a6或索引号为5(即超过了非数组对象的成员变量的数量5或成员变量的可索引范围0~4),如果不做防护,则可以访问或恶意修改非数组变量abc的正常成员变量之外的数据空间,如读取或修改数据,从而破坏Java卡的数据安全性。

本实施例中,在创建非数组对象abc时,就在该非数组对象的对象头或扩展的对象头字节中保存了该非数组对象的大小信息(例如,此处为成员变量索引个数:5);在执行访问该非数组对象时,需要先通过比较非数组对象abc的成员变量的偏移值是否与该非数组对象abc的对象头中保存的数组大小信息是否一致。此时,如果非法用户恶意修改访问该非数组对象abc的二进制可执行文件,将该非数组对象的成员变量的偏移值修改为a6,则可以发现a6(即索引号为5,而不是0~4)超过了该非数组对象abc的大小(即成员数量5或索引号0~4的范围),拒绝对所述非数组对象abc的访问,从而保护Java卡数据区保存的数据免遭恶意读取或修改破坏。

显然只要访问该非数组对象的成员变量的偏移值,超出了创建该非数组对象时的对象大小,即是试图访问该非数组对象的成员以外的数据区,例如,该非数组对象的大小为5或可索引的成员变量的偏移值为0~4;只要访问该非数组对象的二进制可执行文件中的成员变量的偏移值超出了0~4的范围或者超过了该非数组对象的大小(即成员变量数5),例如将访问非数组对象的成员变量的偏移值修改为10,本发明实施例对该非数组对象的成员变量的数据区执行操作之前,即可校验发现该偏移值10超过所述非数组对象的大小(即5或非数组对象的成员变量可索引范围0~4),属于非法操作,拒绝对所述非数组对象的访问。同时,可以告警提示。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM)中,包括若干指令用以使得一台终端设备(如Java卡)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1