论文部分内容阅读
摘要:如今,信息技术高速发展,各式各样的软件如雨后春笋一般出现。然而,由于软件自身存在的漏洞而被攻击的事件也屡见不鲜,缓冲区溢出漏洞便是其中的代表之一。伴随信息安全技术的不断发展,缓冲区溢出漏洞的检测技术也在不断发展。该文将首先介绍有关缓冲区及缓冲区溢出漏洞的知识,再阐述近几年关于缓冲区溢出漏洞检测的新技术,最后是对关于缓冲区未来可能发展地探讨,以期读者可以對缓冲区溢出漏洞及其相关检测技术有大致的认识。
关键词:缓冲区;缓冲区溢出漏洞;缓冲区漏洞检测技术
中图分类号: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
关键词:缓冲区;缓冲区溢出漏洞;缓冲区漏洞检测技术
中图分类号: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