关键词:
Java
漏洞检测
漏洞诊断
确定性重现
符号化执行
静态分析
污染分析
并发错误
信息泄露
摘要:
Java语言已经成为了近几年最为重要的编程语言之一,根据权威开发语言排行榜TIOBE的统计,从2002年至今的10年内,Java语言市场占有率始终处于所有开发语言的前两位。近年来,随着安卓系统的普及以及安卓平台将Java作为其程序设计语言,Java语言不论在移动终端还是在个人电脑、服务器平台上都已经占据了不小的份额。如今,毫无疑问Java语言影响着信息产业的方方面面。
与此同时,随着Java语言及其支撑平台的飞速发展,Java程序员和Java应用的数目也在飞速增长之中。以安卓平台为例,目前安卓官方市场上的应用数目已经超过了50万个,并且.这个数量仍然在以平均每个月2万个的速度飞速膨胀。迅速增长的Java应用数量给Java程序的管理和维护带来了挑战。Java代码中的程序漏洞(包括程序功能性漏洞,或称程序错误,以及程序安全性漏洞)每年都会给应用的使用者造成巨大损失,因此检测、诊断与排除Java代码中潜在的程序漏洞是Java应用的一个主要需求。
程序漏洞检测和诊断几十年来一直是软件研究领域的关键问题。近年来随着多核架构和智能移动终端的普及,程序漏洞检测和诊断的研究逐渐集中在以下两个方面:(1)多核架构下的并发错误研究,致力于检测、诊断和排除由于程序并行化带来的并发错误。例如,通过记录并发程序运行时的不确定,并促使该程序在随后的运行过程中确定的重现某一并发错误,进而减少定位对应程序漏洞的难度。(2)智能终端上的漏洞检测和诊断研究,力图对智能终端应用中的各种程序漏洞进行检测和诊断。包括检测并诊断应用中可能发生的功能性及安全性漏洞。例如,采用符号化执行方式遍历应用程序执行路径,通过分析程序行为检测程序漏洞,并生成对应程序输入以简化诊断过程;通过对程序进行污染分析,可以检测其中可能存在的信息泄露等安全漏洞。由于智能终端上的应用通常采用应用市场集中发布的模式,同时每个应用市场每月都有数以万计的应用进入,因此对此类应用进行审核不仅对程序分析速度要求较高,而且还需要提供完备的验证机制,为高效地去除可能具有安全漏洞的应用提供佐证。这两个方面研究的对象恰好也是Java程序目前所面临的主要问题。
然而,当相关研究成果被应用到Java语言上时,现有研究多从程序漏洞本身模式出发,通过借用适用i其他语言的类似漏调整检测与诊断方法,进行对Java程序漏洞的检测。但是,Java语言的许多特性,如面向对象、托管执行和运行时事件,使得其不同于以往的过程式语言和本地语言运行模式。简单的将其他语言的已有经验应用于对Java程序的漏洞检测与诊断效果并不理想。比如,由于Java托管运行时通过垃圾回收机制管理程序内存使用,在Java程序运行时,其数据移动较C/C++等本地语言程序多,因此当确定性重现系统被应用到Java程序时,受大量的数据移动影响,重现系统的记录和重现开销巨大,从而极大地限制了重现系统的性能。另外,移动终端中Java应用通常采用事件驱动的运行模型,该模型下的程序运行具有较大的随机性和不确定性。一些继承自传统漏洞检测与诊断手段的研究,例如针对Java应用的符号化执行,往往需要牺牲其检测与诊断精度才能确保该过程的顺利完成。
本文在充分分析现有程序漏洞检测和诊断方法作用于Java应用时的性能和效率等问题的基础上,提出了一个系统的解决方案。从移动终端、桌面应用和服务器等角度,着力于提高程序设计者以及应用程序市场对Java应用的漏洞检测与诊断能力。本文提出的三个新技术,即基于对象的确定性重现,导向性符号化执行,与采用符号化执行的信息泄露漏洞检测与诊断技术,充分弥补了程序漏洞检测与诊断技术在Java语言等动态语言上的不足。相对于之前的研究,本研究借助于对Java语言本身语言模型与运行模型的深入了解,从Java语言模型本身出发设计适合该语言的漏洞检测与诊断技术,测试表明使该技术在作用于Java应用时达到远优于已有技术的性能和效果。
具体而言,本文的主要贡献如下:
1.首次提出了基于对象的确定性重现技术,设计并实现了ORDER系统以完成对多线程Java应用的确定性重现。ORDER系统利用Java程序多以对象作为基本逻辑单元的特性,结合Java虚拟机对内存中对象的管理机制,提出以对象为粒度的确定性重现技术。该系统的性能是所有已知同类系统中最好的,在保证重现系统确定性的前提下,该系统记录阶段的开销仅为114%。此外,通过将重现系统的记录和重现实现于Java虚拟机中,ORDER系统不仅能重现现有系统可以重现的程序错误,还能够重现已有系统不能重现的错误,如由外部代码中的程序漏洞造成的错误。这也就意味着ORDER能够被用于诊断更多的程序漏洞。
2.首次提出导向性符号化执行方法,致力于提高符号化执行技术在应用于安卓应用时的运行效率,为利用符号化执