本文是一篇软件工程硕士论文,本文从缓冲区溢出漏洞检测过程中存在的问题出发,针对缓冲区溢出漏洞检测中存在的特征向量提取精度不高、检测结果准确率低等问题,提出一种基于源代码进行代码切片的构造方法。
第1章 绪论
1.1 课题研究背景及意义
伴随互联网科技的蓬勃发展,软件产品的种类和数量呈现出显著增长的态势。随着软件体系规模持续扩大,软件安全性问题逐渐凸显。这些问题表现在用户隐私泄露、权限非法篡改以及网络平台遭受恶意入侵等多个方面,对人们的日常生活、国家安全甚至社会秩序构成严重威胁。根据2024年新发布的《第52次中国互联网络发展状况统计报告》,截止当年九月,中国网民规模已达到了十点六七亿,网络覆盖率已接近百分之七十九点四,互联网的普及进一步推动了软件数量和规模的增长[1]。软件程序规模的持续扩大,软件安全问题也呈现出增长状态,导致软件安全风险日益凸显。安全问题不仅局限于软件自身的功能性障碍,更关乎用户数据保护、系统防护乃至公众日常生活与网络环境的整体安全性。软件安全漏洞本质上源于开发过程中的种种因素所致,这些问题一旦被恶意攻击者所利用,极易成为实施违法违规行为的途径[3]。在众多类型的安全漏洞中,缓冲区溢出漏洞尤为突出,以其高危性与普遍性备受关注。
自1988年以来,缓冲区溢出漏洞作为软件安全领域中极具威胁性的一种漏洞首次引起广泛关注[2]。缓冲区溢出漏洞,作为一种隐蔽且破坏力巨大的安全威胁,最初在计算机科学和网络安全领域并未得到应有的重视。在20世纪80年代末,随着个人电脑和网络的普及,计算机系统开始面临前所未有的安全挑战。1988年的莫里斯蠕虫事件是一个转折点,它不仅揭露了缓冲区溢出攻击的潜在威力,还促使了学术界、工业界乃至政府机构对网络安全的深刻反思和积极应对。莫里斯蠕虫利用Unix系统中的守护进程机制传播缓冲区溢出漏洞,在当时给美国政府带来巨大的经济损失[4]。根据2022年国家信息安全漏洞数据库(CNNVD)收集的数据,缓冲区溢出漏洞在漏洞类型分布中占比达11.37%[5]。缓冲区溢出漏洞全球普遍存在其严重性,导致系统崩溃、拒绝服务、未经授权的恶意操作以及权限滥用引发的异常行为。
1.2 国内外研究现状
1.2.1 基于静态检测方法的缓冲区溢出漏洞检测研究现状
静态分析是目前主要的缓冲区溢出漏洞检测方法,大多数静态分析是基于源代码进行分析研究的,不需要对程序进行运行[7]。这些检测方法通过从源代码中获取的信息(声明的变量、函数调用关系等)分析出存在漏洞的代码,而对于得到的结果还需要人工去判断其正确性。
在基于静态分析方法的研究中,Wagner等[8]通过对缓冲区增加自定义的属性,并对每一个访问漏洞的位置形成对应约束的方式,最终把漏洞的检测问题替换成了求解整数约束,如果求解约束得到的结果不能满足相关条件,则说明存在缓冲区溢出漏洞,需要进行报告,但是此方法中需要对每一个访问漏洞的位置形成对应约束,增加了复杂性和计算成本,并且求解整数约束会耗费大量的计算资源和时间,影响检测效率。Larochelle等[9]在静态分析的基础上,使用LCLint工具来对有导致缓冲区出现异常的函数进行标注,当该函数被使用时,可以通过对约束是否满足条件进行分析来判断是否存在缓冲区溢出漏洞,但是实验证明,工具的精度较低,无法准确判断是否存在缓冲区溢出漏洞,导致漏报或误报的情况,并且对有导致异常的函数进行标注需要人工干预,增加了工作量和的主观误差。宫云战等[10]首先对函数摘要进行计算,之后使用区间运算方法对变量的取值进行分析,最后基于函数取值范围信息与函数摘要运算结果之间的比较,判断是否有漏洞出现,此方法区间运算方法对复杂程序不够准确,存在一定的误差,并且基于函数取值范围信息与函数摘要运算结果之间的比较不能够准确判断是否有漏洞出现。
第2章 相关理论与技术分析
2.1 缓冲区溢出漏洞原理
缓冲区指的是在内存中分配的一段连续的存储区域,用于暂时存储数据。缓冲区溢出漏洞是一种常见的软件漏洞,其原理是在程序中输入的数据超出了程序为其分配的内存缓冲区的容量,导致数据溢出到相邻的内存区域[34]。这种溢出可以被恶意攻击者利用,通过精心构造的数据输入,导致程序崩溃或出现安全漏洞,攻击者能够利用漏洞控制应用程序的执行流程,进而控制整个系统,从而实现恶意操作,如执行任意代码或提升权限。缓冲区溢出的原理如图2.1所示。

