CN101241532A - 面向源代码的基于不等式组求解的缓冲区溢出检测方法 - Google Patents

面向源代码的基于不等式组求解的缓冲区溢出检测方法 Download PDF

Info

Publication number
CN101241532A
CN101241532A CNA2008100577579A CN200810057757A CN101241532A CN 101241532 A CN101241532 A CN 101241532A CN A2008100577579 A CNA2008100577579 A CN A2008100577579A CN 200810057757 A CN200810057757 A CN 200810057757A CN 101241532 A CN101241532 A CN 101241532A
Authority
CN
China
Prior art keywords
centerdot
function
inequality
buffer
program
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.)
Pending
Application number
CNA2008100577579A
Other languages
English (en)
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.)
Beijing University of Posts and Telecommunications
Original Assignee
Beijing University of Posts and Telecommunications
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 Beijing University of Posts and Telecommunications filed Critical Beijing University of Posts and Telecommunications
Priority to CNA2008100577579A priority Critical patent/CN101241532A/zh
Publication of CN101241532A publication Critical patent/CN101241532A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

一种面向源代码的基于不等式组求解的缓冲区溢出检测方法,包括下列操作步骤:(1)为描述危险函数的约束条件进行初始化设置;(2)对输入的程序源代码进行词法和语法解析并生成程序依赖图;(3)根据危险函数库中发生缓冲区溢出的不等式约束条件,在程序依赖图中查找有关危险函数调用的语句;(4)针对当前查找到的危险函数,在程序依赖图中查找与该危险函数有数据依赖或控制依赖关系的语句,形成依赖语句序列,即不等式组;(5)验证发生缓冲区溢出的不等式的约束条件是否成立。该方法能较好地解决现有静态代码分析技术在处理程序控制关系时,对缓存区变量或参数的长度属性的影响无法准确把握的缺陷,有效降低了缓冲区溢出漏洞检测的误报率。

Description

