一种基于中间语言和污点分析的软件数据流分析方法技术

技术编号:20329098 阅读:37 留言:0更新日期:2019-02-13 05:43
本发明专利技术公开了一种基于中间语言和污点分析的软件数据流分析方法,其步骤包括:步骤S1:定义指令格式和表达式格式;统一描述中间语言的通用指令类型,构建了临时变量表达式、寄存器表达式和污点标记表达式,用于污点分析过程中的数据表示;步骤S2:构建基于中间语言的污点传播规则,污点标记用taint_label表示;步骤S3:基于中间语言的程序数据流动态跟踪分析流程;步骤S4:当程序执行过程中,通过基于跟踪的污点信息来构建污点源与全局变量TG、局部变量TL、系统调用函数参数TF之间的数据流关系。本发明专利技术具有准确性更好、全面性更强、信息将更加丰富等优点。

【技术实现步骤摘要】
一种基于中间语言和污点分析的软件数据流分析方法
本专利技术主要涉及到基于污点分析的数据流分析方法,特指一种基于中间语言和污点分析的软件数据流分析方法。
技术介绍
污点分析技术是恶意代码检测、软件供应链安全、软件漏洞挖掘等方面的关键技术。基于污点分析能够对软件程序进行数据流分析,其主要过程包括输入数据的污点标记、污点传播跟踪、污点分析等。污点分析技术在具体应用方面,主要有如下类型:一是应用于标记输入数据,以通过污点跟踪的方法来发现污点数据的危险使用,这一类主要是应用于软件漏洞挖掘和恶意代码分析;二是利用污点分析方法来构建输入数据、关键检验点、路径约束和内部变量之间的关系,软件漏洞挖掘和供应链安全;三是建立起输入数据与内部系统函数调用的关系,从而推导出行为特征,这一类主要是应用于软件供应链安全和恶意代码分析。而软件数据流分析是污点分析具体应用的基础。然而目前污点分析技术在应用于软件数据流分析方面也存在一些不足,常用污点分析方法都是基于汇编语言设计污点传播规则的,虽然能够正确处理移位指令、算数指令、常数指令等指令类型,但是难以准确对跳转指令、比较指令等隐式地影响标记寄存器和影响控制流的指令建立污点传播规则。由于指令集的差异,也难以应用于跨指令集的软件分析应用中,比如跨指令集漏洞检索应用等。另外一个不足是,污点传播过程中,常见的污点分析方法只记录了污点源和污点标记,丢失了污点数据之间的操作关系等语义信息。从实际应用的角度来看,恶意代码的行为分析需要分析恶意代码的远程控制输入数据与内部系统调用之间的关系,来构建恶意行为模型;在基于模糊测试的软件漏洞挖掘过程中,需要基于软件数据流分析来挖掘输入数据与内部数据流之间的关系,需要细粒度的记录和跟踪内部变量之间的关系。现有的污点分析方法不能够满足这种细粒度、准确的软件数据流分析的需求。软件数据流的分析过程既需要准确全面的跟踪污点传播过程,也需要把握记录除污点源和污点标记以为的更多的丰富的信息。
技术实现思路
本专利技术要解决的技术问题就在于:针对现有技术存在的技术问题,本专利技术提供一种准确性更好、全面性更强、信息将更加丰富的基于中间语言和污点分析的软件数据流分析方法。为解决上述技术问题,本专利技术采用以下技术方案:一种基于中间语言和污点分析的软件数据流分析方法,其步骤包括:步骤S1:定义指令格式和表达式格式;统一描述中间语言的通用指令类型,构建了临时变量表达式、寄存器表达式和污点标记表达式,用于污点分析过程中的数据表示;步骤S2:构建基于中间语言的污点传播规则,污点标记用taint_label表示;步骤S3:基于中间语言的程序数据流动态跟踪分析流程;步骤S4:当程序执行过程中,通过基于跟踪的污点信息来构建污点源与全局变量TG、局部变量TL、系统调用函数参数TF之间的数据流关系。作为本专利技术的进一步改进:所述步骤S1包括为:S101:中间语言通用指令格式表示;算数指令和移位指令类:减法指令Sub、加法指令Add、逻辑右移指令Sar、逻辑左移指令Shl、或指令Or;内存访问类:内存读指令Load和内存写指令Store;寄存器操作类:写寄存器指令Put、读寄存器指令Get;比较类:比较指令Cmp;分支类:条件分支IF-THEN-ELSE指令;数据数据位宽转换类:16位转32位指令16Uto32、8位转32位指令8Uto32、1位转32位1Uto32、32位转1位指令32to1;用PC表示当前执行指令的地址;步骤S102:污点信息记录表达式格式表示;存储表达式记录表:用STOREREC表示,用于记录内存地址读写记录;栈底指针记录表:用BPREC表示,用于在使用栈式函数调用代码分析中保存栈底指针,辅助进行函数调用过程中的传入参数和调用者接收参数的判定;BPREC是栈式结构,Peek表示取栈上的最后一个元素,Pop表示弹出栈上的最后一个元素,Push表示压入一个元素到该栈的最后;栈顶指针记录表:用SPREC表示,用于在使用栈式函数调用代码分析中保存栈顶指针,辅助进行函数调用过程中的传入参数和传输参数的判定;SPREC也是栈式结构,Peek表示取栈上的最后一个元素,Pop表示弹出栈上的最后一个元素,Push表示压入一个元素到该栈的最后;寄存器表达式:用REGREC表示,用于在污点跟踪过程中记录寄存器的读写,寄存器表达式记录表中对寄存器按照序号进行索引,考虑寄存器使用的临时性,该表中对一个寄存器只记录一个最新值;临时变量表达式:用TMPREC表示,用于在污点跟踪过程中记录出内存读写和寄存器访问之外的其他临时性操作信息;全局污点表:用GLOBALTAINTREC表示:用于在污点跟踪过程中记录全局的污点信息。作为本专利技术的进一步改进:所述步骤S2中污点传播规则包括以下类别:S201:对于常见的算数指令和移位指令,如果某个源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S202:对于读寄存器和写寄存器指令,如果某个源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S203:对于比较类指令,如果比较指令的某个源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S204:对于条件类分支指令,如果分支条件的某个源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S205:对于内存地址读指令,如果访问的内存地址是全局变量s,则目的数据t的污点标记继承了全局变量s的污点标记,即t.taint_label=s.taint_label;如果访问的内存地址是表达式,并且该表达式标记为污点,则返回的读取结果为污点数据,即t.taint_label=s.taint_label;S206:对于内存地址写指令,如果访问的内存数据s带有污点标记,则返回的读取结果为污点数据,即t.taint_label=s.taint_label;S207:对于数据位宽转换指令,如果源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S208:不满足上述条件的其他情况下,目的数据t的污点标记为清白,即t.taint_label=0。作为本专利技术的进一步改进:所述步骤S3中的动态跟踪分析流程为:S301:对于给定的程序或指定的函数,确定污点源S,污点源类型包括参数污点源SA、全局变量污点源SG和用户输入污点源SI。污点源的选择可以通过配置来指定;S302:使用已有的中间语言转换工具将目标程序其转换成为中间语言,跟踪并分析CPU对中间语言指令的处理流程。作为本专利技术的进一步改进:所述步骤S302中污点跟踪的处理流程为:S3021:初始化存储表达式记录表STOREREC为空、初始化栈底指针BPREC记录栈为空、初始化栈顶SPREC记录栈为空、初始化BP值为第一条指令的地址PC、初始化寄存器表达式记录表为REGREC为空,初始化临时变量表达式记录表TMPREC、初始化全局污点表GLOBALTAINTREC为空;S3022:对于执行的每条指令,按照既定指令类型进行污点跟踪。作为本专利技术的进一步改进本文档来自技高网
...

