本发明涉及JAVA智能卡领域,尤其涉及一种JAVA智能卡访问越界的检测方法。
背景技术:
::智能卡(SmartCard)是一种带有微型处理器和存储器芯片的微型集成电路卡片,具有运算能力和信息存储功能。Java智能卡是将Java语言运行平台移植到智能卡芯片中,使得Java技术“一次编译,处处运行”的特点可以应用于智能卡上。在Java智能卡的应用开发中,开发方不需要考虑应用装载的平台和平台的特性。与传统卡片相比,Java智能卡不仅具有平台无关性,更重要的是支持一卡多应用,且具有更高的安全性。根据Java卡相关的规范,其安全机制包括应用安装前的检查,如字节码校验(BCV),应用安装过程如GP规范,应用间独立如防火墙等;但是在虚拟机解释器在执行字节码的过程,缺少安全机制保障运行时的安全,比如可能出现的访问越界或者类型强制转换等问题;其中,组件间的越界访问是暂时未解决的问题之一。根据Java卡虚拟机规范,一个应用的CAP文件由12个组件组成,安装到卡片上的组件主要有引入组件、常量池组件、类组件、方法组件、静态域组件等;为了节省卡片的存储空间,每个组件都是接连存放在EEPROM中,导致对某一个组件的访问溢出时可能访问到另一个组件的信息;类组件是用于存放应用定义的类的信息;每个类中定义的方法,包括一个是public_virtual_method_table数组,它表示public和protected虚方法的数组,也包括所有的或者任何一个它的超类所声明或者定义的方法,这些方法可以在一个类的实例上被调用;另一个是package_virtual_method_table数组,这个数组不仅包含了这个类所定义和声明的方法,同时还包括这个包中定义的任何一个或所有的它的超类所定义和声明的方法。如果在CAP文件安装到卡片上时,由于某种原因导致类组件的方法表数组内的一个元素,或者是常量池数组中的某个方法的引用出现问题,那么可能导致的结果是对Class组件的访问溢出。虚拟机执行过程的安全性一直都是困扰开发者的一个重要问题,只要CAP文件在解释执行前没被检测出漏洞,那么解释器执行过程中出现的问题就无法解决。综上,有必要设计一种JAVA智能卡访问越界的检测方法来弥补上述缺陷。技术实现要素:本发明提出一种JAVA智能卡访问越界的检测方法,其用于解决现有技术中JAVA智能卡中的虚拟机解释器执行时存在访问越界的缺陷。本发明通过在执行方法调用指令invokevirtual时,对类组件的检查过程,来防止访问越界,故提高虚拟机解释器执行过程的安全性。本发明的技术方案是这样实现的:本发明公开一种JAVA智能卡访问越界的检测方法,其包括如下步骤:(S01)在将CAP文件安装到JAVA智能卡时,对CAP文件进行处理;其中,CAP文件包括多个组件,包括常量池组件、类组件和方法组件;(S02)在应用执行过程中,JAVA智能卡内的虚拟机解释器在执行CAP文件中的指令时,对CAP文件的类组件进行检查。其中,步骤(S01)中,CAP文件的处理方法包括:(1)在载入前,在CAP文件的每个组件后加上结束标识符;(2)在安装过程中,每次载入CAP文件的其中一个组件后,由JAVA智能卡上的安装程序执行在该组件后加上结束标识符。其中,步骤(S02)包括如下步骤:(S21)根据指令操作数定位到常量池数组,其中,指令操作数为链接到常量池组件的token值;(S22)在常量池数组中找到对应的项,获得被调用方法所在的类的引用和方法token,进而定位到类组件中确定的类以及方法表中的对应项;(S23)在类组件中,每个类的信息包括表示方法表数组大小的public_method_table_count以及表示方法表偏移基数的public_method_table_base,根据public_method_table_count和public_method_table_base两个数值,定位到数组的末尾;(S24)通过public_method_table_base+public_method_table_count*2+1直接访问到该数组的尾部,紧接着判断尾部的值,若访问到类组件的结束符,表示类组件结束,后面是方法组件,则该方法调用指令可以正确地获取到方法表中的偏移信息,此时结束检查;若访问到的不是类组件的结束符,则直接进入步骤(S25)第二阶段的检查;(S25)判断类组件中可能存在的其他数组,通过package_virtual_method_table、implemented_interface_info以及remote_interface_info的数组大小来定位到该组件的末尾,判断是否能访问到类组件的结束符,访问到结束符表示该方法表的元素数是正确的,否则说明该类组件的大小存在问题,则抛出异常。其中,步骤(S25)包括如下步骤:(251)判断package_method_table_count来确定是否有该数组,若有,则定位到该数组的末尾;(252)判断interface_count,对接口数组进行判断和定位;(253)通过类组件bitfield中的ACC_ROMOTE判断该类是否有远程接口,若有,定位至远程接口的末尾,该远程接口的类型是remote_interface_info;(254)定位到类组件末尾,判断是否能访问到类组件的结束符,访问到结束符表示该方法表的元素数是正确的,结束检查;否则说明该类组件的大小存在问题,则抛出异常,结束检查。其中,结束标识符为固定标识符或区分标识符。与现有技术相比,本发明具有如下优点:本发明在执行方法调用指令invokevirtual时,对类组件的检查过程防止访问越界,故提高了虚拟机解释器执行过程的安全性。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为本发明方法调用指令执行时对类组件的正确访问流程框图。图2为方法调用指令执行时对类组件的溢出访问流程框图。图3为CAP文件的概述图。图4为虚拟机解释器在执行CAP文件中的指令时检查类组件的流程框图。图5为第二阶段的检查流程框图。具体实施方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。为了有助于和澄清随后的实施例的描述,在对本发明的具体实施方式进行详细说明之前,对部分术语进行解释,下列的解释应用于本说明书以及权利要求书。本发明中出现的CAP文件是一连串的二进制字节码。其它英文词语均为代码,不代表其它任何意义。参照图1至图5,本发明公开一种JAVA智能卡访问越界的检测方法,其包括如下步骤:(S01)在将CAP文件安装到JAVA智能卡时,对CAP文件进行处理;其中,CAP文件包括多个组件,包括常量池组件、类组件和方法组件;(S02)在应用执行过程中,JAVA智能卡内的虚拟机解释器在执行CAP文件中的指令时,对CAP文件的类组件进行检查。其中,步骤(S01)中,CAP文件的处理方法包括:(1)在载入前,在CAP文件的每个组件后加上结束标识符,其中,结束标识符为固定标识符或区分标识符;(2)在安装过程中,每次载入CAP文件的其中一个组件后,由JAVA智能卡上的安装程序执行在该组件后加上结束标识符。本发明结束标识符的字节数和定义方式可以由开发者来决定,可以使固定的“0101”,也可以是将每个组件都区分开的标识符如常量池组件是“4350”,表示字母“C”和“P”的ASCII码。其中,步骤(S02)包括如下步骤:(S21)根据指令操作数定位到常量池数组,其中,指令操作数为链接到常量池组件的token值;(S22)在常量池数组中找到对应的项,获得被调用方法所在的类的引用和方法token,进而定位到类组件中确定的类以及方法表中的对应项;(S23)在类组件中,每个类的信息包括表示方法表数组大小的public_method_table_count以及表示方法表偏移基数的public_method_table_base,根据public_method_table_count和public_method_table_base两个数值,定位到数组的末尾;(S24)通过public_method_table_base+public_method_table_count*2+1直接访问到该数组的尾部,紧接着判断尾部的值,若访问到类组件的结束符,表示类组件结束,后面是方法组件,则该方法调用指令可以正确地获取到方法表中的偏移信息,此时结束检查;若访问到的不是类组件的结束符,则直接进入步骤(S25)第二阶段的检查;(S25)判断类组件中可能存在的其他数组,通过package_virtual_method_table、implemented_interface_info以及remote_interface_info的数组大小来定位到该组件的末尾,判断是否能访问到类组件的结束符,访问到结束符表示该方法表的元素数是正确的,否则说明该类组件的大小存在问题,则抛出异常。本发明public_method_table_base+public_method_table_count*2可以直接访问到该数组的尾部,乘以2的原因是方法表的每个元素占两个字节。其中,步骤(S25)包括如下步骤:(251)判断package_method_table_count来确定是否有该数组,若有,则定位到该数组的末尾;(252)判断interface_count,对接口数组进行判断和定位;(253)通过类组件bitfield中的ACC_ROMOTE判断该类是否有远程接口,若有,定位至远程接口的末尾,该远程接口的类型是remote_interface_info,该结构体的信息是由确定字节数组成的,因此可以直接获得其所占的字节数;(254)定位到类组件末尾,判断是否能访问到类组件的结束符,访问到结束符表示该方法表的元素数是正确的,结束检查;否则说明该类组件的大小存在问题,则抛出异常,结束检查。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页1 2 3 当前第1页1 2 3