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

文档序号:6439230阅读:179来源:国知局
专利名称:一种基于中间语言分析的软件脆弱性测试方法
技术领域
本发明涉及软件测试技术领域,具体涉及到虚拟化技术、动态二进制插桩技术、中间语言分析技术、符号执行技术。
背景技术
在软件生命周期中,软件测试是非常重要的一个环节,高效完备的测试是保证软件质量的重要手段。基于测试的粒度,软件测试可以分为系统测试、模块测试、策略级测试。 基于测试收集数据的类型,软件测试可以分为性能测试、功能测试、稳定性测试等。此外,根据测试过程是否依赖于程序内部结构,软件测试可以分为白盒测试、黑盒测试、灰盒测试。
基于分层和抽象的原则,计算机系统在不同层面上实现虚拟化技术,以提供多个同构或异构的平台。在硬件、系统以及应用程序各个层次上,虚拟化提供很好的物理隔离和逻辑隔离,并提供细粒度的运行时信息,在程序分析领域有广泛的应用。
动态二进制插桩是指在程序运行时,除了正常执行原始程序外,在相关位置插入执行其他代码,用于完成程序运行时信息收集、分析、优化等工作。根据是否对原始程序执行逻辑产生影响,插桩可以分为有损插桩和无损插桩。
中间语言分析和优化在编译技术领域有着广泛的应用。通过对程序源代码或机器指令进行翻译,转换为中间语言形式,导出某些隐含信息,从而方便程序的分析和优化。
与实际执行不同,在符号执行中,程序的输入数据是一个符号,这个符号代表任何可能的输入,而不是局限某个特定的输入。程序在执行计算、拷贝、比较、分支跳转等语句时,都可以表达为对应的符号操作。符号执行在软件测试和程序证明中有着广泛的应用。发明内容
在传统测试方法中,普遍存在着代码覆盖率较低、测试效率低下的缺陷,无法根据实际需求,对特定的代码路径进行高效测试。有鉴于此,本发明提供了一种基于中间语言分析的软件脆弱性测试方法,用于发现程序潜在的设计缺陷。
该基于中间语言分析的软件脆弱性测试方法是这样实现的
第一步运行目标测试程序,采用基于动态二进制插桩方法将程序执行中的上下文信息记录到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中某些系统调用(如读取文件数据、接受网络报文),将某些内存区域或寄存器标记为污染源。污点传播主要是通过分析中间语句, 根据语句类型来判断是否引起污点传播。例如,^Mmt Dest, Src;如果Src变量已被污染,并且中间语句能够引起数据传播,那么Dest变量亦会被污染。在本方案设计的中间语言中,可能引起污点传播的有II tmt_Put,IRStmt_ffrTmp, IRStmt_Store三种类型语句。程序在执行过程中,会通过系统调用(read、receive等)从磁盘或网络中读取数据,并放入内存。这些读进内存的数据,即可认定程序的初始输入,通过将这些从外部设备读进内存的数据标记为污染源,即可以开始监控输入数据对程序状态的影响。在中间语言中,赋值、计算、条件判断等操作会引起值的直接或间接传播,通过判断语句和源操作数类型,判定操作是否会引起污点传播。
约束条件收集程序发生分支跳转时,污点对分支条件的影响即为约束条件。在中间语言中,如果分支跳转语句的条件被污染,那么需要收集对应的约束条件。约束条件是一个布尔表达式,例如下面语句。
If (REG (0)eq 0) THEN
IRStmt ;
ELSE
IRStmt ;
如果REG(O)被污染,那么此分支的约束条件即为PC = REG(O)eq 0。
三、程序路径探测及测试用例生成
1、程序路径探测基于上述中间语言分析,某一条路径对应多个约束条件(PC), 对各个约束条件进行逻辑合取,生成布尔方程F。路径搜索包括深度优先、宽度优先等策略。 依据具体的搜索策略,本方案对布尔方程采用不同的变换策略。例如基于深度优先,对方程 F = PC1 η PC2 η…η PCn可以生成η个新的方程,如下所示。
Fn = PC1 η PC2 η …η "pen
Flri = PC1 η PC2 η …η "PClri
.........
F2 = PC1 η "PC2
F1 = "PC1
通过对方程η个条件逐个取反,生成η个新的布尔方程,这η个布尔方程分别对应着η个不同的程序路径。
依据路径搜索策略,对布尔方程进行变换,不同的方程对应程序所走的不同路径。 如果方程有解,则存在输入使程序走对应路径,否则该路径不可达。
2、测试用例生成通过符号执行和约束求解,路径探测空间探测模块会得到各个路径对应输入值。基于输入模板,通过在相关位置上修改数据,生成新的测试用例,驱动程序继续执行。布尔方程是否有解,是通过求解器来验证的。如果某个布尔方程存在解,则求解器会返回方程的某个输入值,否则求解器会告知无解。由于不同的布尔方程对应不同的程序路径,所以方程解即对应路径的输入。
权利要求
1.基于中间语言分析的软件脆弱性测试方法,其特征在于,包括以下步骤第一步运行目标测试程序,采用基于动态二进制插桩方法将程序执行中的上下文信息记录到trace文件中;第二步对程序trace进行离线分析,顺次读取每一条指令,并将上下文信息保存到对应数据结构中,将指令机器码转换为中间语言表示;第三步针对中间语言进行污点分析,包括污点标记和污点传播两个方面;污点标记通过分析Trace中的系统调用,将从外部设备读进内存的数据标记为污染源;污点传播通过分析中间语句,通过判断语句和源操作数类型,判定操作是否会引起污点传播;第四步约束条件收集程序发生分支跳转时,污点对分支条件的影响即为约束条件; 在中间语言中,如果分支跳转语句的条件被污染,那么收集对应的约束条件;第五步基于上述中间语言分析,某一条路径对应多个约束条件PC,对各个约束条件进行逻辑合取,生成布尔方程F = PC1 η PC2 η…η PCn ;第六步依据路径搜索策略对布尔方程进行变换,不同的方程对应程序所走的不同路径,如果方程有解,则存在输入使程序走对应路径,否则该路径不可达;第七步通过约束求解,得到各个路径对应输入值,基于输入模板,通过在相关位置上修改数据,生成新的测试用例,驱动程序继续执行。
2.如权利要求1所述的基于中间语言分析的软件脆弱性测试方法,其特征在于,其中上下文信息包括指令机器码、寄存器、访存数据。
3.如权利要求1或2所述的基于中间语言分析的软件脆弱性测试方法,其特征在于,其中中间语言包括7种基本操作,分别如下IRStmt_Mark 标记原始指令信息; IRStmt_Put 临时变量向寄存器写数据 IRStmt_ffrTmp 寄存器向临时变量写数据 IRStmt_Store 临时变量向内存写数据 IRStmt_Exit 退出中间语言某个代码块 IRStmt_PutE 临时变量向寄存器写浮点数据 IRStmt_Nop 空操作,无实际意义将中间语言分成3个层次,即超级块、语句、表达式;一个Trace映射多个超级块,每个超级块包括多条语句,每条语句由多个表达式构成。
全文摘要
本发明为一种基于中间语言分析的软件脆弱性测试方法,首先采用基于动态二进制插桩方法将程序执行中的上下文信息记录到trace文件中;其次对程序trace进行离线分析,顺次读取每一条指令,并将上下文信息保存到对应数据结构中,将指令机器码转换为中间语言表示;然后针对中间语言进行污点分析,通过分析中间语句,通过判断语句和源操作数类型,判定操作是否会引起污点传播;约束条件收集,基于上述中间语言分析,依据路径搜索策略对布尔方程进行变换,通过约束求解,得到各个路径对应输入值。本发明测试对象的运行平台即可以为PC或服务器,也可以为嵌入式系统。
文档编号G06F9/45GK102495795SQ20111038023
公开日2012年6月13日 申请日期2011年11月25日 优先权日2011年11月25日
发明者吴志勇, 房珊瑶, 施凡, 曹鼎, 杨威, 牛伟, 王啸天, 肖奇学, 赵建芝, 赵静, 郭世泽, 陈哲, 陈渝 申请人:中国人民解放军总参谋部第五十四研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1