论文部分内容阅读
随着软件规模的不断增大,软件研发时间与软件中存在的漏洞也在不断增加。在软件研发过程中,使用静态分析软件对于已经开发的程序代码进行分析,可有效发现程序中存在的后期代码审查时难以发现的漏洞、提高软件代码质量并缩短研发周期。本文的工作就是为一款针对C语言的静态分析工具设计后端语义模型和基于语义模型的跨过程分析模式,使得该C语言静态分析工具能够在建检测多种目标漏洞的情况下保持软件的分析效率。本文首先对目标漏洞做了分类,把要检测的软件漏洞分类三类:内存漏洞、危险函数漏洞和污染传播漏洞。然后分析出要检测这些漏洞需要收集的程序语义信息,之后再根据这些语义信息设计语义模型,用于表示静态分析时的程序状态。具体而言,本文针对检测内存漏洞和危险函数漏洞需要收集的语义信息设计并实现了变量符号条目、内存对象、值对象的三元组模型;针对检测污染传播漏洞需要收集的语义信息设计了基于BDD的元组集合模型。将这两种模型结合使用来表示静态分析软件检测三类漏洞时的程序状态。接着根据上述语义模型设计了静态分析软件后端对目标代码控制流图进行数据流分析时的遍历框架。在这个框架下,后端进行控制流图遍历时需要将控制流图节点和分析到该节点时的语义模型状态进行绑定。在分支节点状态分为两份,节点根据真假分支各绑定一份状态表示路径分裂。在函数的末尾,所有分支节点的末状态进行合并,为后续的函数模式总结打下基础。当静态分析软件分析到函数调用语句时,在不加约束的情况下进行跨过程分析十分容易导致路径爆炸,这也是影响静态分析软件后端分析效率的重要因素。本文从两个角度来避免这种分析函数调用语句时直接的跨过程分析。一是对于通过配置可得知其功能的函数,预先读取其配置信息对该函数参数进行处理或检查来实现该函数的功能以避免直接的跨过程分析;二是在后端分析过程中,根据已有信息对函数的入口出口状态进行总结形成模式,在对被调用函数进行分析之前查询已有模式进行模式匹配和模式重用,通过这种方式来避免对于一般函数的多次直接跨过程分析。本文为函数对指针指向关系的处理建立函数指针模式,通过使用抽象标号来模拟函数入口处的指针指向关系,为函数入口出口指针指向关系做映射,以此来表示函数对于多重指针参数、全局指针变量的指针指向关系处理行为。为函数对一般值(整形值、污染变量、字符串值)的处理建立函数值模型,为函数入口参数值和全局变量值、出口返回值和全局变量值建立映射关系,形成值模式来表示函数对于一般值的处理行为。为了验证本文上述设计的有效性,本文对设计实现的静态分析工具进行了功能测试和效率测试,测试最终达到了预期的效果。软件实现了应有的漏洞检测功能并在同时兼顾了效率。