一种基于中间语言分析的软件脆弱性测试方法技术

技术编号:7441969 阅读:305 留言:0更新日期:2012-06-16 19:01
本发明专利技术为一种基于中间语言分析的软件脆弱性测试方法,首先采用基于动态二进制插桩方法将程序执行中的上下文信息记录到trace文件中;其次对程序trace进行离线分析,顺次读取每一条指令,并将上下文信息保存到对应数据结构中,将指令机器码转换为中间语言表示;然后针对中间语言进行污点分析,通过分析中间语句,通过判断语句和源操作数类型,判定操作是否会引起污点传播;约束条件收集,基于上述中间语言分析,依据路径搜索策略对布尔方程进行变换,通过约束求解,得到各个路径对应输入值。本发明专利技术测试对象的运行平台即可以为PC或服务器,也可以为嵌入式系统。

【技术实现步骤摘要】

本专利技术涉及软件测试
,具体涉及到虚拟化技术、动态二进制插桩技术、中间语言分析技术、符号执行技术。
技术介绍
在软件生命周期中,软件测试是非常重要的一个环节,高效完备的测试是保证软件质量的重要手段。基于测试的粒度,软件测试可以分为系统测试、模块测试、策略级测试。 基于测试收集数据的类型,软件测试可以分为性能测试、功能测试、稳定性测试等。此外,根据测试过程是否依赖于程序内部结构,软件测试可以分为白盒测试、黑盒测试、灰盒测试。基于分层和抽象的原则,计算机系统在不同层面上实现虚拟化技术,以提供多个同构或异构的平台。在硬件、系统以及应用程序各个层次上,虚拟化提供很好的物理隔离和逻辑隔离,并提供细粒度的运行时信息,在程序分析领域有广泛的应用。动态二进制插桩是指在程序运行时,除了正常执行原始程序外,在相关位置插入执行其他代码,用于完成程序运行时信息收集、分析、优化等工作。根据是否对原始程序执行逻辑产生影响,插桩可以分为有损插桩和无损插桩。中间语言分析和优化在编译
有着广泛的应用。通过对程序源代码或机器指令进行翻译,转换为中间语言形式,导出某些隐含信息,从而方便程序的分析和优化。与实际执行不同,在符号执行中,程序的输入数据是一个符号,这个符号代表任何可能的输入,而不是局限某个特定的输入。程序在执行计算、拷贝、比较、分支跳转等语句时,都可以表达为对应的符号操作。符号执行在软件测试和程序证明中有着广泛的应用。
技术实现思路
在传统测试方法中,普遍存在着代码覆盖率较低、测试效率低下的缺陷,无法根据实际需求,对特定的代码路径进行高效测试。有鉴于此,本专利技术提供了,用于发现程序潜在的设计缺陷。该基于中间语言分析的软件脆弱性测试方法是这样实现的第一步运行目标测试程序,采用基于动态二进制插桩方法将程序执行中的上下文信息记录到trace文件中;其中上下文信息包括指令机器码、寄存器、访存数据。 第二步对程序trace进行离线分析,顺次读取每一条指令,并将上下文信息保存到对应数据结构中,将指令机器码转换为中间语言表示;其中中间语言包括7种基本操作,分别如下IRStmt_Mark 标记原始指令信息;临时变量向寄存器写数据IRStmt_ffrTmp 寄存器向临时变量写数据IRStmtJtore 临时变量向内存写数据IRStmt_Exit 退出中间语言某个代码块IRStmt_PutE 临时变量向寄存器写浮点数据空操作,无实际意义将中间语言分成3个层次,即超级块、语句、表达式;一个Trace映射多个超级块, 每个超级块包括多条语句,每条语句由多个表达式构成。第三步针对中间语言进行污点分析,包括污点标记和污点传播两个方面;污点标记通过分析Trace中的系统调用,将从外部设备读进内存的数据标记为污染源;污点传播通过分析中间语句,通过判断语句和源操作数类型,判定操作是否会引起污点传播;第四步约束条件收集程序发生分支跳转时,污点对分支条件的影响即为约束条件;在中间语言中,如果分支跳转语句的条件被污染,那么收集对应的约束条件;第五步基于上述中间语言分析,某一条路径对应多个约束条件PC,对各个约束条件进行逻辑合取,生成布尔方程F = PC1 η PC2 η…η PCn ;第六步依据路径搜索策略对布尔方程进行变换,不同的方程对应程序所走的不同路径,如果方程有解,则存在输入使程序走对应路径,否则该路径不可达;第七步通过约束求解,得到各个路径对应输入值,基于输入模板,通过在相关位置上修改数据,生成新的测试用例,驱动程序继续执行。本专利技术的有益效果为基于中间语言进行测试用例的自动化生成,使得在测试过程中,污点分析和符号执行的对象不再局限于某一个固定指令集,而是支持包括x86、arm等多种体系架构。因此, 基于中间语言进行自动化测试,测试对象的运行平台即可以为PC或服务器,也可以为嵌入式系统。附图说明图1为基于中间语言进行自动化测试的系统框架;图2为中间语言的翻译机制;图3为中间语言的内部操作机制。具体实施方式 下面结合附图对本专利技术作进一步介绍。图1为基于中间语言进行自动化测试的系统框架。系统分模拟器和离线分析模块两大部分,前者主要完成对目标程序运行时信息的捕获,后者主要完成测试用例的自动化生成。图2为中间语言的翻译机制。中间语言分析模块将每一条机器指令翻译成等价的中间代码,并对中间代码解释执行。在解释过程中,维护程序的上下文信息,并进行污点传播分析。图3为中间语言的内部操作机制。中间语言内部维护三个对象,即寄存器、临时变量以及内存数据,其中临时变量是对象之间传递数据的媒介,任何数据操作必须通过对中间变量的读写来实现。一、收集目标程序运行时信息1、虚拟机启动操作系统启动操作系统。测试目标可以是运行在PC平台下的 Windows程序,也可以是运行在嵌入式平台下的Linux程序。模拟器根据目标程序所在的硬件平台和软件平台的不同,加载对应的配置,并启动操作系统。2、启动二进制插桩工具二进制插桩工具用于在二进制级别对目标进程进行追踪和监控。记录程序的运行时信息,用于后续的进一步分析。运行时信息,具体包括程序指令的机器码、寄存器数据、内存读写数据、线程信息、加载的模块信息等。3、初始化目标程序命令行或图形界面启动目标程序,根据程序的输入类型(网络报文、磁盘文件或终端输入),向程序输入初始数据,驱动程序执行,并收集目标程序运行时上下文信息。如图1所示,系统框架左半部分是模拟器部分,用于加载操作系统和测试对象。以上三个部分,完成程序运行时上下文信息的收集,并将对应数据转储到Trace 文件中。二、中间语言分析1、指令回放=Trace文件记录程序运行时的指令上下文信息,包括指令机器码、寄存器、访存数据等。如图1所示,离线分析模块顺次读取每一条指令,并将上下文信息保存到对应数据结构中。2、中间语言分析在PC、服务器以及嵌入式平台存在各种各样的指令集,包括 x86, ppc, spare, arm等。各种指令集在语法和语义上存在着很大差异,加之指令集本身存在隐含信息,使得指令分析存在较大困难。如图3所示,本专利技术设计三种变量,即寄存器,中间变量,内存变量。三种变量顺次编号,并依次映射对应资源。为了将原指令集操作进行等价转换,中间语言引入7种基本操作,分别如下IRStmt_Mark 标记原始指令信息(机器码,内存地址)临时变量向寄存器写数据IRStmt_ffrTmp 寄存器(临时变量、内存)向临时变量写数据IRStmtJtore 临时变量向内存写数据IRStmt_Exit 退出中间语言某个代码块IRStmt_PutE 临时变量向寄存器写浮点数据II tmt_Nop 空操作,无实际意义同时,本方案将中间语言分成3个层次,即超级块(SuperBlock)、语句(IRStmt)、 表达式(IRExpr),并维护一个中间语言上下文。一个原始的Trace可以映射多个超级块,每个超级块包括多条语句,每条语句又有多个表达式构成。分层设计和实现,便于中间语言根据需求,在各个层次上进行分析和优化。3、污点分析及约束条件收集针对中间语言进行污点分析,包括污点标记和污点传播两个方面。污点标记主要是通过分析Trace中某些系统调用(如读取文件数据、接受网络报文),将某些内存区域或寄存器标记为污本文档来自技高网...

【技术保护点】

【技术特征摘要】

【专利技术属性】
技术研发人员:郭世泽赵静吴志勇牛伟陈哲陈渝肖奇学曹鼎杨威王啸天赵建芝房珊瑶施凡
申请(专利权)人:中国人民解放军总参谋部第五十四研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1
相关领域技术