《电子技术应用》

Java卡虚拟机的安全攻击技术及防御技术研究

2017年电子技术应用第10期 作者:崔炳荣1,2,刘 亮1,2,甘 杰1,2,张海峰1,陈 雷1,2,尹国龙3
2017/10/25 13:43:00

崔炳荣1,2,刘  亮1,2,甘  杰1,2,张海峰1,陈  雷1,2,尹国龙3

(1.北京智芯微电子科技有限公司,国家电网公司重点实验室电力芯片设计分析实验室,北京100192;

2.北京智芯微电子科技有限公司,北京市电力高可靠性集成电路设计工程技术研究中心,北京100192;

3.国网宁夏电力公司电力科学研究院,宁夏 银川750002)


    摘  要: Java卡是一个基于Java的智能卡操作系统,Java卡能够动态更新。着重介绍了在Java卡系统实现过程中需要关注的各种基于Java卡虚拟机的安全点,研究了Java卡虚拟机运行过程中的脆弱性,总结了其在安全方面面临的各种威胁,并进一步研究了这些安全威胁可能产生的影响。最后针对可能出现的不同的安全攻击,提出并完成了相应的安全防御措施。实验证明,这些防御措施能够有效地保障Java卡系统的安全性。

    关键词: Java卡;虚拟机;攻击;防御

    中图分类号: TN409

    文献标识码: 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卡多应用软件平台的需求在近几年变得日益迫切,多应用软件平台支持产品发行后还可以后下载应用,所以Java卡技术在给使用者带来开放式便利性的同时,也带来了极大的安全风险。针对智能卡嵌入式软件安全技术的研究,已经成为智能卡行业近两年的热点。北京智芯微电子科技有限公司的Java卡团队在Java卡软件平台的安全攻击及防御方面做了很多工作,本文主要介绍其基于Java卡虚拟机的安全攻击及防御技术方面的研究成果。

1 Java卡软件平台简介

    Java卡软件平台是智能卡嵌入式软件的发展趋势。目前金融卡及部分其他行业卡片都已经要求是平台卡,电信行业先前已有成熟的Java平台卡发行。基于移动支付的卡片已经明确规定是多应用的平台卡,而Java平台卡是智能卡平台卡的绝对主流。

    Java卡系统架构如图1所示。

dldz2-t1.gif

    Java卡产品应用于金融以及移动支付领域,其安全性是不容忽视的,需要很高的安全保障才可以进入市场。如图2所示,Java卡平台需要达到31分以上才可获得EMVco的平台安全证书(参考Brightsight机构的数据)。

dldz2-t2.gif

    Java卡虚拟机是Java卡软件平台的引擎,在整个平台中起着核心的作用,其实现了一个软CPU,用于解释执行Java卡代码(包括Java卡平台的系统代码以及Java卡应用代码),它维护下面一些主要的系统资源:

    (1)PC:程序地址指针;

    (2)栈:用于维护Java卡应用执行时的方法调用现场;

    (3)寄存器:用于维护栈帧结构的寄存器变量;

    (4)字节码解释器:解析应用代码编译出的目标字节码。

    通过攻击以上资源,攻击者可以破坏Java卡虚拟机,获取到一些卡片敏感数据,甚至可以控制代码流程非法跳转到攻击者的恶意代码进行执行。

2 Java卡虚拟机的安全攻击研究

2.1 针对虚拟机的攻击技术研究

    Java卡软件平台是否安全,其重点在于:

    (1)黑客是不是能随意安装应用程序;

    (2)虚拟机如何抵御恶意代码;

    (3)如何抵御旁路攻击;

    (4)如何抵御程序执行流程和数据被恶意干扰;

    (5)平台是否遵守硬件的安全要求。

    对于以上第(1)种攻击可以通过GP(GlobalPlatform)技术中的安全通道等方式进行防御;对于第(5)种,软件平台会依赖芯片平台的安全保障。而对于其余的(2)、(3)、(4)种,Java卡虚拟机本身需要具备很强的防攻击能力,承担重要的安全防御角色。

    研究发现,针对Java卡软件平台较为有效的攻击方式有以下几种。

    (1)混淆数据类型攻击

    Java卡支持byte、short、int和 reference(对象)数据,这些数据在卡片上的物理存储方式一致。攻击者可以使用不同类型数组对象之间的混淆访问、简单对象和数组对象之间的混淆访问、基本类型数据和对象数据之间的混淆访问、伪造对象、对象域作为数组成员等方式进行攻击。其目的在于迷惑虚拟机读取越界数据给卡外,从而造成严重的信息泄露。

    (2)操作数栈攻击

    在Java卡中栈是方法运行的基础,栈中保存了调用方法的现场信息,也为被调用方法提供了运行时的操作空间。对当前方法操作数栈进行攻击(比如通过持续压栈或其他方式突破栈帧边界),进而改变方法栈边界外的数据就能破坏掉整个系统的有序运行状态,攻击者可以通过这种方式修改PC指针,使程序跳转到恶意代码地址进行执行,也可以改变方法对栈空间资源的占用情况导致其他不可预期的错误。攻击者通过上述方法能有效提升非法获取信息的可能性。

    (3)局部变量攻击

    局部变量存在于方法栈中,针对局部变量的攻击手段有许多种,产生的效果也不尽相同。比如可以对cap文件中对应方法的局部变量大小信息进行修改,达到突破局部变量边界,造成数据和代码混乱的目的;也可以针对局部变量的读写进行非法操作(比如将short数据当作对象数据读取使用),以达到非法数据访问的目的。

    (4)字节码篡改攻击

    字节码执行流程如图3所示。