面向源代码的基于不等式组求解的缓冲区溢出检测方法
技术领域
本发明涉及一种如何在计算机软件源代码中检测缓冲区溢出的技术,确切地说,涉及一种基于不等式组求解的检测源代码中的缓冲区溢出的方法,属于信息安全中的软件安全技术领域。
背景技术
在进入信息化社会的今天,计算机软件的地位越来越重要。不断推陈出新的软件开发技术使得软件可以实现非常丰富、强大的功能,而呈现给用户的界面却更加简单、便捷。但是,与软件相关联的安全隐患也与日俱升,不仅在数量上远远超过以往的任何时间,而且危害程度也极为严重。软件的规模庞大、新研制的软件技术的不稳定性和经典软件技术的缺陷等都会导致各种软件安全漏洞。缓冲区溢出就是一类影响极为广泛、危害极其严重的软件安全漏洞。
缓冲区溢出是指计算机程序的指令向缓冲区内填充的数据超出了缓冲区的存储容量。当一个超长的数据进入到缓冲区时,超出部分的数据就会被写入其他缓冲区;因为其他缓冲区存放的可能是数据、下一条指令的指针、或者是其他程序的输出内容。这些内容就会被溢出数据所覆盖或破坏掉。黑客采用的一个传统伎俩就是利用有针对性的数据输入,将计算机程序导向至一个不确定的、程序意图之外的流程。2001年开始出现的红色代码蠕虫、2003年出现的Win32.slammer.worm等计算机病毒都属于这种情况,前者通过微软IIS服务程序处理请求数据包时发生缓冲区溢出,后者是利用了微软Windows平台的RPC缓冲区的溢出漏洞。
导致缓冲区溢出的根本原因是当前的主流操作系统在内存管理时缺乏基本的内存越界保护,现在的内存边界的越界处理除了由编译器发挥作用有限的保障作用以外,主要是依靠程序员的代码质量来保证。
目前,针对缓冲区溢出的防范主要采用以下几种基本方法:
(1)基于操作系统安全加固的方法:其基本原理是在操作系统引入专用于对内存进行边界检测的引擎,以确保软件在运行过程不会出现缓冲区溢出。
(2)基于编译器功能增强的方法:利用编译器必备的辅助功能-动态调试,在编译器的动态调试引擎中增加缓存是否越界操作的分析子模块,这是目前比较有效的一种检测缓冲区是否溢出的手段。
(3)基于源代码安全分析的方法:通过对软件源代码进行逻辑分析,指出其中可能存在缓冲区溢出隐患的代码所位于的具体源代码文件和行数。该方法通常被称为静态代码分析,也可以理解为程序员编写安全代码的方法的自动实现,是程序员编写安全代码的辅助工具。静态代码分析技术可方便地集成到编译器中。静态代码分析也是目前对缓冲区溢出防范技术研究的热点之一,Fortify、ITS4、BOON、CQual、MOPS、RATS和FlawFinder等软件都已不同程度地实现了基于静态代码分析的缓冲区溢出检测。
众所周知,缓冲区溢出的本质是在计算机程序运行过程中发生的缓存越界,而程序中的函数是可能实施这种溢出操作的基本单元。一些直接对内存实施写操作的函数(例如在C/C++中的字符串操作函数)很可能最终导致缓冲区溢出。为了描述方便,本发明将这些在缓冲区溢出检测中需要重点关注的函数称为危险函数。危险函数进行的内存操作意味着可能发生缓冲区溢出的风险,这是采用静态代码分析技术检测缓冲区溢出时的基本思想。
不同的危险函数对缓存区执行不同的写操作,它们发生缓冲区溢出的情形也各不相同。比如:对于函数strcpy(dest,sour),当第二个参数的实际长度超出第一个参数分配的长度,就会出现缓冲区溢出,否则正常。而对于函数strcat(dest,sour),如果第一个参数的实际长度与第二个参数的实际长度之和超过第一个参数分配的长度,则出现缓冲区溢出,否则正常。由此可见,危险函数是否存在缓冲区溢出的判断依据是该函数的缓冲区各个变量的长度属性是否满足某个约束条件,如果满足,不会出现缓冲区溢出;否则,就出现缓冲区溢出。
参见图1,介绍基于静态代码分析检测缓冲区溢出的传统方法的四个操作步骤:定义缓冲区相关参数的长度属性、建立危险函数约束条件、生成危险函数约束关系和判断危险函数的约束关系是否成立。
下面分别简要说明这四个操作步骤的具体内容:
步骤1,定义缓冲区相关参数的长度属性:为描述危险函数的约束条件,引入以下三个参数的长度属性定义和两种分别表示缓存区参数或变量的方法:
(1)Len( )获取指定缓存区的实际使用长度(整数);
(2)Alloc( )获取指定缓存区在程序中所分配的长度(整数);
(3)Value( )获取指定变量或常量的数值(整型)。
(A)函数变量以P为开头,根据变量位置依次为P1,P2,P3,......即:f(P1,P2,P3...);
(B)赋值变量以E为开头,依次为EV,E1,E2,......。其中EV为赋值等式左端的被赋值变量;E1,E2等为赋值等式右端的变量。
再对检测过程中将会用到的C/C++库函数作以下说明:
(1)strcpy(dst,src):将变量src中的值复制到变量dst中;
(2)malloc(n):分配内存长度为n比特的内存块,其中n为待分配的内存块长度;
(3)strdup(s):复制字符串s;
(4)strcat(s,suffix):把变量s添加到变量suffix的结尾处;
(5)strncpy(dst,src,n):把变量src的前n个字节复制到变量dst之前;
(6)strncat(s,suffix,n):把变量suffix中的前n个字符添加到变量s的末尾;
(7)sprintf(dst,″%s″,src):将变量src代表的字符串写入到变量dst之前;
(8)snprintf(dst,n,″%s″,src):从变量src中拷贝n-1个字符到变量dst之前。
步骤2,建立危险函数的约束条件:使用上述长度属性定义和表示函数的参数或变量的方法就可以为危险函数建立约束条件-变量不等式,从而为所有的危险函数分别建立对应的不等式关系,组成危险函数库。下面具体说明所建立的每个危险函数(包含赋值操作)的约束关系,列表如下:
(1)对于函数strcpy(dst,src),约束条件表示为:Alloc(P1)-1≥Len(P2),即src的实际长度不得超过程序为dst所分配的缓存长度。
(2)对于函数strncpy(dst,src,n),约束条件表示为:Min(Len(P2),Value(P3))≤Alloc(P1)-1,即src的实际长度与n之间的较小者的长度不得超过程序为dst所分配的缓存长度。
(3)对于赋值操作s=″foo″,约束条件表示为:Len(E1)≤Len(Ev);Len(E1)≤Alloc(Ev),即字符串“foo“的长度不可超过变量s的长度,也不可超过程序为s分配的缓存长度。
(4)对于赋值操作p=malloc(n),约束条件表示为:Value(P1)≤Alloc(Ev),即函数对p的赋值长度不应超过n。
(5)对于赋值操作p=strdup(s),约束条件表示为:Len(P1)≤Len(Ev);Alloc(P1)≤Alloc(Ev),即s的长度不应超过程序为p所分配的长度。
(6)对于函数strcat(s,suffix),约束条件表示为:Len(P1)+Len(P2)≤Alloc(P1)-1,即s与suffix合并后,总长度不超过程序为s分配的缓存长度。
(7)对于函数strncat(s,suffix,n),约束条件表示为:Len(P1)+Min(Len(P2),Value(P3))≤Alloc(P1)-1,即suffix与n中较小值与s合并后总长度不超过程序为s分配的缓存长度。
(8)对于函数sprintf(dst,″%s″,src),约束条件表示为:Len(p3)≤Alloc(p1)-1,即src的实际长度不超过程序为dst分配的缓存长度。
(9)对于函数snprintf(dst,n,″%s″,src),约束条件表示为:Min(Len(p4),Value(P2))≤Alloc(P1),即src与n之间的较小者的长度不应超过程序为dst分配的缓存长度。
步骤3,生成危险函数的约束关系:对待检测的程序源代码进行搜索,寻找危险函数库中已被定义的危险函数。若发现危险函数,则将该函数及与其缓冲区相关的变量一起代入到与该危险函数相对应的约束条件中,形成该危险函数的约束条件,以便根据该约束条件是否成立来判断该危险函数的当前调用是否存在缓冲区溢出的危险。
步骤4,判断危险函数的约束关系是否满足:遍历整个程序的源代码,计算出各个缓存区的内存分配长度、缓存区实际可供使用长度等关键属性。但实际情况比较复杂,比如:某个变量可能被多次引用、多次赋值,甚至还可能是来自用户的输入数据;某一个变量可能是程序直接定义、也可能被另一个变量引用。对此,通常的处理方法介绍如下:
(1)对于程序相关变量实际使用长度的计算:如果危险函数缓存区的相关参数只被赋值一次,就按照该危险函数的约束条件进行处理。如果出现多次赋值,则分别记录这些赋值的长度,并选取包含这些长度的一个最小整数区间作为判断约束条件成立与否的依据,期间如果有来自用户输入的赋值,且程序本身对输入范围有限制,则选取该程序允许输入长度的最大值;若没有限制,则认为其长度为无限大。依照上述方法得到的实际使用长度是一个区间或范围。
(2)对于分配长度的计算:如果相关变量只被简单定义和分配内存,则直接记录其结果。如果缓存区的相关变量被其他变量引用,则需对该变量进行数据流分析:全程跟踪该变量的变化,求出该缓存变量的实际值,计算该实际值的分配长度。
当前缓冲区溢出的检测方法的关键问题是很难处理程序语句之间的控制关系对缓存长度属性的影响,而各语句之间的控制关系又广泛存在于程序中。如果直接应用现有检测方法,常常造成缓冲区溢出的检测误报。以下举例说明之:
if(strlen(src)>sizeof(dst))\\若变量src的长度大于缓冲区dst的长度;
     break;                \\则程序中止;
