论文部分内容阅读
在现代软件工程中,代码安全成为人们不容忽视的问题,为了保证代码安全,一系列代码分析方法被提出。但过程间分析还存在很多不足,如今过程间分析大致分为两种,一种是通过函数内联的过程间分析,一种是基于函数摘要的过程间分析。传统的基于函数摘要的过程间分析为了实现上下文敏感特性需要消耗大量的内存,并且只能提取特定漏洞对应的函数信息。相较于传统的函数摘要方法,符号化函数摘要方法对每个函数只收集一份儿符号化的函数摘要,内存开销比较低,但是现有的符号化函数摘要方法不具有路径敏感的特点,并且也不具有良好的扩展性。本文基于传统的符号化函数摘要模型并结合符号执行方法提出了一种基于状态的路径敏感的符号化函数摘要算法。该算法使用符号化的程序状态作为函数的摘要信息,程序状态中存储该程序状态需要满足的路径条件,路径条件使用一组命题逻辑公式来表示函数中各个分支及其对应的路径条件信息。该算法分为函数摘要的创建,函数摘要的实例化以及函数摘要的应用三个部分。的创建过程就是对函数进行过程内分析的过程,在对某条路径分析结束时收集符号化的程序状态作为函数的摘要信息。在过程内分析过程中,将由于依赖于上下文环境信息而无法确定的报错信息进行记录,在应用函数摘要时进行延迟报错。对于函数摘要的实例化来说,就是在函数调用点使用上下文环境信息对函数摘要中符号化的信息进行实例化,根据实例化的路径条件选择有效的程序状态作为有效的函数摘要。对于函数摘要的应用来说,就是将有效的函数摘要对应的副作用应用到调用点对应的上下文环境中,并根据具体情况进行延迟报错。另外,本文提出了一种基于抽象语法树(Abstract Syntex Tree,AST)序列化存储的跨文件分析算法,该算法首先对编译单元进行编译,收集各编译单元的AST并进行序列化存储。在过程内分析的过程中,在遇到外部函数调用时,将被调用函数对应的AST进行逆序列化,然后创建被调用函数对应的控制流图(Control Flow Graph,CFG),从而完成后续的过程间分析。最后本文基于Clang静态分析平台,对基于状态的路径敏感的符号化函数摘要算法以及基于AST序列化存储到跨文件分析算法进行了实现,并进行了实验对比,实验表明基于状态的路径敏感的符号化函数摘要算法和基于AST序列化存储的跨文件分析算法具有一定的优越性。