CN104021073A - 一种基于指针分析的软件漏洞检测方法 - Google Patents

一种基于指针分析的软件漏洞检测方法 Download PDF

Info

Publication number
CN104021073A
CN104021073A CN201410201648.5A CN201410201648A CN104021073A CN 104021073 A CN104021073 A CN 104021073A CN 201410201648 A CN201410201648 A CN 201410201648A CN 104021073 A CN104021073 A CN 104021073A
Authority
CN
China
Prior art keywords
instruction
plug
mounting
code
variable
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201410201648.5A
Other languages
English (en)
Other versions
CN104021073B (zh
Inventor
曾庆凯
李会朋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN201410201648.5A priority Critical patent/CN104021073B/zh
Publication of CN104021073A publication Critical patent/CN104021073A/zh
Application granted granted Critical
Publication of CN104021073B publication Critical patent/CN104021073B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

一种基于指针分析的软件漏洞检测方法,步骤如下:借助插装软件,有3个主要的插装操作,分别完成基本数据类型恢复、复杂数据类型恢复和漏洞检测:基本数据类型恢复的插装,插装操作为:在属于类型敏感类指令集合的指令后面插入类型收集代码,然后根据不同的汇编指令插入不同的类型传播代码;复杂数据类型恢复的插装,插装操作为:在内存申请类指令集合后面插入指针收集代码,根据不同的汇编指令插入指针分析代码,在指针分析的过程中便实现了对复杂数据类型的恢复;漏洞检测的插装,插装操作为:在程序的外部输入位置插入污染标记代码,根据汇编指令插入污点传播代码,在安全敏感点插入安全检测代码。

Description

一种基于指针分析的软件漏洞检测方法
技术领域
本发明涉及复杂数据类型相关的软件漏洞检测方法,特别涉及一种基于指针分析的软件漏洞检测方法。
背景技术
软件漏洞是系统容易受到攻击,影响系统的可用性。软件漏洞中,复杂数据类型相关的漏洞占了较大的比例,而且在能被利用实现攻击的漏洞中占比更大。通过对程序的分析和检测,发现并排除软件漏洞是常用方法。对可执行程序实现有效的漏洞检测,复杂数据类型的恢复是关键。目前对于复杂数据类型的恢复,大多采用单纯的类型推导或者对复杂数据类型访问间隔进行分析的方法,没有充分利用指针变量信息,使得复杂数据类型的恢复不够精确。因此,为充分利用复杂数据类型使用时指针变量的关键因素,本发明提出基于指针分析的软件漏洞检测方法。
本发明提出一种基于指针集合分析的复杂数据类型恢复和漏洞检测方法。根据类型敏感点以及类型推导恢复出基本数据类型。复杂数据类型的使用总是和指针操作联系在一起,通过跟踪内存的申请和返回中指针的使用来构建指针集合,根据指针集合的变迁和使用的分析,恢复出复杂数据结构。基于指针集合分析来恢复复杂数据类型具有较高的精确性。基于精确的复杂数据类型信息,通过污染分析实施软件漏洞检测,可提高漏洞检测的准确性。本方法的实施有利于发现并排除软件中脆弱性,对于提高系统的安全性具有重要意义。
发明内容
本发明目的是,提出一种基于指针集合分析的复杂数据类型恢复和漏洞检测方法。根据类型敏感点以及类型推导恢复出基本数据类型,通过对指针使用的分析,恢复出复杂数据结构。借助Valgrind插装软件对待分析程序插装分析代码。在完成插装之后,执行插装后的程序便可以实现程序数据类型分析和漏洞检测的目的。
本发明的技术方案是:一种基于指针分析的软件漏洞检测方法,步骤如下:借助插装软件,有3个主要的插装操作,分别完成基本数据类型恢复、复杂数据类型恢复和漏洞检测:
基本数据类型恢复的插装,其输入文件为要插装的可执行程序,插装操作为:在属于类型敏感类指令集合的指令后面插入类型收集代码,然后根据不同的汇编指令插入不同的类型传播代码;基本数据类型指程序中int、float等基本变量类型;在程序分析的过程中,当遇到库函数调用、系统调用、特殊指令时,在其后插入类型收集代码,以便从中提取出相关的类型信息;根据汇编指令的特征,插入对得到的类型信息进行类型推导的代码以及类型生成代码;插装后的可执行程序运行时,便得到了基本数据类型信息;
复杂数据类型恢复的插装,其输入文件为恢复出来的基本数据类型以及要插装的可执行程序,插装操作为:在内存申请类指令集合后面插入指针收集代码,根据不同的汇编指令插入指针分析代码,在指针分析的过程中便实现了对复杂数据类型的恢复;复杂数据类型主要指数组和结构体,此类变量操作均是通过指针实现;在程序分析的过程中,在程序申请内存类指令的后面插入指针收集代码,然后根据汇编指令的特点插入其对应的指针传播、分析以及复杂数据结构重构代码;插装后的可执行程序运行时,便得到了复杂数据类型信息;
漏洞检测的插装,其输入文件为恢复出来的复杂数据类型以及要插装的可执行程序,插装操作为:在程序的外部输入位置插入污染标记代码,根据汇编指令插入污点传播代码,在安全敏感点插入安全检测代码;在插装后的程序执行时,当安全检测代码检测到某个变量既包含污染属性又包含安全敏感属性,便判定出可能的安全漏洞;以带有数据类型信息的可执行程序为输入,进行漏洞检测代码的插装;使用污染分析的方法,在程序外部输入的指令后面插入污染标记代码;将内存写操作所涉及的变量标记为敏感变量,在敏感变量后面插入敏感标记代码;根据汇编指令特点插入其对应的污染传播代码;插装后的可执行程序运行时,经过污染传播,当一个变量同时拥有污染和敏感两个属性时,则判断此处易形成漏洞。
本发明有益效果是,根据类型敏感点以及类型推导恢复出基本数据类型。复杂数据类型的使用总是和指针操作联系在一起,通过跟踪内存的申请和返回中指针的使用来构建指针集合,根据指针集合的变迁和使用的分析,恢复出复杂数据结构。基于指针集合分析来恢复复杂数据类型具有较高的精确性。基于精确的复杂数据类型信息,通过污染分析实施软件漏洞检测,可提高漏洞检测的准确性。本方法的实施有利于发现并排除软件中脆弱性,对于提高系统的安全性具有重要意义。
附图说明
图1基于指针分析的软件漏洞检测流程示意图;
图2基本数据类型恢复的插装流程图;
图3复杂数据类型恢复的插装流程图;
图4漏洞检测的插装流程图;
图5插装的初始化指针信息处理流程图;
图6插装的传递类型信息处理流程图;
图7插装的更新指针集合属性信息处理流程图。
具体实施方式
如图1所示,Valgrind是一个插装软件,可以实现对可执行程序的动态分析。借助此平台完成对可执行程序的插装。对插装之后的程序进行执行,所插装的代码便得到了执行,进而实施数据类型恢复和软件漏洞检测。启动Valgrind程序,指定使用的插装操作、要插装的程序、库函数查询文件以及输出文件等,便可实现相应的插装操作。
3个主要插装操作分别为基本数据类型恢复、复杂数据类型恢复以及漏洞检测。基本数据类型恢复的插装,其输入文件为要插装的可执行程序,插装操作为:在属于类型敏感类指令集合的指令后面插入类型收集代码,然后根据不同的汇编指令插入不同的类型传播代码。复杂数据类型恢复的插装,其输入文件为恢复出来的基本数据类型以及要插装的可执行程序,插装操作为:在内存申请类指令集合后面插入指针收集代码,根据不同的汇编指令插入指针分析代码,在指针分析的过程中便实现了对复杂数据类型的恢复。漏洞检测的插装,其输入文件为恢复出来的复杂数据类型以及要插装的可执行程序,插装操作为:在程序的外部输入位置插入污染标记代码,根据汇编指令插入污点传播代码,在安全敏感点插入安全检测代码。在插装后的程序执行时,当安全检测代码检测到某个变量既包含污染属性又包含安全敏感属性,便判定出可能的安全漏洞。
在基本数据类型恢复的插装中,需要用到库函数查询表。此表用来提供类型敏感类指令的具体类型信息,存储在配置文件FunInfo.conf中,Valgrind以字符串形式把表读入内存中。当检测到相关的库函数调用时,以函数名为关键字查询该表,得到具体的类型信息。表的结构是:函数名、参数个数、参数1类型、参数2类型、返回结果参数类型,以换行作为一个函数信息的结束。
为记录基本和复杂数据类型信息,使用的以下数据结构。
变量标记标识每个寄存器、内存位置变量,包括变量地址、时间戳、变量长度。变量地址表示变量申请的内存位置或所用寄存器名称,时间戳是变量首次使用时的指令地址,变量长度表示变量在内存中的长度,以字节为单位。
指针属性链表节点。属性链表用来表明指针的属性,其每个节点表示该指针所指向复杂数据结构中的一个基本数据变量结构,包含该变量在复杂数据结构中的起始位置、结束位置、类型信息。
指针集合属性是一个链表结构,其头结点记录的是该指针所指向空间的内存长度。随着程序执行,复杂数据结构恢复模块会不断的更新属性信息。其更新的方式为在该链表中加入后续节点以不断识别结构体信息。
指针集合是指向具有相同结构体的指针的集合。其指针集合标记包括指针指向地址、时间戳、指针集合属性。指针指向地址表示指针指向的内存位置的首地址,时间戳表示该指针集合被创建时的指令地址,指针集合属性表示指针集合的属性。
图2为基本数据类型恢复的插装流程图,实现对基本数据类型恢复的代码插装。依据汇编指令对类型推导的影响将其分为三类指令集合,分别为类型敏感类指令集合、拷贝类指令集合、运算操作类指令集合。分别定义如下:类型敏感类指令集合={abs,strcmp,strcpy,strcat,strlen,strtol,strdup,memcpy,fork,FLD,FTS,FCOM,FADD,FSUB,FMUL,FDIV,FSQRT,FSCALE,FPREE,FABS,FCHS,FCOS,FSIN,FPTAN,FYL2X,F2XM1,FINT,FCLEX,FNOP,FXCH,FFREE,FINCSTP,FDECSTP},其中类型敏感类包含所有的库函数调用。拷贝类指令集合={MOV,MOVS,MOVZ,STOS,STOZ,PUSH,POP,XCHG,PUSHA,POPA,PUSHAD,POPAD,XADD},运算操作类指令集合={ADD,SUB,MUL,IMUL,DIV,IDIV}。Valgrind对程序进行一些初始化后将程序指令放在IRSB区块内。通过区块地址便可以取得需要分析的指令,进而进行插装。在插装的过程中,每当遇到一个变量时便插装创建变量标记的代码。在插装后的程序执行时对变量标记里的属性进行完善,变量标记信息以字符串的形式写入到记录信息中(信息更新时记录文件同步更新),最后记录文件中记录着恢复出来的变量信息。
步骤20为起始动作。步骤21通过IRSB区块取下一条指令。步骤22判断程序指令是否取完,若是转步骤29,否则转步骤23。步骤23判断该指令是否在类型敏感类指令集合中,若是转步骤24,否则转步骤25。步骤24插入类型搜集代码,插入代码的功能为根据库函数查询表得到的类型信息,标记内存变量的类型。插入完成后转到步骤21。步骤25判断该指令是否在拷贝类指令集合中,若是转步骤26,否则转步骤27。步骤26为插入类型传递代码,插入代码的功能为将源操作数的类型传递给目的操作数。步骤27判断该指令是否在运算操作类指令集合中,若是转步骤28,否则转步骤29。步骤28为插入类型合并代码,其插入代码的功能为将已恢复的操作数的类型传递给未恢复类型的操作数。步骤29为结束状态,插装完成。在插装过程完成后,生成一个插装后的可执行程序。执行插装之后的可执行程序便可以生成基本数据类型信息。
图3为复杂数据类型恢复的插装流程图,实现对复杂数据类型恢复代码的插装。其输入为待分析的可执行程序以及基本数据类型恢复操作恢复出来的记录文件(基本变量),Valgrind平台依据变量标记里的时间戳(指令地址)把基本变量和可执行程序对照起来,记录文件以字符串的形式读取到内存中。依据汇编指令对类型推导的影响将其分为三类指令集合,分别为拷贝类指令集合、内存申请类指令集合、内存释放类指令集合。其中拷贝类指令集合的定义同图2,内存申请类指令集合={malloc,realloc,calloc},内存释放类指令集合={free}。
步骤30为起始动作。步骤31通过IRSB区块取下一条指令,等待分析。步骤32检查程序指令是否取完,若未取完转到步骤33。步骤33根据指令特点以及已经恢复出的基本数据变量判断该指令的操作数是否包含指针,若是转步骤34,否则转步骤31。步骤34判断该指令是否在内存申请类指令集合中,若是转步骤35,否则转步骤36。步骤35为插入初始化指针信息函数代码过程,其插入的代码所完成功能的流程见附图5。步骤36判断该指令是否在拷贝类指令集合中,若是转步骤37,否则转步骤38。步骤37为插入传递指令类型信息的函数代码过程,其插入的代码完成功能的流程见附图6。步骤38判断该指令是否在内存释放类指令集合中,若是转步骤39,否则跳转步骤31。步骤39插入写变量信息入记录文件的代码,插入代码的功能为将变量的类型信息写入记录文件中,释放该变量。步骤3a为结束状态,插装完成。在插装过程完成后,生成一个插装后的可执行程序。执行插装之后的可执行程序(同样需要基本数据恢复的记录文件)便可以生成复杂数据类型信息。
图4所示为漏洞检测的插装流程,实现对待检测程序的漏洞检测代码的插装。其输入为待分析的可执行程序以及复杂数据类型恢复操作恢复出来的记录文件(复杂变量类型),Valgrind平台依据指针集合里的时间戳(指令地址)把复杂类型信息和可执行程序对照起来,记录文件以字符串的形式读取到内存中。根据汇编指令对污染分析的影响,把指令分为输入类指令集合、污染传播类指令集合和内存操作类指令集合,其中输入类指令集合为={get,gets,getchar,fgetc,fgets,fread,scanf,socket,recv},污染传播类指令集合为={MOV,MOVS,MOVZ,STOS,STOZ,PUSH,POP,XCHG,PUSHA,POPA,PUSHAD,POPAD,XADD,ADD,SUB,MUL,IMUL,DIV,IDIV,LEA,LDS,LES,LFS,LGS,LSS},内存操作类指令集合为={memcpy,memset,memmove,MOV,MOVS,STOS}。
步骤40为起始动作。步骤41在IRSB区块取一条指令。步骤42判断是否取完程序,若是转步骤4b,否则转步骤43。步骤43判断指令是否在输入类型指令集合中,若是则说明此处有外部数据污染,转步骤44,否则转步骤45。步骤44为插入标记污染变量的代码,其插入的代码功能为:根据库函数参数信息,把此输入函数对应的实参和返回值赋予污染属性。步骤45判断指令是否在污染传播类指令集合中,若是转步骤46,否则转步骤47。步骤46根据程序的汇编指令插入污染传播代码,其插入的代码功能为:若源操作数为污染的则目的操作数也标记为污染的。步骤47判断指令是否在内存操作类指令集合中,若是转步骤48,否则转步骤49。步骤48为插入敏感变量标记代码,其插入的代码功能为:此内存写入指令所使用到的变量均将被赋予敏感属性,表示此变量为敏感变量。步骤49插入漏洞检测、记录的代码,其插入的代码功能为:判断是否有变量同时拥有了污染属性和敏感属性,若是则说明此变量容易遭受攻击,是一个潜在的安全漏洞点,则发出警报并记录,否则转步骤41。步骤4a为结束状态,插装结束。在插装过程完成后,生成一个插装后的可执行程序。执行插装之后的可执行程序(同样需要复杂数据类型的记录文件)便可以生成漏洞警报信息。
图5所示为插装的初始化指针信息处理流程。主要功能是在遇到内存申请类指令时对指针集合信息的初始化。其输入为内存申请类指令(如malloc),处理后便创建了一个新的指针类型集合。步骤50为起始动作。步骤51创建新的指针集合,其中指针集合中的时间戳为内存空间首次申请时的指令地址。步骤52初始化指针集合,其数据结构为指针指向地址、时间戳、指针集合属性。据内存申请空间函数的返回结果,指针指向地址初始化为函数返回的指针地址,时间戳初始化为函数所在的指令地址,指针集合属性置为空。步骤53初始化指针集合属性,创建头结点,写入结构体长度,将头结点地址写入指针集合的指针集合属性内。步骤54为结束状态。
图6所示为插装的传递类型信息处理流程。主要功能是完成在拷贝类指令时类型信息的推导,其输入为拷贝类指令,输出是目的操作数拥有类型信息。步骤60为起始动作。步骤61判断v(源操作数)是否为指针,是指针则转步骤62,否则转步骤63。步骤62将目的操作数加入到源操作数的指针集合中,转步骤65。步骤63判断w(目的操作数)是否包含于某个指针集合(根据目的操作数地址、大小以及指针集合的地址、大小,判断是否包含),若是转步骤64,否则转步骤65。步骤64更新指针集合属性信息,具体处理流程如图7所示,转步骤65。步骤65为结束状态。
图7所示为插装的更新指针集合属性信息处理流程。其功能为恢复出复杂数据类型中包含的基本数据类型。在当遇到基本变量与复杂数据类型中的一些变量发生操作时,便可推导出该复杂数据类型中这一些变量的类型。其输入是源操作数和目的操作数所在的指针集合,执行该流程后,目的操作数的指针集合属性信息得到更新。
步骤70为起始动作。步骤71根据匹配到的指针集合获得指针集合的属性链表。步骤72根据指针集合初始位置以及目的操作数的内存写入地址,判定写入的操作数在指针集合属性链表中的位置(起始位置、结束位置)。步骤73创建新的属性链表节点,将起始位置、结束位置、操作数类型等信息写入到节点中,根据步骤72所找到的位置,将节点插入到属性链表中。步骤74为结束状态。属性链表里面存储着复杂数据类型的详细信息。在写记录文件时,只要把属性链表里的信息依据起始点和结束点写入记录文件中,相应的复杂数据类型便得以恢复。

Claims (8)

1.一种基于指针分析的软件漏洞检测方法,其特征是步骤如下:借助插装软件,有3个主要的插装操作,分别完成基本数据类型恢复、复杂数据类型恢复和漏洞检测: 
基本数据类型恢复的插装,其输入文件为要插装的可执行程序,插装操作为:在属于类型敏感类指令集合的指令后面插入类型收集代码,然后根据不同的汇编指令插入不同的类型传播代码;基本数据类型指程序中int、float等基本变量类型;在程序分析的过程中,当遇到库函数调用、系统调用、特殊指令时,在其后插入类型收集代码,以便从中提取出相关的类型信息;根据汇编指令的特征,插入对得到的类型信息进行类型推导的代码以及类型生成代码;插装后的可执行程序运行时,便得到了基本数据类型信息; 
复杂数据类型恢复的插装,其输入文件为恢复出来的基本数据类型以及要插装的可执行程序,插装操作为:在内存申请类指令集合后面插入指针收集代码,根据不同的汇编指令插入指针分析代码,在指针分析的过程中便实现了对复杂数据类型的恢复;复杂数据类型主要指数组和结构体,此类变量操作均是通过指针实现;在程序分析的过程中,在程序申请内存类指令的后面插入指针收集代码,然后根据汇编指令的特点插入其对应的指针传播、分析以及复杂数据结构重构代码;插装后的可执行程序运行时,便得到了复杂数据类型信息; 
漏洞检测的插装,其输入文件为恢复出来的复杂数据类型以及要插装的可执行程序,插装操作为:在程序的外部输入位置插入污染标记代码,根据汇编指令插入污点传播代码,在安全敏感点插入安全检测代码;在插装后的程序执行时,当安全检测代码检测到某个变量既包含污染属性又包含安全敏感属性,便判定出可能的安全漏洞;以带有数据类型信息的可执行程序为输入,进行漏洞检测代码的插装;使用污染分析的方法,在程序外部输入的指令后面插入污染标记代码;将内存写操作所涉及的变量标记为敏感变量,在敏感变量后面插入敏感标记代码;根据汇编指令特点插入其对应的污染传播代码;插装后的可执行程序运行时,经过污染传播,当一个变量同时拥有污染和敏感两个属性时,则判断此处易形成漏洞。 
2.根据权利要求1所述的基于指针分析的软件漏洞检测方法,其特征是采用插装软件Valgrind,实现对可执行程序的动态分析;借助此平台完成对可执行程序的插装;对插装之后的程序进行执行,所插装的代码便得到了执行,进而实施数据类型恢复和软件漏洞检测;启动Valgrind程序,指定使用的插装操作、要插装的程序、库函数查询文件以及输出文件等,便能实现相应的插装操作; 
在基本数据类型恢复的插装中,需要用到库函数查询表;此表用来提供类型敏感类指令的具体类型信息,存储在配置文件FunInfo.conf中,Valgrind以字符串形式把表读入内存中;当检测到相关的库函数调用时,以函数名为关键字查询该表,得到具体的类型信息;表的结构是:函数名、参数个数、参数1类型、参数2类型、返回结果参数类型,以换行作为一个函数信息的结束; 
为记录基本和复杂数据类型信息,使用的以下数据结构:变量标记标识每个寄存器、内存位置变量,包括变量地址、时间戳、变量长度;变量地址表示变量申请的内存位置或所用寄存器名称,时间戳是变量首次使用时的指令地址,变量长度表示变量在内存中的长度,以字节为单位; 
指针属性链表节点:属性链表用来表明指针的属性,其每个节点表示该指针所指向复杂数据结构中的一个基本数据变量结构,包含该变量在复杂数据结构中的起始位置、结束位置、类型信息; 
指针集合属性是一个链表结构,其头结点记录的是该指针所指向空间的内存长度;随着程序执行,复杂数据结构恢复模块会不断的更新属性信息;其更新的方式为在该链表中加入后续节点以不断识别结构体信息; 
指针集合是指向具有相同结构体的指针的集合;其指针集合标记包括指针指向地址、时间戳、指针集合属性;指针指向地址表示指针指向的内存位置的首地址,时间戳表示该指针集合被创建时的指令地址,指针集合属性表示指针集合的属性。 
3.根据权利要求1所述的基于指针分析的软件漏洞检测方法,其特征是基本数据类型恢复的插装流程实现对基本数据类型恢复的代码插装;依据汇编指令对类型推导的影响将其分为三类指令集合,分别为类型敏感类指令集合、拷贝类指令集合、运算操作类指令集合;分别定义如下:类型敏感类指令集合={abs,strcmp,strcpy,strcat,strlen,strtol,strdup,memcpy,fork,FLD,FTS,FCOM,FADD,FSUB,FMUL,FDIV,FSQRT,FSCALE,FPREE,FABS,FCHS,FCOS,FSIN,FPTAN,FYL2X,F2XM1,FINT,FCLEX,FNOP,FXCH,FFREE,FINCSTP,FDECSTP},其中类型敏感类包含所有的库函数调用;拷贝类指令集合={MOV,MOVS,MOVZ,STOS,STOZ,PUSH,POP,XCHG,PUSHA,POPA,PUSHAD,POPAD,XADD},运算操作类指令集合={ADD,SUB,MUL,IMUL,DIV,IDIV};Valgrind对程序进行一些初始化后将程序指令放在IRSB区块内;通过区块地址便可以取得需要分析的指令,进而进行插装;在插装的过程中,每当遇到一个变量时便插装创建变量标记的代码;在插装后的程序执行时对变量标记里的属性进行完善,变量标记信息以字符串的形式写入到记录信息中,最后记录文件中记录着恢复出来的变量信息; 
步骤20为起始动作;步骤21通过IRSB区块取下一条指令;步骤22判断程序指令是否取完,若是转步骤29,否则转步骤23;步骤23判断该指令是否在类型敏感类指令集合中,若是转步骤24,否则转步骤25;步骤24插入类型搜集代码,插入代码的功能为根据库函数查询表得到的类型信息,标记内存变量的类型;插入完成后转到步骤21;步骤25判断该指令是否在拷贝类指令集合中,若是转步骤26,否则转步骤27;步骤26为插入类型传递代码,插入代码的功能为将源操作数的类型传递给目的操作数;步骤27判断该指令是否在运算操作类指令集合中,若是转步骤28,否则转步骤29;步骤28为插入类型合并代码,其插入代码的功能为将已恢复的操作数的类型传递给未恢复类型的操作数;步骤29为结束状态,插装完成;在插装过程完成后,生成一个插装后的可执行程序;执行插装之后的可执行程序便可以生成基本数据类型信息。 
4.根据权利要求1所述的基于指针分析的软件漏洞检测方法,其特征是复杂数据类型恢复的插装流程,实现对复杂数据类型恢复代码的插装;其输入为待分析的可执行程序以及基本数据类型恢复操作恢复出来的记录文件即基本变量,Valgrind平台依据变量标记里的时间戳即指令地址把基本变量和可执行程序对照起来,记录文件以字符串的形式读取到内存中;依据汇编指令对类型推导的影响将其分为三类指令集合,分别为拷贝类指令集合、内存申请类指令集合、内存释放类指令集合;内存申请类指令集合={malloc,realloc,calloc},内存释放类指令集合={free}; 
步骤30为起始动作;步骤31通过IRSB区块取下一条指令,等待分析;步骤32检查程序指令是否取完,若未取完转到步骤33;步骤33根据指令特点以及已经恢复出的基本数据变量判断该指令的操作数是否包含指针,若是转步骤34,否则转步骤31;步骤34判断该指令是否在内存申请类指令集合中,若是转步骤35,否则转步骤36;步骤35为插入初始化指针信息函数代码过程,其插入的代码所完成功能的流程见附图5;步骤36判断该指令是否在拷贝类指令集合中,若是转步骤37,否则转步骤38;步骤37为插入传递指令类型信息的函数代码过程,其插入的代码完成功能的流程见附图6;步骤38判断该指令是否在内存释放类指令集合中,若是转步骤39,否则跳转步骤31;步骤39插入写变量信息入记录文件的代码,插入代码的功能为将变量的类型信息写入记录文件中,释放该变量;步骤3a为结束状态,插装完成;在插装过程完成后,生成一个插装后的可执行程序;执行插装之后的可执行程序便可以生成复杂数据类型信息。 
5.根据权利要求1所述的基于指针分析的软件漏洞检测方法,其特征是漏洞检测的插装流程,实现对待检测程序的漏洞检测代码的插装;其输入为待分析的可执行程序以及复杂数据类型恢复操作恢复出来的记录文件、复杂变量类型,Valgrind平台依据指针集合里的时间戳(指令地址)把复 杂类型信息和可执行程序对照起来,记录文件以字符串的形式读取到内存中;根据汇编指令对污染分析的影响,把指令分为输入类指令集合、污染传播类指令集合和内存操作类指令集合,其中输入类指令集合为={get,gets,getchar,fgetc,fgets,fread,scanf,socket,recv},污染传播类指令集合为={MOV,MOVS,MOVZ,STOS,STOZ,PUSH,POP,XCHG,PUSHA,POPA,PUSHAD,POPAD,XADD,ADD,SUB,MUL,IMUL,DIV,IDIV,LEA,LDS,LES,LFS,LGS,LSS},内存操作类指令集合为={memcpy,memset,memmove,MOV,MOVS,STOS}; 
步骤40为起始动作;步骤41在IRSB区块取一条指令;步骤42判断是否取完程序,若是转步骤4b,否则转步骤43;步骤43判断指令是否在输入类型指令集合中,若是则说明此处有外部数据污染,转步骤44,否则转步骤45;步骤44为插入标记污染变量的代码,其插入的代码功能为:根据库函数参数信息,把此输入函数对应的实参和返回值赋予污染属性;步骤45判断指令是否在污染传播类指令集合中,若是转步骤46,否则转步骤47;步骤46根据程序的汇编指令插入污染传播代码,其插入的代码功能为:若源操作数为污染的则目的操作数也标记为污染的;步骤47判断指令是否在内存操作类指令集合中,若是转步骤48,否则转步骤49;步骤48为插入敏感变量标记代码,其插入的代码功能为:此内存写入指令所使用到的变量均将被赋予敏感属性,表示此变量为敏感变量;步骤49插入漏洞检测、记录的代码,其插入的代码功能为:判断是否有变量同时拥有了污染属性和敏感属性,若是则说明此变量容易遭受攻击,是一个潜在的安全漏洞点,则发出警报并记录,否则转步骤41;步骤4a为结束状态,插装结束;在插装过程完成后,生成一个插装后的可执行程序;执行插装之后的可执行程序便可以生成漏洞警报信息。 
6.根据权利要求1所述的基于指针分析的软件漏洞检测方法,其特征是为插装的初始化指针信息处理流程;主要功能是在遇到内存申请类指令时对指针集合信息的初始化;其输入为内存申请类指令(如malloc),处理后便创建了一个新的指针类型集合;步骤50为起始动作;步骤51创建新的指针集合,其中指针集合中的时间戳为内存空间首次申请时的指令地址;步骤52初始化指针集合,其数据结构为指针指向地址、时间戳、指针集合属性;据内存申请空间函数的返回结果,指针指向地址初始化为函数返回的指针地址,时间戳初始化为函数所在的指令地址,指针集合属性置为空;步骤53初始化指针集合属性,创建头结点,写入结构体长度,将头结点地址写入指针集合的指针集合属性内;步骤54为结束状态。 
7.根据权利要求1所述的基于指针分析的软件漏洞检测方法,其特征是为插装的传递类型信息处理流程;完成在拷贝类指令时类型信息的推导,其输入为拷贝类指令,输出是目的操作数拥有类 型信息;步骤60为起始动作;步骤61判断源操作数v是否为指针,是指针则转步骤62,否则转步骤63;步骤62将目的操作数加入到源操作数的指针集合中,转步骤65;步骤63判断目的操作数w是否包含于某个指针集合,根据目的操作数地址、大小以及指针集合的地址、大小,判断是否包含,若是转步骤64,否则转步骤65;步骤64更新指针集合属性信息,具体处理流程如图7所示,转步骤65;步骤65为结束状态。 
8.根据权利要求1所述的基于指针分析的软件漏洞检测方法,其特征是插装的更新指针集合属性信息处理流程;其功能为恢复出复杂数据类型中包含的基本数据类型;在当遇到基本变量与复杂数据类型中的一些变量发生操作时,便可推导出该复杂数据类型中这一些变量的类型;其输入是源操作数和目的操作数所在的指针集合,执行该流程后,目的操作数的指针集合属性信息得到更新;步骤70为起始动作;步骤71根据匹配到的指针集合获得指针集合的属性链表;步骤72根据指针集合初始位置以及目的操作数的内存写入地址,判定写入的操作数在指针集合属性链表中的位置即起始位置和结束位置;步骤73创建新的属性链表节点,将起始位置、结束位置、操作数类型等信息写入到节点中,根据步骤72所找到的位置,将节点插入到属性链表中;步骤74为结束状态;属性链表里面存储着复杂数据类型的详细信息;在写记录文件时,只要把属性链表里的信息依据起始点和结束点写入记录文件中,相应的复杂数据类型便得以恢复。 
CN201410201648.5A 2014-05-06 2014-05-06 一种基于指针分析的软件漏洞检测方法 Expired - Fee Related CN104021073B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410201648.5A CN104021073B (zh) 2014-05-06 2014-05-06 一种基于指针分析的软件漏洞检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410201648.5A CN104021073B (zh) 2014-05-06 2014-05-06 一种基于指针分析的软件漏洞检测方法

Publications (2)

Publication Number Publication Date
CN104021073A true CN104021073A (zh) 2014-09-03
CN104021073B CN104021073B (zh) 2017-02-01

Family

ID=51437838

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410201648.5A Expired - Fee Related CN104021073B (zh) 2014-05-06 2014-05-06 一种基于指针分析的软件漏洞检测方法

Country Status (1)

Country Link
CN (1) CN104021073B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106021040A (zh) * 2016-05-04 2016-10-12 中国人民解放军国防科学技术大学 一种基于线形汇编指令差异性变换的dsp软错误检测方法
CN106446690A (zh) * 2016-09-05 2017-02-22 北京蓝海讯通科技股份有限公司 一种对应用漏洞进行修复的装置、方法以及系统
CN107038378A (zh) * 2016-11-14 2017-08-11 平安科技(深圳)有限公司 应用软件安全漏洞检测方法和系统
CN110661804A (zh) * 2019-09-29 2020-01-07 南京邮电大学 一种针对防火墙的污点分析漏洞检测方法
CN114331396A (zh) * 2021-12-28 2022-04-12 中国科学技术大学 面向以太坊智能合约的协议安全属性自动提取方法及系统

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101571828A (zh) * 2009-06-11 2009-11-04 北京航空航天大学 基于约束分析和模型检验的代码安全漏洞检测方法
CN101615238A (zh) * 2009-07-28 2009-12-30 南京大学 基于二进制的内存篡改攻击的检测和漏洞定位系统
CN101833631A (zh) * 2010-02-09 2010-09-15 北京理工大学 一种结合指针分析的软件安全漏洞动态检测方法
US20120222123A1 (en) * 2010-03-19 2012-08-30 Aspect Security Inc. Detection of Vulnerabilities in Computer Systems

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101571828A (zh) * 2009-06-11 2009-11-04 北京航空航天大学 基于约束分析和模型检验的代码安全漏洞检测方法
CN101615238A (zh) * 2009-07-28 2009-12-30 南京大学 基于二进制的内存篡改攻击的检测和漏洞定位系统
CN101833631A (zh) * 2010-02-09 2010-09-15 北京理工大学 一种结合指针分析的软件安全漏洞动态检测方法
US20120222123A1 (en) * 2010-03-19 2012-08-30 Aspect Security Inc. Detection of Vulnerabilities in Computer Systems

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
WEIGUANG WANG ETC.: "A security Assurance Framework Combining Formal Verification and Security Functional Testing", 《2012 12TH INTERNATIONAL CONFERENCE ON QUALITY SOFTWARE》 *
孙浩 等: "基于信息流的整数漏洞插装与验证", 《软件学报》 *
康凯: "二进制应用程序漏洞挖掘技术研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》 *
张林 等: "软件安全漏洞的静态检测技术", 《计算机工程》 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106021040A (zh) * 2016-05-04 2016-10-12 中国人民解放军国防科学技术大学 一种基于线形汇编指令差异性变换的dsp软错误检测方法
CN106021040B (zh) * 2016-05-04 2019-07-16 中国人民解放军国防科学技术大学 一种基于线形汇编指令差异性变换的dsp软错误检测方法
CN106446690A (zh) * 2016-09-05 2017-02-22 北京蓝海讯通科技股份有限公司 一种对应用漏洞进行修复的装置、方法以及系统
CN106446690B (zh) * 2016-09-05 2019-08-02 北京蓝海讯通科技股份有限公司 一种对应用漏洞进行修复的装置、方法以及系统
CN107038378A (zh) * 2016-11-14 2017-08-11 平安科技(深圳)有限公司 应用软件安全漏洞检测方法和系统
CN107038378B (zh) * 2016-11-14 2018-06-26 平安科技(深圳)有限公司 应用软件安全漏洞检测方法和系统
CN110661804A (zh) * 2019-09-29 2020-01-07 南京邮电大学 一种针对防火墙的污点分析漏洞检测方法
CN114331396A (zh) * 2021-12-28 2022-04-12 中国科学技术大学 面向以太坊智能合约的协议安全属性自动提取方法及系统

Also Published As

Publication number Publication date
CN104021073B (zh) 2017-02-01

Similar Documents

Publication Publication Date Title
KR101904911B1 (ko) 하이브리드 퍼징 기반 보안 취약점 자동 탐색 방법 및 그 장치
CN104834859B (zh) 一种Android应用中恶意行为的动态检测方法
KR101981028B1 (ko) 바이너리 기반 보안 취약점 탐색 시스템, 그 방법 및 프로그램
TWI553503B (zh) 產生候選鈎點以偵測惡意程式之方法及其系統
CN104021073A (zh) 一种基于指针分析的软件漏洞检测方法
CN101964036B (zh) 漏洞检测方法及装置
CN109905385B (zh) 一种webshell检测方法、装置及系统
CN102592080B (zh) flash恶意文件检测方法及装置
Von Detten et al. Reverse engineering with the reclipse tool suite
CN102760098A (zh) 面向bit软件测试的处理器故障注入方法及其模拟器
CN107392016A (zh) 一种基于代理的Web数据库攻击行为检测系统
CN103577323B (zh) 基于动态关键指令序列胎记的软件抄袭检测方法
CN107526970B (zh) 基于动态二进制平台检测运行时程序漏洞的方法
CN112632535B (zh) 攻击检测方法、装置、电子设备及存储介质
CN102073825B (zh) 基于路径驱动的可执行程序安全性检测方法
CN108399321B (zh) 基于动态指令依赖图胎记的软件局部抄袭检测方法
CN101458630B (zh) 一种基于硬件模拟器的自修改代码识别方法
CN104715190A (zh) 一种基于深度学习的程序执行路径的监控方法及系统
CN101388055A (zh) 一种用于漏洞模型检测的程序操作特征提取方法
CN112464248A (zh) 一种处理器漏洞利用威胁检测方法及装置
CN106874758A (zh) 一种识别文档代码的方法和装置
CN109240922B (zh) 基于RASP提取webshell软件基因进行webshell检测的方法
CN101930401B (zh) 一种基于检测对象的软件漏洞模型检测方法
CN106845235A (zh) 一种基于机器学习方法的安卓平台回调函数检测方法
CN111125704B (zh) 一种网页挂马识别方法及系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information

Address after: Jiangning District of Nanjing City, Jiangsu province 211164 RI Street Ox Road No. 69 Valley Branch Center Room 1113

Applicant after: Nanjing University

Address before: 210093 Nanjing, Gulou District, Jiangsu, No. 22 Hankou Road

Applicant before: Nanjing University

COR Change of bibliographic data
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20170201

Termination date: 20180506