strcpy(dst,src);   \\现执行字符串拷贝函数strcpy,即将src的内容复制到dst中。
在这段程序中,当src的长度大于dst的长度时,通常的检测方法会对其报警,但实际上这时并没有发生缓冲区溢出。因为当程序检测到src的长度大于dst时,就会自动中止,不再继续执行,所以也就不会产生缓冲区溢出。这个例子说明:当出现如同if这样的可以控制或改变程序运行状况的语句时,现有的检测方法就无法精确地检测缓冲区溢出危险。所以,现有的缓冲区溢出检测方法,在处理程序控制关系影响缓存长度属性及其它问题上,不仅影响程序的运行效率,还会因各种原因缺乏信息交互而发生相当数量的误报,因此对缓冲区溢出的检测方法如何进行改进,就成为业内人士研究、开发的新课题。
发明内容
有鉴于此,本发明的目的是针对现有的缓冲区溢出检测技术存在的不足,提供一种面向源代码的基于不等式组求解的检测缓冲区溢出的方法,该方法是基于静态代码分析技术和不等式自动证明理论,充分利用传统技术并加以发展、创新而研制成功的,能够克服以往静态代码分析技术的不足,较好地解决了现有方法在处理程序控制关系时,对缓存区变量或参数的长度属性的影响无法准确把握的缺陷,有效降低了缓冲区溢出漏洞检测的误报率。
为了达到上述目的,本发明提供了一种面向源代码的基于不等式组求解的缓冲区溢出检测方法,其特征在于,包括下列操作步骤:
(1)为描述危险函数的约束条件进行初始化设置:定义缓冲区相关参数的长度属性,规定缓存区中的参数或变量的表示方法,并对包括赋值操作的多个C/C++库函数分别建立其发生缓存溢出的不等式约束条件;
(2)对输入的程序源代码进行词法和语法解析并生成程序依赖图:在利用词法分析识别出的词法单元的基础上,进行语法分析,以便得到抽象语法树,即程序结构的树形表示;再从该抽象语法树中提取出危险函数及其相关的指针,用作后续分析的基础;然后对程序分别进行数据流分析和控制流分析,提取代码中包括指针变量、内存块、常量、函数结构的数据依赖的相关信息,获取程序中的相关语句之间的控制依赖关系,生成对应的程序依赖图;
(3)根据危险函数库中发生缓冲区溢出的不等式约束条件,在程序依赖图中查找有关危险函数调用的语句:如果没有发现危险函数调用,则判定该程序没有缓冲区溢出的风险,并结束检测流程;如果发现有危险函数调用,则要分别对每个危险函数执行后续操作步骤;
(4)针对当前查找到的危险函数,在程序依赖图中查找与该危险函数有数据依赖或控制依赖关系的语句,形成依赖语句序列,即不等式组:通过程序控制依赖图,对每个危险函数的调用分别生成一个依赖语句序列,该序列中的依赖语句与该危险函数之间存在有数据依赖、控制依赖、或同时存在数据依赖和控制依赖的关系;
(5)验证发生缓冲区溢出的不等式的约束条件是否成立:将判断危险函数不等式约束条件是否成立的问题转化为判断步骤(4)中的不等式组是否有解;如果不等式组有解,即满足约束条件,则不存在缓冲区溢出;否则,认为存在缓冲区溢出风险,并输出存在缓冲区溢出的告警信息。
本发明是一种基于不等式组求解的检测源代码中发生缓冲区溢出的方法,它是在现有的检测缓冲区溢出技术的基础上进行改进的,该方法利用数据流和控制流分析等静态代码的分析技术,将缓冲区溢出的检测最终归结为查找与该危险函数有数据依赖或控制依赖关系的语句,再形成依赖语句序列(不等式组),并对危险函数约束关系的不等式组求解的问题。该方法的操作步骤简单、清楚,通过试验实施和仿真分析,本发明有效改进了缓冲区溢出的检测效率。
附图说明
图1是基于静态代码分析检测缓冲区溢出的传统方法的操作流程图。
图2是本发明面向源代码的基于不等式组求解的缓冲区溢出检测方法的操作流程图。
图3是程序依赖图的示例。
图4是采用本发明基于不等式组求解的检测程序源代码中缓冲区溢出方法的详细操作步骤图。
图5是本发明用于软件开发中检测缓冲区溢出的操作过程示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步的详细描述。
参见图2,具体介绍本发明面向源代码的基于不等式组求解的缓冲区溢出检测方法,该方法包括下列操作步骤:
(1)为描述危险函数的约束条件进行初始化设置;
该步骤的具体操作内容是:定义缓冲区相关参数的长度属性,规定缓存区中的参数或变量的表示方法,并对包括赋值操作的多个C/C++库函数分别建立其发生缓存溢出的不等式约束条件。因为该步骤的操作内容与传统方法的步骤1和步骤2基本相同,这里不再赘述。
(2)对输入的程序源代码进行词法和语法解析并生成程序依赖图;
该步骤的具体操作内容是:先在词法分析识别出的词法单元的基础上,进行语法分析,以便得到抽象语法树,即程序结构的树形表示;再从该抽象语法树中提取出所有的危险函数及其包括指针和其它相关的缓存参数信息,用作后续分析的基础;然后对程序分别进行数据流分析和控制流分析,提取代码中包括指针变量、内存块、常量、函数结构的数据依赖的相关信息,获取程序中的相关语句之间的控制依赖关系,生成对应的程序依赖图。
程序依赖图是一种表示程序中的各个语句之间依赖关系的简单图形,程序依赖图中的节点对应于源代码中的语句,各个节点之间的连接线表明相关语句之间的依赖关系,以便用简单、清晰的图形表示各个语句之间存在的控制依赖或数据依赖的关系。例如,若语句节点s引用了语句节点t处定义或修改的变量,且存在一条从t到s的可执行路径,则称语句节点s的数据依赖于语句节点t;相应地,如果t还是满足这种关系的最近语句,则在依赖图中存在一条以t为起点、s为终点的数据依赖连接线;也就是存在一条以t为起点、s为终点的数据依赖路径。类似地,若语句s的能否执行取决于语句t,则称语句s控制依赖于语句t,在程序依赖图上存在一条以t为起点、s为终点的控制依赖连接线或控制依赖路径。对每个程序执行过程,均有一个入口节点控制该程序执行过程内所有语句的运行。
参见图3,再用前述例子说明数据依赖和控制依赖个含义:
S1:if(strlen(src)>sizeof(dst))  \\若变量src长度大于缓冲区dst的长度;
S2:break;                       \\则程序中止;
S3:strcpy(dst,src);\\现执行字符串拷贝函数strcpy,即将src的内容复制到dst中。
图3是由三个语句S1、S2、S3组成的程序依赖图,其中,由于语句S1括号中的条件成立与否直接控制语句S2的能否执行,所以语句S1与S2之间存在控制关系,有一条控制依赖路径(图中用实线表示之):由S1指向S2。由于语句S3里的变量dst与src都来自语句S1,所以它们之间存在一条数据依赖路径(图中用虚线表示之):由S1指向S3。
(3)根据危险函数库中发生缓冲区溢出的不等式约束条件,在程序依赖图中查找有关危险函数调用的语句;
该步骤的具体操作内容是:如果没有发现危险函数调用,则判定该程序没有缓冲区溢出的风险,并结束检测流程;如果发现有危险函数调用,则要分别对每个危险函数执行后续操作步骤。
(4)针对当前查找到的危险函数,在程序依赖图中查找与该危险函数有数据依赖或控制依赖关系的语句,形成依赖语句序列,即不等式组;
该步骤的具体操作内容是:通过程序控制依赖图,对每个危险函数的调用都生成一个依赖语句序列,构成不等式组;该序列中的依赖语句与该危险函数之间存在有数据依赖、控制依赖、或同时存在数据依赖和控制依赖的关系。
每个危险函数的调用所生成的依赖语句序列中的语句,对危险函数的指针的影响有以下三种情况:
(41)赋值:通过赋值改变危险函数缓冲区参数的属性,造成属性改变的具体原因包括:内存分配、指针引用、以及在缓冲器中读写数据。
(42)函数调用:如果涉及某个危险函数的指针的依赖函数也是危险函数,则会形成一个涉及多个缓冲区的相关参数(包括数组、指针等)的多元不等式组;如果与当前危险函数有依赖关系的函数是自定义的非危险函数,则要进一步分析该函数的代码,继续查找是否存在危险函数,并记录所找到的危险函数。
(43)控制关系:如果控制关系不牵涉当前危险函数的缓冲区,则该控制关系与当前危险函数的缓冲区参数之间没有相互制约关系;否则,就要对该控制关系的逻辑表达式进行解析。而对控制关系的逻辑表达式进行的解析包括下列具体操作内容:
假设通过程序依赖图中的依赖语句序列查找到有m个危险函数,共生成m个不等式制约关系,则该m个不等式制约关系总共与该危险函数中的n个长度变量相关,即这些危险函数中与缓冲区溢出有关系的长度变量共有n个,并将这些不等式描述为如下的不等式组: a 11 x 1 + a 12 x 2 + . . . + a 1 n x n ≥ a 1 a 21 x 1 + a 22 x 2 + . . . + a 2 n x n ≥ a 2 · · · · · · a m 1 x 1 + a m 2 x 2 + . . . + a mn x n ≥ a m x 1 , x 2 , . . . , x n ≥ 0 ;
其中,每个不等式分别代表该程序中的一个危险函数的约束关系,xi是各个危险函数中涉及缓冲区溢出的各个长度变量,自然数i是长度变量的序号,i的取值范围是[1,n];aj.i是这些危险函数中的长度变量的系数,自然数j是不等式的序号,j的取值范围是[1,m];aj是上述各个不等式生成过程中产生的常数;为描述的简便,将上述不等式组中的各个系数提取出来,组成系数行列式A,再将所有的长度变量xi提取出来组成变量行列式X,表示如下:
A = a 11 a 12 · · · a 1 n a 21 a 22 · · · a 2 n · · · · · · · · · · · · a m 1 a m 2 · · · a mn , a = a 1 a 2 · · · a m T , X = x 1 x 2 · · · x m T , 其中T表示矩阵的转置,即把矩阵中每个元素的行列数互换,将所有aj.i变为ai.j
(5)验证发生缓冲区溢出的不等式的约束条件是否成立;
该步骤的具体操作内容是:将判断危险函数不等式约束条件是否成立的问题转化为判断步骤(4)中的不等式组是否有解;如果不等式组有解,即满足约束条件,则不存在缓冲区溢出;否则,认为存在缓冲区溢出风险,并输出存在缓冲区溢出的告警信息。
而判断步骤(4)中的不等式组是否有解的实质是判断该不等式组中的各个不等式之间是否存在公共解。为此,采用线性规划中的“单纯形法”来自动验证上述不等式组是否存在公共解,即判断该不等式组的最优化问题,也就是判断表达式 Min = 0 s . t . AX ≥ a X ≥ 0 的可行域是否为空;该表达式 Min = 0 s . t . AX ≥ a X ≥ 0 是采用单纯形法将所述不等式组转换后的标准形式,其中,Min=0表示这是一个极小化问题,s.t.后面为满足Min=0条件的约束条件;若可行域为空,表示各个不等式组没有共同解,则输出可能发生缓存区溢出的告警信息;若可行域不为空,则不存在缓冲区溢出。
图4展示了采用本发明基于不等式组求解的检测程序源代码中缓冲区溢出方法的详细操作步骤图。
本发明主要供软件开发企业的技术人员使用,以便对已经开发完成的源代码进行检测,从中查找出潜伏存在的缓冲区溢出风险,并进行改进,使得程序运行更加顺畅。图5是本发明用于软件开发中检测缓冲区溢出风险的操作流程。

