Java语言的程序漏洞检测与诊断技术应用研究
2017-08-07内蒙古能源发电投资集团有限公司电力工程技术研究院
■文/内蒙古能源发电投资集团有限公司电力工程技术研究院 鲍 静
Java语言的程序漏洞检测与诊断技术应用研究
■文/内蒙古能源发电投资集团有限公司电力工程技术研究院 鲍 静
Java语言是安卓平台的程序设计语言,随着安卓系统的普及,Java语言在移动终端占据的份额越来越大,由此促使Java语言得到快速的发展,与此同时,Java程序的管理和维护难度也逐渐增加。Java语言中存在的程序漏洞为用户带来非常大的威胁,检测与诊断是有效排除程序漏洞的手段,从而保证用户的使用安全。本文重点研究了Java语言的程序漏洞检测与诊断技术应用。
Java语言 程序漏洞 检测 诊断
Java语言是一种编程语言,以C、C++语言为基础,具备C、C++语言的多数优点,同时,对其中存在的含混部分进行了改良,促使Java语言应有独特的特点。目前,在PC软件、手机软件中应有的比较广泛。但Java语言中存在程序功能性漏洞、程序安全性漏洞,影响用户的使用,因此,在应用Java语言的过程中,还需利用检测与诊断技术排除潜在的程序漏洞,保证开发出来的程序满足用户要求的同时,具有比较高的安全性。
一、确定性重现程序漏洞诊断技术
程序员在编写程序时,高效并发程序的编写一直是一个难题,主要原因的并发程序运行时,存在不确定性,称之为并发错误[1]。并发错误的诊断难度比较大,程序的输入和运行环境以及线程交叉访问同一内存单元的顺序均可决定并发错误发生与否。并发错误发生后,数据会出现丢失,甚至导致系统崩溃。确定性重现系统可有效地解决并发错误的问题,因此,Java语言在进行程序漏洞诊断时,可利用此系统检测并发错误。
(一)确定性重现设计
Java语言具有垃圾回收的功能,在Java虚拟机中,垃圾回收属于一件不确定性事件,因此,确定性重现系统会受此功能的影响,基于此,在进行确定性重现设计时,以对象为中心,记录和重现Java并发程序。在多线程程序中,并发数据访问属于不确定事件,会导致程序错误,Java程序通常会将数据组织起来形成对象。ORDER在进行记录时,有冲突的数据访问对和对象的访问时序信息为记录内容,在当前线程访问次数中,数据访问在信息的指导下进行重现。在对对象的访问时序信息记录时,将对象标识符、访问线程标识符、对象锁以及读写标志添加到对象头部结构中[2]。并发Java程序运行时,时间轴信息的记录由ORDER的记录模式进行,首先延续上个时间片,当时间发生变化时,新的时间片开启,记录完成之后,时间轴终止。当出现当前时间片未结束、当前时间片结束,切换时间片、挂起线程重新获得访问权情况时,ORDER模式将重现日志中的记录信息,从而将Java程序访问共享对象的顺序重现出来。随后,将Java虚拟机中的其他不确定事件记录下来,时间轴记录优化之后,完成确定性重现设计。
(二)在ORDER系统的实现
ORDER系统的构建以确定性重现设计为基础,设计完成之后,需要进行实现,以便于为确定性重现提供良好的支持。在实现过程中,首先要对Harmony编译流水线进行修改,Harmony在对方法的编译配置进行管理时,通过流水线的方式来进行,在流水线中,包含一系列的行为,每个行为代表会分析会优化方法,插装过程在记录和重现时,采用两个单独的行为来实现,当频繁的调用一个方法时,Harmony会对方法进行重新编译,并利用更激进的流水线来进行管理,自适应性编译选项的开启与否只会对Java应用程序的性能产生影响,错误可重现性并不会受到任何的影响,因此,在ORDER原型框架中,自适应性编译选项处于关闭的状态,编译程序时采用单个的流水线,通过常量折叠、不可达代码删除等优化措施,将实现过程的工程性开销减少[3];其次要在Harmony中记录垃圾回收事件,记录时,垃圾回收机制的活动并不被记录,而是对垃圾回收线程与Java线程之间交互的接口进行记录;最后是与Java虚拟机本地代码交互,在Harmony中,当处于函数调用点或特定的系统调用时,才能够激活可被阻塞状态,Java线程工作时,如果与记录的对象访问时间轴不符合时,该线程即会被阻塞,当超过一定的阈值之后,栈帧信息会被准备好,可阻塞状态打开,Java线程进入此状态后,别的线程可轻易的将其挂起。当Java线程恢复到与记录的时间轴相符合时,被阻塞状态停止,Java线程可正常运行。
二、符号化执行程序漏洞检测技术
现如今,人们越来越重视Java软件安全性与正确性的问题,因此,在计算机系统研究领域,如何检测Java中存在的程序漏洞成为研究的重点问题。符号化执行的搜索能力非常强大,由此促使其广泛的应用到软件的安全性与正确性检测方法中。
(一)导向性符号化执行技术
安卓运用过程中,存在输入空间爆炸问题,影响安卓的运用,为了解决这个问题,提出了导向性符号化执行技术。符号化执行时,需要应用“导引”信息,该信息采用静态分析的手段来进行提取,同时,在进行符号化执行的搜索时,同样需要此信息。以隐私泄露为例,分析导向性符号执行的原理。在导向性符号化执行的整体架构中,通过两个阶段来实现执行,首先是提取导引信息,以静态程序分析手段,通过数据流分析的方法,将与目标程序漏洞相关的程序语句提取出来,而这些从程序语句就属于导引信息,一是将事件的入口找出,以逆向遍历函数函数调用图的方式将关键路径中的入口序列提取出来,二是对上下文的信息进行提取,三是合并上下文敏感的状态,将事件序列中的冗余时间有效的合并,四是在状态机上寻找触发事件的最短路径,将需要重现的事件序列列出来,执行只需触发的事件[4];其次是使用导引信息引导符号化执行,导引信息提取完成之后,需要限定目标程序的搜索空间,在状态迁移信息和图形界面信息的基础上,重现出已经提取的事件序列,符号化的执行包含两个步骤,一是指导程序状态迁移,程序状态改变之后,通过事先设置好的回调函数,对状态迁移事件进行处理,二是指导图形界面事件,在上个步骤的基础上,将给定的程序状态重现,并将静态分析中的图像界面事件重现,从而将给定的关键程序路径覆盖。
(二)在Sym Droid系统的实现
在Soot程序分析框架、JPF-SE符号化执行框架的基础上,实现Sym Droid原型系统。静态分析过程中,事件触发顺序依据修改Soot分析工具进行有效提取,从而将函数调用图构建方法和指针分析方法提取出来,以便于完成导引信息的提取。在此之前,还对安卓程序的dex字节码进行转化,通过安卓程序反编译工具,转换为Java字节码,保证Soot分析的正确性[5]。在修改JPF-SE符号化执行框架的基础上,将导引信息的事件重现过程导入,经过处理之后进行符号化执行。在安卓系统中,采用的图形界面模型为单线程,通过此模型的特性,Sym Driod归结了图形界面线程与非图形界面线程,具体包含三种情况,一是当图形界面主线程生成子线程处理部分程序逻辑时,符号化的执行不再主线程中的进行,而是转移到子线程中,子线程终止或被挂起后,再次返回;二是图形界面线程接收到非图形界面线程的消息,并将此作为处理结果返回主线程时,这些消息将会被系统丢弃;三是非图形界面线程将会事件发送给图形界面线程,以便于返回执行界面时,所产生的信息将会被系统在全局的事件池中进行缓存。
三、导向性符号化执行的信息泄露检测诊断技术
随着智能终端系统的普及,人们越来越关注手机软件的安全漏洞问题。在手机软件存在的安全漏洞中,信息泄露对手机用户的危害最为严重,据相关的调查显示,超过半数的官方安卓市场软件存在不同程度的信息泄露问题。导向性符号化执行技术是信息泄露检测诊断中的有效手段,可良好的对存在的漏洞进行验证。
(一)在Leak Miner系统的实现
对于手机软件中潜在的信息泄露,Leak Miner系统可依据以下步骤对其程序进行检测:第一,预处理过程,在手机平台上,硬件资源比较有限,为了满足软件占据空间小的要求,在开发软件时,采用Java语言,但字节码的格式为dex,分析之前,首先将其转换为Java字节码,接着在进行分析,此外,还需要将权限申请信息在程序元信息中提取出来,获得权限列表[6];第二,构建函数调用图,在安装程序中,统一的程序入口并不具备,而是采用事件驱动模式,对此,将程序中可能的入口全部提取出来,通过额外的程序入口创建之后,连接所有程序入口及伪入口,变成统一的程序入口;第三,标记敏感信息,通过预设的系统接口,将系统的敏感信息读取出来;第四,敏感信息传播,针对获取的敏感信息,将其可能传播的路径采用静态分析方法分析出来,并将其上传到网络或是记录在本地日志中,用户在进行相应的操作时,给用户提示,预防信息泄露[7]。
(二)信息泄露检测方法
在安卓系统系统,包含的用户信息比较多,Leak Miner系统将手机的设备标识号、用户位置信息、手机号码、通讯录、短信及日历作为隐私信息[8]。针对这些隐私信息,将其泄露路径分析出来,运用的分析方法为函数调用图构建和指针分析,首先构建函数调用图,将安卓各组件代码输入之后,获取函数调用图,随后对变量指向关系进行分析,输入的信息为当前函数的语句集合,经过相应的处理之后,函数变量之间的指向关系就可以有效的分析出来,分析完成后,生成函数的索引信息。接着利用程序切片和敏感信息传播将信息泄露的路径寻找出来,最后对信息泄露路径进行有效地处理。
结论:现如今,Java语言在安卓平台及服务器端的应用越来越广泛,在应用Java语言的过程中,由于程序漏洞的存在,导致安全性受到比较大的影响,现有的检测和诊断方法还存在一定的缺点,经过确定性重现技术、符号化执行技术解决之后,可以有效地避免这些缺点,提升检测和诊断的正确性,从而有效地保证基于Java语言的软件开发具有良好的安全性,避免给用户造成巨大的损失。
[1]孙鹏.基于计算机软件开发的JAVA编程语言分析[J].电子制作,2015,(10):94.
[2]陈伟,黄翔,乔晓强等.软件配置错误诊断与修复技术研究[J].软件学报,2015,(06):1285-1305.
[3]罗琴灵,蒋朝惠.多策略软件代码缺陷检测方法研究[J].贵州大学学报(自然科学版),2015,(03):113-118.
[4]练坤梅,许静,田伟等.SQL注入漏洞多等级检测方法研究[J].计算机科学与探索,2011,(05):474-480.
[5]傅卓军,龙陈锋.网络安全漏洞检测软件的设计与实现[J].计算机与数字工程,2011,(07):117-119+192.
[6]孙浩,李会朋,曾庆凯.基于信息流的整数漏洞插装和验证[J].软件学报,2013,(12):2767-2781.
[7]王一岚,郭嵩.基于静态分析的Java源代码后门检测技术研究[J].信息网络安全,2012,(07):43-45.
[8]李正明.java技术在设备远程监测诊断系统的应用研究[J].科技创新与应用,2012,(32):64.