dldz2-t3.gif

    通过激光攻击等手段更改数据总线上读出的字节码,按照图3所示使得虚拟机跳转到错误字节码解释执行,导致不可预知的后果。

    借助标准的JCDK工具,手动修改字节码也可以达到激光攻击同样的效果。人工修改的方式可以控制攻击的预期效果,比激光攻击更加有效和可控,危害性更高。

2.2 虚拟机的攻击方式

    目前主流的攻击方式为准备一个CAP,采用以下方式:(1)数据类型混淆;(2)破坏虚拟机栈帧结构;(3)破坏虚拟机解释执行流程。

    对CAP进行篡改,以自定义方法或者Java Card平台标准API方法为切入点,对卡片进行安全攻击。另外还可以采用激光篡改卡片内部数据的攻击方式。

2.2.1 混合攻击示例

    首先编写源文件,然后对源文件目标文件即CAP文件里的字节码进行恶意修改,将其修改为CAP’,然后下载到Java卡软件平台上执行,从而达到攻击目的。

    源文件如下:

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修改为其他两字节的任意数值(通常会从0x0000遍历到0xFFFF),然后重新生成新的攻击CAP′文件,下载到Java卡软件平台上选择并执行。CAP文件中方法信息存在于方法组件中,方法组件信息如图4所示。

dldz2-t4.gif

    图4中出现的字段信息如下:

    (1)tag:虚拟机规范中定义的方法组件的标识,值为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:方法内容对应的字节码

2.2.3 测试结果

    图4中method_header_info前两个字代表了方法的操作数栈的大小、参数的个数和局部变量的个数。篡改此数据使其从0000-ffff遍历,期望卡返回数据为0x0102,或者抛出异常。安全的Java卡软件平台不会返回其他任何数据。如果虚拟机不够安全,执行过程中可能会抛出各种数据。

3 Java卡虚拟机的安全防御技术研究及实现

    根据上面章节的分析明确了Java卡虚拟机内核被攻击的重点所在。接着从以下几个方面来阐述如何对Java卡虚拟机进行安全防护。

3.1 栈帧保护

    (1)操作数栈完整性检查

    在方法调用时记录操作数栈基于栈底的偏移位置,作为现场信息的一部分记录在帧头中,在方法返回时从帧头信息中读取出来并和SP(栈当前位置指针)进行比对,两值应该相等。如果不等,说明栈帧的出入数据不对应,表明是操作数栈受到了恶意攻击。

    (2)操作数栈边界检查

    在进行操作数的出入栈操作时,检查其访问到的地址边界是否超出操作数栈的边界,超出则表示异常发生。

    (3)参数和局部变量边界检查

    在方法执行过程中对于参数和局部变量的访问应该符合方法头中对于其个数的限定,并保障其地址范围在此方法栈的起始位置和操作数栈之间(不同的栈结构设计可能有不同的限制条件)。

    (4)方法栈的参数准确性检查

    方法的最大栈使用情况和局部变量数据都是方法运行时数据,对于这两个值的修改不会影响方法的正常执行。但是参数是先于方法执行被压入栈中的,如果方法头中参数个数被修改,方法运行过程中的安全机制会进行相关防护。比如参数个数被改小,那么正常的参数访问就可能被参数边界检查判错;如果参数改大,会导致方法出栈时上一个方法的执行环境被修改从而产生连锁的防御反应。

    以上所有防护在产生问题的时候软件平台都会认为受到了恶意攻击,应该报错并采取进一步的防御措施,如安全审计、卡片静默等。