Claims (6)

1、一种面向源代码的基于不等式组求解的缓冲区溢出检测方法,其特征在于,包括下列操作步骤:
(1)为描述危险函数的约束条件进行初始化设置:定义缓冲区相关参数的长度属性,规定缓存区中的参数或变量的表示方法,并对包括赋值操作的多个C/C++库函数分别建立其发生缓存溢出的不等式约束条件;
(2)对输入的程序源代码进行词法和语法解析并生成程序依赖图:在利用词法分析识别出的词法单元的基础上,进行语法分析,以便得到抽象语法树,即程序结构的树形表示;再从该抽象语法树中提取出危险函数及其相关的指针,用作后续分析的基础;然后对程序分别进行数据流分析和控制流分析,提取代码中包括指针变量、内存块、常量、函数结构的数据依赖的相关信息,获取程序中的相关语句之间的控制依赖关系,生成对应的程序依赖图;
(3)根据危险函数库中发生缓冲区溢出的不等式约束条件,在程序依赖图中查找有关危险函数调用的语句:如果没有发现危险函数调用,则判定该程序没有缓冲区溢出的风险,并结束检测流程;如果发现有危险函数调用,则要分别对每个危险函数执行后续操作步骤;
(4)针对当前查找到的危险函数,在程序依赖图中查找与该危险函数有数据依赖或控制依赖关系的语句,形成依赖语句序列,即不等式组:通过程序控制依赖图,对每个危险函数的调用分别生成一个依赖语句序列,该序列中的依赖语句与该危险函数之间存在有数据依赖、控制依赖、或同时存在数据依赖和控制依赖的关系;
(5)验证发生缓冲区溢出的不等式的约束条件是否成立:将判断危险函数不等式约束条件是否成立的问题转化为判断步骤(4)中的不等式组是否有解;如果不等式组有解,即满足约束条件,则不存在缓冲区溢出;否则,认为存在缓冲区溢出风险,并输出存在缓冲区溢出的告警信息。
2、根据权利要求1所述的缓冲区溢出检测方法,其特征在于:所述程序依赖图是一种用图形表示程序中的各个语句间的依赖关系的方法,程序依赖图中的节点对应于源代码中的语句,各个节点之间的连接线表明相关语句之间的依赖关系,以便用清晰的图形表示各个语句之间存在的控制依赖或数据依赖的关系。
3、根据权利要求1所述的缓冲区溢出检测方法,其特征在于:每个危险函数的调用所生成的程序语句序列中的语句,对危险函数的指针的影响有以下三种情况:
(41)赋值:通过赋值改变危险函数缓冲区参数的属性,造成属性改变的原因包括:内存分配、指针引用、以及在缓冲器中读写数据;
(42)函数调用:如果涉及某个危险函数的指针的依赖函数也是危险函数,则会形成一个涉及多个缓冲区的包括数组、指针和其他相关参数的多元不等式组;如果与当前危险函数有依赖关系的函数是自定义函数,则要进一步分析该函数的代码,继续查找是否存在危险函数,并记录所找到的危险函数;
(43)控制关系:如果控制关系不牵涉当前危险函数的缓冲区,则该控制关系与当前危险函数的缓冲区参数之间没有相互制约关系;否则,就要对该控制关系的逻辑表达式进行解析。
4、根据权利要求3所述的缓冲区溢出检测方法,其特征在于:所述对控制关系的逻辑表达式进行的解析包括下列具体操作内容:
假设通过程序依赖图中的依赖语句序列查找到有m个危险函数,共生成m个不等式制约关系,则该m个不等式制约关系总共与该危险函数中的n个长度变量相关,即这些危险函数中与缓冲区溢出有关系的长度变量共有n个,并将这些不等式描述如下的不等式组: a 11 x 1 + a 12 x 2 + . . . + a 1 n x n ≥ a 1 a 21 x 1 + a 22 x 2 + . . . + a 2 n x n ≥ a 2 · · · · · · a m 1 x 1 + a m 2 x 2 + . . . + a mn x n ≥ a m x 1 , x 2 , . . . , x n ≥ 0 ;
其中,xi是各个危险函数中涉及缓冲区溢出的各个长度变量,自然数i是长度变量的序号,i的取值范围是[1,n];aj.i是这些危险函数中的长度变量的系数,自然数j是不等式的序号,j的取值范围是[1,m];aj是上述各个不等式生成过程中产生的常数;为描述的简便,将上述不等式组中的各个系数提取出来,组成系数行列式A,再将所有的长度变量xi提取出来组成变量行列式X,表示如下:
A = a 11 a 12 · · · a 1 n a 21 a 22 · · · a 2 n · · · · · · · · · · · · a m 1 a m 2 · · · a mn , a = a 1 a 2 · · · a m T , X = x 1 x 2 · · · x m T , 其中T表示矩阵的转置,即把矩阵中每个元素的行列数互换,将所有aj.i变为ai.j
5、根据权利要求1所述的缓冲区溢出检测方法,其特征在于:所述判断步骤(4)中的不等式组是否有解的实质是判断该不等式组中的各个不等式之间是否存在公共解。
6、根据权利要求1或5所述的缓冲区溢出检测方法,其特征在于:所述步骤(5)的具体操作内容是应用线性规划中的“单纯形法”来自动验证所述不等式组是否存在公共解,即判断该不等式组的最优化问题,也就是判断表达式 Min = 0 s . t . AX ≥ a X ≥ 0 的可行域是否为空;该表达式 Min = 0 s . t . AX ≥ a X ≥ 0 是采用单纯形法将所述不等式组转换后的标准形式,其中,Min=0表示这是一个极小化问题,s.t.后面为满足Min=0条件的约束条件;若可行域为空,表示各个不等式组没有共同解,则输出可能发生缓存区溢出的告警信息;若可行域不为空,则不存在缓冲区溢出。
CNA2008100577579A 2008-02-15 2008-02-15 面向源代码的基于不等式组求解的缓冲区溢出检测方法 Pending CN101241532A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CNA2008100577579A CN101241532A (zh) 2008-02-15 2008-02-15 面向源代码的基于不等式组求解的缓冲区溢出检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNA2008100577579A CN101241532A (zh) 2008-02-15 2008-02-15 面向源代码的基于不等式组求解的缓冲区溢出检测方法

