贾疏桐 桂灿 苏星宇
摘要:如今,信息技术高速发展,各式各样的软件如雨后春笋一般出现。然而,由于软件自身存在的漏洞而被攻击的事件也屡见不鲜,缓冲区溢出漏洞便是其中的代表之一。伴随信息安全技术的不断发展,缓冲区溢出漏洞的检测技术也在不断发展。该文将首先介绍有关缓冲区及缓冲区溢出漏洞的知识,再阐述近几年关于缓冲区溢出漏洞检测的新技术,最后是对关于缓冲区未来可能发展地探讨,以期读者可以對缓冲区溢出漏洞及其相关检测技术有大致的认识。
关键词:缓冲区;缓冲区溢出漏洞;缓冲区漏洞检测技术
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2020)13-0057-03
1绪言
今天的大多数计算机系统都给予冯·诺依曼体系结构,其中一个重要思想就是将数据和程序均放到同样的存储空间中,使得攻击者很容易利用缓冲区溢出漏洞进行攻击。而且C/c++迄今为止仍然是最流行的语言,将其作为开发语言的项目和软件也不计其数。然而C/C++提供了大量的封装函数使得技术人员可以直接或间接的手动操作和分配内存,这也恰恰造成了缓冲区溢出漏洞的产生。一旦数据的移动,API的调用缺少所需的边界检测或输入长度验证时就极易发生缓冲区溢出漏洞,轻则会使编辑器抛出异常,程序无法正常执行,重则会造成内存泄漏,数据被恶意篡改,甚至被黑客利用以达到不法目的。
根据CNNVD 2020年以来每周的漏洞报告文档中,缓冲区溢出漏洞的所占总漏洞数量的百分比一直高居前五。360CERT发布2017年漏洞态势一回顾及分析中缓冲区溢出漏洞所占的比例高达16.66%。在中国科学院大学国家计算机网络入侵防范中心发布的2019年1月十大重要安全漏洞分析中将缓冲区溢出漏洞作为第九名,在2019年2月十大重要安全漏洞分析也有多个漏洞问题涉及缓冲区。因此本文针对近几年出现的缓冲区溢出漏洞技术进行整理、分析、探讨和总结,以期帮助科技人员进行更好的研究及应用。
本文将首先介绍有关缓冲区溢出漏洞的基本知识,帮助读者建立一个基本的知识框架,其次将近几年新出现的缓冲区漏洞溢出检测技术进行分类并在分类的基础上对一些典型或新出现的技术进行阐述,最后对论文进行总结,并提出未来可能的热点研究方向。
2缓冲区溢出漏洞的基础知识
2.1栈缓冲区溢出
缓冲区溢出是指当计算机要填充的数据长度超过缓冲区自身所规定容量,溢出的数据覆盖了合法数据或影响到了指令的执行。在实际情况下,绝大多数程序都会假设所提供的数据长度小于等于所分配的缓冲区空间,且一般不会主动检测边界条件。这就为缓冲区溢出漏洞的产生埋下了伏笔。操作系统使用的缓冲区,主要为堆和堆栈,缓冲区漏洞溢出最致命的即“堆和堆栈溢出”。
堆栈(简称栈)是操作系统提供的一种先进后出的数据结构,操作系统一般提供了两个专门的寄存器来存储栈顶指针和栈底指针,其中ESP寄存器存储指向栈顶的指针,EBP寄存器存储指向栈底的指针,EIP寄存器存储了下一条指令执行的地址。栈缓冲区溢出的本质即某个栈帧发生溢出,且溢出的内容覆盖了EIP寄存器的内容,改变了原本下一条指令的地址,从而导致程序无法正常执行或被黑客利用执行恶意代码m。因此栈溢出多发生在程序调用或对缓冲区操作的情况下。
2.2堆缓冲区溢出
堆也是一种基本的数据结构,它是可由程序员自行分配,由低地址向高地址增长的不连续的线性内存区域。堆溢出是指程序向某个堆块中写入的字节数超过了堆块本身可使用的字节数(之所以是可使用而不是用户申请的字节数,是因为系统会对用户所申请的字节数进行调整,这也导致可利用的字节数都不小于用户申请的字节数),因而导致了数据溢出,并覆盖到物理相邻的高地址的下一个堆块。堆缓冲区溢出并不像栈缓冲区溢出一样可以控制EIP,其精髓为精心构造的数据去溢出下一个块的块首,改写块首中的前向指针和后向指针,从而访问任意内存区域。
3静态检测技术
缓冲区溢出漏洞一直是计算机研究领域的一个活跃的研究主题,关于其检测技术亦不断更新。静态检测技术拥有无须运行程序,消耗资源少,直接分析程序源码并定准问题所在位置,从而便于程序人员进行修改等优势。然而由于缺乏程序运行所能提供的信息,所以如何减少静态检测的误报率和漏报率一直是评判静态检测技术的两个重要指标嘲。除此之外,吞吐量也是检验静态检测技术是否实时、高效的标准之一。
Peng Luo等人通过研究发现有1/3的缓冲区溢出漏洞是有循环引起的,因此他们使用CIL实现了DBloop用来定位可以引起缓冲区溢出的循环。DBloop主要使用数组和指针分析循环和数据移动的相应操作,以定位循环缓冲区溢出(BoF)。DBloop的关键步骤是首先获取缓冲区的大小,例如数组或分配的堆内存块的大小,然后检查目标循环的数据移动是否超出了缓冲区的范围。具体来说,DBloop包含四个步骤来本地化循环BoF:(1)使用数组或指针识别包含数据移动操作的可疑循环。(2)对目标循环应用代码切片,并根据循环是否嵌套以及循环是否包含路径对目标循环进行分类。(3)执行可追踪性分析以获得缓冲区的界限。使用约束求解标识BoF。他们使用DBloop分析从60个应用程序中收集到的68个漏洞并与商业工具Checkmarx和开放源代码工具Splint分析出的结果进行对比,DBloop成功定位了由循环引起的57个BoF而Checkmarx和SDlint仅分别检测到4个或3个。
Lili xu等人则将研究重点放在整数溢出导致到缓冲区溢出(IO2801)漏洞。他们认为尽管已经进行了许多工作来减轻整数溢出,但是现有工具要么误报率很高,要么吞吐量很低。为了解决这些问题,他们提出了一种新的静态分析框架(LAID)。它首先利用过程间数据流分析和污点分析来准确识别潜在的102BO漏洞。然后,它使用轻量级方法进一步滤除误报。具体来说,它生成表示可以触发潜在102BO漏洞的条件的约束((int)check+1>INT_MAXAtrue∧(check==(inI)check)),并将约束反馈到SMT求解器以决定其可满足性。他们已经实现了基于LLVM的原型系统LAID,并在NIST的SAMATE Juliet测试套件的228个程序和现实世界中的6个已知的102BO漏洞中进行了评估。实验结果表明,他们的提出的新的静态框架可以有效地检测所有已知的102BO漏洞。
周艳艳职极借鉴机器学习的思想和方法,并采用随机森林算法构建多颗决策树对样本进行训练并预测。并针对决策树算法的属性分裂节点过程,将C4.5和分类回归树(CART)算法中选择最优属性的信息熵理论计算方式进行线性组合,从而形成一个最佳的计算最优属性的公式,进而更好的选择分类属性,构造决策树。最终通过对决策树采用多数投票机制对数据集进行分类,在综合考虑每个决策树的权重因子的基础上,得出最佳的分类结果。测试结果表明改进后的随机森林算法HWRF在分类精度、召回率、F度量值、AUC方面明显优于RF算法,CART算法和NB算法。HWRF算法能够有效地检测出缓冲区溢出攻击,并且其识别的缓冲区溢出攻击重要变量也能提高RF算法和NB算法的检测性能。但在仿真实验部分,HWRF模型的创建时间略高于RF模型。
4动态测试技术
动态测试则类似于黑盒测试,依赖于充足的测试样例,从而检验程序的实际运行记过与预期结果是否一致的分析方法。总的来讲一些动态测试技术通过提供大量生成的输入来识别BoF,而另一些动态技术则通过将特殊代码插入程序或结合上述两种方法来识别BoFVl。相比于静态检测技术,动态检测技术的优势在于误报率较低,也可以得知程序的实际运行效果。但缺点是难以生成覆盖全面的测试样例,且消耗资源较多,漏报率较高。
Rui Zhang等人针对卫星软件中堆栈溢出的普遍问题,对RTEMS操作系统进行了改进,以支持实时堆栈使用深度和溢出检测。以基于TSC690F处理器的板载软件为例,通过使用处理器提供的内存访问保护机制为每个线程堆栈设置可访问区域和不可访问区域。改进的RTEMS通过上下文切换在线程之间共享访问保护机制。陷阱处理程序旨在接管写保护错误陷阱,计算堆栈使用深度并实时监视堆栈溢出。核心模块性能测试和堆栈检测实例验证表明,改进的RTEMS对软件性能的影响很小,因此软件可以在线和实时检测堆栈深度。通过使用这种方法,即使在堆栈溢出而不是失控崩溃的情况下,该软件仍然是可管理的,并且提高了软件的可靠性。
具体的检测原理是:在RTEMS线程控制块(TCB)中增加访问保护寄存器作为变量的定义,即扩展线程上下文的定义,使单个线程在运行时可以独占地使用处理器的访问保护寄存器。不同的线程通过切换线程上下文共享处理器的访问保护机制。在初始化期间,线程堆栈分为初始可访问和不可访问区域。随着堆栈的增长,当堆栈超过初始可访问区域并试图将数据写入不可访问区域时,处理器将立即产生一个陷阱(type 0x9)。通过挂接相应的陷阱处理程序,软件重置线程不可访问的堆栈区域,以扩展可访问区域。该方法能够满足堆栈的增长,保证软件的正常运行。该软件可以根据可达区域的扩展计算出当前堆栈的深度。随着堆栈的增长,当软件触发陷阱并发现不可访问区域小于或等于1k字节时,假设线程堆栈即将溢出。此时,软件可以设计从堆栈溢出的特定恢复措施,例如线程重新启动、软件重置、切换到备份计算机工作等。
5未来研究热点展望
本文认为未来针对缓冲区溢出漏洞检测技术的主要热点应在于以下三个方向:
(1)结合机器学习思想。机器学习的主要思想在于通过不断的训练,提取出训练集的特征,并达到可以精准预测的目的。而缓冲区溢出漏洞确有规律可循,可以将代码根据数组的定义与预算,指针的声明,函数的调用等将代码分解成若干片段,利用机器学习并结合上下文语义进行训练,减少静态测试中的漏报和误报问题。
(2)将高级语言转化为底层语言如汇编或二进制代码。根据以往的文献来看针对缓冲区漏洞检测的语言多位C/C++等高级语言,对于汇编或二进制代码检测技术却少之又少。然而作为更适合与计算机使用的語言,如果有针对性的检测技术,应该能极大地减少误报率和漏报率。
(3)综合运用各项技术。多一重技术就等于多一门保险,根据前文的论述可知无论是静态检测技术和动态检测技术都有其本身的优势和缺点,因此如果能综合利用静态检测技术、动态检测和本文未涉及的漏洞修复技术等将更加有利于防范缓冲区溢出漏洞,保障程序的正常运行。