【技术保护点】
1.一种基于中间语言和污点分析的软件数据流分析方法,其特征在于,步骤包括:步骤S1:定义指令格式和表达式格式;统一描述中间语言的通用指令类型,构建了临时变量表达式、寄存器表达式和污点标记表达式,用于污点分析过程中的数据表示;步骤S2:构建基于中间语言的污点传播规则,污点标记用taint_label表示;步骤S3:基于中间语言的程序数据流动态跟踪分析流程;步骤S4:当程序执行过程中,通过基于跟踪的污点信息来构建污点源与全局变量TG、局部变量TL、系统调用函数参数TF之间的数据流关系。

【技术特征摘要】
1.一种基于中间语言和污点分析的软件数据流分析方法,其特征在于,步骤包括:步骤S1:定义指令格式和表达式格式;统一描述中间语言的通用指令类型,构建了临时变量表达式、寄存器表达式和污点标记表达式,用于污点分析过程中的数据表示;步骤S2:构建基于中间语言的污点传播规则,污点标记用taint_label表示;步骤S3:基于中间语言的程序数据流动态跟踪分析流程;步骤S4:当程序执行过程中,通过基于跟踪的污点信息来构建污点源与全局变量TG、局部变量TL、系统调用函数参数TF之间的数据流关系。2.根据权利要求1所述的基于中间语言和污点分析的软件数据流分析方法,其特征在于,所述步骤S1包括为:S101:中间语言通用指令格式表示;算数指令和移位指令类:减法指令Sub、加法指令Add、逻辑右移指令Sar、逻辑左移指令Shl、或指令Or;内存访问类:内存读指令Load和内存写指令Store;寄存器操作类:写寄存器指令Put、读寄存器指令Get;比较类:比较指令Cmp;分支类:条件分支IF-THEN-ELSE指令;数据数据位宽转换类:16位转32位指令16Uto32、8位转32位指令8Uto32、1位转32位1Uto32、32位转1位指令32to1;用PC表示当前执行指令的地址;步骤S102:污点信息记录表达式格式表示;存储表达式记录表:用STOREREC表示,用于记录内存地址读写记录;栈底指针记录表:用BPREC表示,用于在使用栈式函数调用代码分析中保存栈底指针,辅助进行函数调用过程中的传入参数和调用者接收参数的判定;BPREC是栈式结构,Peek表示取栈上的最后一个元素,Pop表示弹出栈上的最后一个元素,Push表示压入一个元素到该栈的最后;栈顶指针记录表:用SPREC表示,用于在使用栈式函数调用代码分析中保存栈顶指针,辅助进行函数调用过程中的传入参数和传输参数的判定;SPREC也是栈式结构,Peek表示取栈上的最后一个元素,Pop表示弹出栈上的最后一个元素,Push表示压入一个元素到该栈的最后;寄存器表达式:用REGREC表示,用于在污点跟踪过程中记录寄存器的读写,寄存器表达式记录表中对寄存器按照序号进行索引,考虑寄存器使用的临时性,该表中对一个寄存器只记录一个最新值;临时变量表达式:用TMPREC表示,用于在污点跟踪过程中记录出内存读写和寄存器访问之外的其他临时性操作信息;全局污点表:用GLOBALTAINTREC表示:用于在污点跟踪过程中记录全局的污点信息。3.根据权利要求1所述的基于中间语言和污点分析的软件数据流分析方法,其特征在于,所述步骤S2中污点传播规则包括以下类别:S201:对于常见的算数指令和移位指令,如果某个源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S202:对于读寄存器和写寄存器指令,如果某个源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S203:对于比较类指令,如果比较指令的某个源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S204:对于条件类分支指令,如果分支条件的某个源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S205:对于内存地址读指令,如果访问的内存地址是全局变量s,则目的数据t的污点标记继承了全局变量s的污点标记,即t.taint_label=s.taint_label;如果访问的内存地址是表达式,并且该表达式标记为污点,则返回的读取结果为污点数据,即t.taint_label=s.taint_label;S206:对于内存地址写指令,如果访问的内存数据s带有污点标记,则返回的读取结果为污点数据,即t.taint_label=s.taint_label;S207:对于数据位宽转换指令,如果源数据s带有污点标签,则目的数据t为污点数据,即t.taint_label=s.taint_label;S208:不满足上述条件的其他情况下,目的数据t的污点标记为清白,即t.taint_label=0。4.根据权利要求1或2所述的基于中间语言和污点分析的软件数据流分析方法,其特征在于,所述步骤S3中的动态跟踪分析流程为:S301:对于给定的程序或指定的函数,确定污点源S,污点源类型包括参数污点源SA、全局变量污点源SG和用户输入污点源SI。污点源的选择可以通过配置来指定;S302:使用已有的中间语言转换工具将目标程序其转换成为中间语言,跟踪并分析CPU对中间语言指令的处理流程。5.根据权利要求4所述的基于中间语言和污点分析的软件数据流分析方法,其特征在于,所述步骤S302中污点跟踪的处理流程为:S3021:初始化存储表达式记录表STOREREC为空、初始化栈底指针BPREC记录栈为空、初始化栈顶SPREC记录栈为空、初始化BP值为第一条指令的地址PC、初始化寄存器表达式记录表为REGREC为空,初始化临时变量表达式记录表TMPREC、初始化全局污点表GLOBALTAINTREC为空;S3022:对于执行的每条指令,按照既定指令类型进行污点跟踪。6.根据权利要求5所述的基于中间语言和污点分析的软件数据流分析方法,其特征在于,所述步骤S3022中既定指令类型包括:S30221:如果是算数指令、移位指令、数据位宽转换指令,其表达式可以表示为value=OP(EXPA1,EXPA2,EXPA3,...,EXPAn),首先根据污点传播规则,通过检查参数EXPA1,EXPA2,EXPA3,...,EXPAn计算目的数据的污点标记,其次还根据指令类型构建污点表达式,即在临时变量表达式记录表TMPREC中加入表达式TMPREC[value]=OP(EXPA1,EXPA2,EXPA3,...,EXPAn),其中OP是当前的指令符号;S30222:对于内存写指令Store(addr)=value,则检查写的目标地址和待写入数据的表达式类型,进行如下判别:如果目的地址Addr是形如“栈顶SP+immvalue”的形式并且immvalue是正数,说明当前指令是在栈上准备传入参数,则在存储表达式记录表中创建一条如下的表达式STOREREC[addr]=<SP,immvalue,TMPREC[value]>;如果目的地址addr是形如“BP+immvalue”的形式且immvalue为负数,说明当前指令是在将局部变量值写入栈上,则在存储表达式记录表中创建一条如下的表达式STOREREC[addr]=<BP,immvalue,TMPREC[value]>;如果目的地址addr是形如“BP+immvalue”的形式且immvalue为正数,说明当前指令是在栈上读取子函数的返回参数,则在存储表达式记录表中创建一条如下的表达式STOREREC[addr]=<SP,immvalue,TMPREC[value]>;如果待写入数据的表达式是形如“regID”,而且目的地址的表达式是形如“BP-immvalue”且immvalue是正数,那么说明该操作数在写入BP进入了子函数代码,则在BPREC中压入BP值,并更新BP值为当前指令地址PC;对于其他形式...

【专利技术属性】
技术研发人员:喻波杨强乐泰唐勇解炜周旭罗艳
申请(专利权)人:中国人民解放军国防科技大学
类型:发明
国别省市:湖南,43

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

1