程序运行时,为了存储变量及临时数据,内存中需预设特定缓冲区。攻击者可借由向程序注入特制恶意信息,操纵其写入内存操作。这种方式会影响程序的执行过程,从而实现攻击的目的。为了更好地理解缓冲区溢出漏洞,通过一个简单的C语言函数代码示例来说明。如图2.2所示。图中的这段代码属于栈溢出。在这个示例中,accessArray函数用于访问数组元素,并将索引和值打印出来。当main函数中的for循环试图访问数组arr中索引为0到5的元素。其中访问索引5的时候,由于里面只存在索引0到4,并没有索引5,所以导致数组越界,就会导致缓冲区溢出。出现这种情况的时候,有对其他数据造成影响,引发一些其他的问题。
2.2 文本表示技术
2.2.1 N-gram模型
N-gram模型是自然语言处理领域中一种广泛应用的统计语言模型。它的核心思想是基于前n-1个词语的概率分布来预测下一个词语的出现概率。具体而言,N-gram模型通过对文本数据的统计分析,学习到不同词语序列出现的频率,进而估计给定前n-1个词语的情况下,第n个词语出现的概率[35]。在N-gram模型中,n表示使用多少个连续的单词(或字符)来预测下一个单词或字符。
在自然语言处理中,N-gram模型通常用于语言建模、文本生成、自动文本纠错和信息检索等自然语言处理任务中。通过统计文本数据中不同N-gram的出现频率和概率分布,N-gram模型可以帮助理解文本的结构和语言规律,从而实现自动化的文本处理和分析。在N-gram模型中,每个单词的出现概率取决于前面n-1个单词的历史信息[36]。
2.2.2 抽象语法树
抽象语法树(Abstract Syntax Tree),简称AST,它是源代码语法结构的一种抽象表示[37]。它是以树状的形式表示语法结构,并且每个节点都表示代码中的一种结构。
抽象语法树将源代码转换为树形结构,将语法结构抽象成节点和边的组合,使得程序的语义更为清晰和易于理解。通过这种抽象,编译器可以更容易地理解和操作源代码。抽象语法树是编译器在语法分析阶段生成的数据结构,它记录了源代码的语法结构,方便编译器后续的语义分析、优化和代码生成等步骤。编译器可以通过遍历和操作抽象语法树来执行诸如类型检查、控制流分析等任务,抽象语法树可以被轻松地转换和修改,从而实现诸如代码重构、语言转换、代码优化等操作。
第3章 缓冲区溢出漏洞检测代码切片构造方法 .............. 17
3.1 代码切片构造方法 .................. 17
3.2 数据预处理 ............................. 18
第4章 结合Bi-GRU与注意力机制漏洞检测方法 ................... 35
4.1 Bi-GRU与注意力机制漏洞检测方法 ....................... 35
4.2 结合注意力机制的At-BiGRU模型 ...................... 37
第5章 系统实现 .............................. 45
5.1 系统需求分析 ....................................... 45
5.2 系统功能模块设计 ........................ 46
第5章 系统实现
5.1 系统需求分析
本章所设计的系统是基于本文提出的At-BiGRU模型方法的实现。系统旨在处理真实项目过程中产生的缓冲区溢出漏洞问题。文本缓冲区溢出漏洞检测系统应能满足以下需求。
(1)系统应该能适应不同形式的数据输入,实现高效的漏洞检测,能够保留源代码中的语义信息,实现自动化检测缓冲区溢出漏洞。
(2)提供缓冲区溢出漏洞检测的评估机制,有用户友好的操作界面,使用户拥有良好的交互体验,能够简单地实现漏洞文件上传、检测漏洞及下载等操作。
(3)系统应具备良好的可扩展性和兼容性,可以整合新的算法和技术以应对未来缓冲区溢出漏洞检测技术的发展,需要能够快速响应,即时呈现检测结果并下载文件。
根据上述系统的需求分析,得到本文的缓冲区溢出漏洞模型的总体框架。框架包含三个核心模块,分别是源代码预处理模块、代码切片构造方法及向量化模块以及结合Bi-GRU与注意力机制漏洞检测模块。构建了一个完整的漏洞检测体系,能够实现对缓冲区溢出漏洞的检测功能,从而提高缓冲区溢出漏洞检测准确率。由三个模块构成的缓冲区溢出漏洞检测模型总框架如图5.1所示。

第6章 总结与展望
6.1 总结
本文从缓冲区溢出漏洞检测过程中存在的问题出发,针对缓冲区溢出漏洞检测中存在的特征向量提取精度不高、检测结果准确率低等问题,提出一种基于源代码进行代码切片的构造方法。为了进一步提高缓冲区溢出漏洞的检测精度,提出一种双向门控循环网络与注意力机制结合的漏洞检测框架。通过大量对比实验,得到最优的神经网络模型参数,进而更好地实现检测缓冲区溢出漏洞这一目标。最后,开发设计了一个缓冲区溢出漏洞检测系统用于对漏洞进行自动化检测。
本文提出一种针对源代码进行处理的代码切片构造方法,能够高效识别软件源代码中的潜在漏洞,有效解决了人工审查代码时面临的耗时与繁琐问题。在确保源代码完整性的前提下,针对本文提出的漏洞风险点进行切片,提炼出更为精简的漏洞检测模块,剔除冗余代码,对获得的代码片