Publications (1)

Publication Number Publication Date
CN101241532A true CN101241532A (zh) 2008-08-13

Family

ID=39933059

Family Applications (1)

Application Number Title Priority Date Filing Date
CNA2008100577579A Pending CN101241532A (zh) 2008-02-15 2008-02-15 面向源代码的基于不等式组求解的缓冲区溢出检测方法

Country Status (1)

Country Link
CN (1) CN101241532A (zh)

Cited By (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101866406A (zh) * 2010-06-18 2010-10-20 中国科学院软件研究所 一种栈溢出攻击防御方法
CN101727391B (zh) * 2009-12-14 2011-11-09 北京理工大学 一种软件漏洞特征操作序列的提取方法
CN101739337B (zh) * 2009-12-14 2012-06-20 北京理工大学 一种基于聚类的软件漏洞序列特征的分析方法
CN101571828B (zh) * 2009-06-11 2012-07-04 北京航空航天大学 基于约束分析和模型检验的代码安全漏洞检测方法
CN101901184B (zh) * 2009-05-31 2012-09-19 西门子(中国)有限公司 检查应用程序漏洞的方法、装置和系统
CN101937388B (zh) * 2009-12-17 2013-03-13 一种高可扩展性和可维护性的源代码缺陷检测方法及装置
CN103294517A (zh) * 2012-02-22 2013-09-11 国际商业机器公司 堆栈溢出保护装置、堆栈保护方法、相关编译器和计算装置
CN104573503A (zh) * 2015-02-11 2015-04-29 中国农业银行股份有限公司 一种内存访问溢出的检测方法及装置
CN104933360A (zh) * 2015-05-21 2015-09-23 中国科学院信息工程研究所 基于程序依赖图的Android平台仿冒应用检测方法
CN105279429A (zh) * 2015-11-24 2016-01-27 无锡江南计算技术研究所 一种got表写保护的保护方法
CN106033516A (zh) * 2015-03-18 2016-10-19 中国移动通信集团陕西有限公司 一种检测终端源代码安全的方法、装置及系统
US9626368B2 (en) 2012-01-27 2017-04-18 International Business Machines Corporation Document merge based on knowledge of document schema
CN107038380A (zh) * 2017-04-14 2017-08-11 华中科技大学 一种基于程序特征树的漏洞检测方法及系统
CN107480523A (zh) * 2017-08-17 2017-12-15 郑州云海信息技术有限公司 一种Intel并Linux64平台上缓冲区溢出利用方法
CN107516040A (zh) * 2017-07-25 2017-12-26 中国人民解放军63928部队 一种基于数据控制流图的脆弱性特征分析和获取方法
CN107895115A (zh) * 2017-12-04 2018-04-10 北京元心科技有限公司 防止栈溢出的方法、装置及终端设备
CN108319858A (zh) * 2018-01-29 2018-07-24 中国科学院信息工程研究所 针对不安全函数的数据依赖图构建方法及装置
CN109033843A (zh) * 2018-08-02 2018-12-18 南瑞集团有限公司 用于分布式静态检测系统的Java文件依赖性分析方法及模块
CN116226673A (zh) * 2023-05-05 2023-06-06 中国人民解放军国防科技大学 缓冲区漏洞识别模型的训练方法、漏洞检测方法及装置

Cited By (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101901184B (zh) * 2009-05-31 2012-09-19 西门子(中国)有限公司 检查应用程序漏洞的方法、装置和系统
CN101571828B (zh) * 2009-06-11 2012-07-04 北京航空航天大学 基于约束分析和模型检验的代码安全漏洞检测方法
CN101727391B (zh) * 2009-12-14 2011-11-09 北京理工大学 一种软件漏洞特征操作序列的提取方法
CN101739337B (zh) * 2009-12-14 2012-06-20 北京理工大学 一种基于聚类的软件漏洞序列特征的分析方法
CN101937388B (zh) * 2009-12-17 2013-03-13 一种高可扩展性和可维护性的源代码缺陷检测方法及装置
CN101866406A (zh) * 2010-06-18 2010-10-20 中国科学院软件研究所 一种栈溢出攻击防御方法
US9626368B2 (en) 2012-01-27 2017-04-18 International Business Machines Corporation Document merge based on knowledge of document schema
US9740698B2 (en) 2012-01-27 2017-08-22 International Business Machines Corporation Document merge based on knowledge of document schema
CN103294517A (zh) * 2012-02-22 2013-09-11 国际商业机器公司 堆栈溢出保护装置、堆栈保护方法、相关编译器和计算装置
CN103294517B (zh) * 2012-02-22 2018-05-11 国际商业机器公司 堆栈溢出保护装置、堆栈保护方法、相关编译器和计算装置
US9734039B2 (en) 2012-02-22 2017-08-15 International Business Machines Corporation Stack overflow protection device, method, and related compiler and computing device
CN104573503A (zh) * 2015-02-11 2015-04-29 中国农业银行股份有限公司 一种内存访问溢出的检测方法及装置
CN104573503B (zh) * 2015-02-11 2018-04-27 中国农业银行股份有限公司 一种内存访问溢出的检测方法及装置
CN106033516A (zh) * 2015-03-18 2016-10-19 中国移动通信集团陕西有限公司 一种检测终端源代码安全的方法、装置及系统
CN106033516B (zh) * 2015-03-18 2019-04-23 中国移动通信集团陕西有限公司 一种检测终端源代码安全的方法、装置及系统
CN104933360A (zh) * 2015-05-21 2015-09-23 中国科学院信息工程研究所 基于程序依赖图的Android平台仿冒应用检测方法
CN104933360B (zh) * 2015-05-21 2018-05-18 中国科学院信息工程研究所 基于程序依赖图的Android平台仿冒应用检测方法
CN105279429A (zh) * 2015-11-24 2016-01-27 无锡江南计算技术研究所 一种got表写保护的保护方法
CN105279429B (zh) * 2015-11-24 2018-01-19 无锡江南计算技术研究所 一种got表写保护的保护方法
CN107038380B (zh) * 2017-04-14 2019-07-05 华中科技大学 一种基于程序特征树的漏洞检测方法及系统
CN107038380A (zh) * 2017-04-14 2017-08-11 华中科技大学 一种基于程序特征树的漏洞检测方法及系统
CN107516040A (zh) * 2017-07-25 2017-12-26 中国人民解放军63928部队 一种基于数据控制流图的脆弱性特征分析和获取方法
CN107480523A (zh) * 2017-08-17 2017-12-15 郑州云海信息技术有限公司 一种Intel并Linux64平台上缓冲区溢出利用方法
CN107895115A (zh) * 2017-12-04 2018-04-10 北京元心科技有限公司 防止栈溢出的方法、装置及终端设备
CN108319858A (zh) * 2018-01-29 2018-07-24 中国科学院信息工程研究所 针对不安全函数的数据依赖图构建方法及装置
CN108319858B (zh) * 2018-01-29 2020-07-10 中国科学院信息工程研究所 针对不安全函数的数据依赖图构建方法及装置
CN109033843A (zh) * 2018-08-02 2018-12-18 南瑞集团有限公司 用于分布式静态检测系统的Java文件依赖性分析方法及模块
CN109033843B (zh) * 2018-08-02 2022-06-10 南瑞集团有限公司 用于分布式静态检测系统的Java文件依赖性分析方法及模块
CN116226673A (zh) * 2023-05-05 2023-06-06 中国人民解放军国防科技大学 缓冲区漏洞识别模型的训练方法、漏洞检测方法及装置
CN116226673B (zh) * 2023-05-05 2023-07-07 中国人民解放军国防科技大学 缓冲区漏洞识别模型的训练方法、漏洞检测方法及装置

Similar Documents

Publication Publication Date Title
CN101241532A (zh) 面向源代码的基于不等式组求解的缓冲区溢出检测方法
US11087002B2 (en) Using the same query language for static and dynamic application security testing tools
Chen et al. Learning to prioritize test programs for compiler testing
US10664601B2 (en) Method and system automatic buffer overflow warning inspection and bug repair
Russo et al. Dynamic vs. static flow-sensitive security analysis
CN102622558B (zh) 一种二进制程序漏洞的挖掘装置和方法
Liao et al. SmartDagger: a bytecode-based static analysis approach for detecting cross-contract vulnerability
CN102110051B (zh) 应用程序切片技术的静态缺陷检测方法
CN101908006B (zh) 一种基于gcc抽象语法树的缓冲区溢出漏洞检测方法
CN104765687A (zh) 基于对象跟踪和污点分析的j2ee程序漏洞检测方法
US8732676B1 (en) System and method for generating unit test based on recorded execution paths
Wu et al. Mutation testing for ethereum smart contract
CN109101815A (zh) 一种恶意软件检测方法及相关设备
CN111753303A (zh) 一种基于深度学习和强化学习的多粒度代码漏洞检测方法
CN111695119A (zh) 一种基于细粒度静态污点分析与符号执行的web漏洞检测方法
CN114996126B (zh) 一种针对eosio智能合约的漏洞检测方法及系统
CN101853200A (zh) 一种高效动态软件漏洞挖掘方法
Zhao et al. A new framework of security vulnerabilities detection in PHP web application
CN114201754A (zh) 一种基于符号抽象分析的智能合约安全审计方法
CN115408689A (zh) 一种重入漏洞的检测与修复方法、系统
Linoy et al. EtherProv: Provenance-aware detection, analysis, and mitigation of Ethereum smart contract security issues
CN110162472A (zh) 一种基于fuzzing测试的测试用例生成方法
Huang et al. Revealing Hidden Threats: An Empirical Study of Library Misuse in Smart Contracts
Shin et al. Sqlunitgen: Sql injection testing using static and dynamic analysis
CN116361808A (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
C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication

Open date: 20080813