3.2 字节码保护

3.2.1 运行时类型检查

    (1)byte/short/int/reference类型数组检查

    规范中定义的数组类型分别为byte数组、short数组、int数组和reference型数组,数组对象在字节码层面的访问入口为读指令BALOAD、SALOAD、IALOAD、AALOAD和写指令BASTORE、SASTORE、IASTORE、AASTORE。软件平台通过对象数据结构的设计可以记录当前数组对象的具体类型,进而在字节码指令访问时进行对应性检查来屏蔽掉不合法的数组对象访问。

    (2)简单对象/数组对象混淆检查

    与数组类型检查类似,简单对象和数组对象也可以通过对象数据结构中的相应标识来进行区分。在访问简单对象的字节码指令中应该进行判断保证此对象非数组对象,反之亦然。

    (3)对象/基本数据类型(byte/short/int)混淆检查

    对于这种混淆检查需要设计一种新的防护方式:添加一个类型栈。此栈记录操作数栈中数据的类型。执行字节码指令时按照此指令对操作数类型的要求,结合类型栈的记录进行一致性判断。这样就保证了栈数据访问的一致性。

3.2.2 对象/数组/静态域逻辑边界检查    

    Java卡虚拟机在访问数组时需要做数组边界的运行时检查;对象管理数据结构中应记录相应的size(针对域和方法),防止攻击者访问到非法空间;静态域的读写访问时检查当前访问的包的静态域边界。

3.2.3 防篡改检查

    为了防止错误注入攻击,可适当添加关键数据的冗余校验机制,保证程序运行流程不受攻击干扰。

    以上所有检查在发现错误时都表示系统异常,应采取相应的安全措施。

3.3 特殊数据保护

    在Java Card规范中定义了全局对象和入口点对象,这些对象的访问不受防火墙控制,同时也没有外部接口供应用创建。Java Card平台自身不受限制,可以使用私有方式创建一些全局对象或者入口点对象来承载特殊的使命(如内部的快速访问等)。为了保证这些数据不被非法访问,需要添加对应的防护手段。APDU数组作为全局对象不仅负责命令数据的传输,在标准外部接口中还被当做返回数据缓冲区使用,这些数据具有一定的敏感性以防止被非法窃取,需要在使用后及时清理。

3.4 执行流程保护

    针对此攻击可以采取在下载器中进行方法跳转指令的越界判断,如果有越界情况发生,则不允许外部下载。另外为了防止执行时的字节码流程跑飞,也可以在下载时记录方法边界,在字节码执行时进行越界判断。此实现机制稍微复杂一些,会增加下载器的处理复杂度以及影响执行时的性能。

3.5 虚拟机系统关键数据的保护

    虚拟机中的关键系统变量可以进行备份处理,在相应的流程节点上进行比对,这样可以防止关键数据被恶意篡改;也可以结合有安全功能的Java芯片提供的保护机制,进行软硬件的联合防护,以达到关键系统变量不能被恶意代码随意更改的目的。

4 测试结果及结论

    北京智芯微电子科技有限公司针对Java卡虚拟机安全攻击的研究成果,设计开发了具有自主知识产权的安全攻击用例库,包含如下几个方面:API攻击、边界攻击、执行流程攻击、局部变量攻击、操作数栈攻击、参数攻击、共享接口攻击、特殊数据访问攻击、事务机制攻击、类型混淆攻击和防火墙攻击。脚本示意如图5所示。

dldz2-t5.gif

    北京智芯微电子科技有限公司自研的Java卡软件平台通过了自研安全攻击平台的攻击测试。此外通过了金融卡检测中心(BCTC)的安全攻击测试。金融卡检测中心的嵌入式软件安全攻击测试被公认是目前国内攻击水平最高的第三方测试。事实证明,北京智芯微电子科技有限公司的安全攻击技术及防御技术研究是卓有成效的。

    安全领域的攻与防是个永恒的话题,北京智芯微电子科技有限公司以后还会沿着这条路继续前进,加强自研能力,跟进国际最新的攻击技术和防御技术,持续提升安全技术水平。

参考文献

[1] 邓赟,周道双,李宇.基于智能卡的COS安全设计与实现[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相关安全性分析与优化[D].广州:广东工业大学,2014.

[7] 孙立元.基于漏洞攻击的Java卡安全性分析[J].计算机光盘软件与应用,2013(5):212-214.

继续阅读>>