论文部分内容阅读
自1988年首个利用缓冲区溢出漏洞进行传播的病毒Morris爆发以来,缓冲区溢出攻击就一直是计算机安全中最严重的攻击行为之一。近些年,它又成为了高级持续性威胁APT (Advanced Persistent Threat)的主要攻击手段。在针对伊朗核设施的APT行动中,就利用了7个缓冲区溢出漏洞。虽然工业界和学术界提出各种技术保护软件及操作系统安全,但攻击数量仍有增无减。而漏洞攻击技术也不断发展,从缓冲区溢出到最近的ROP (Return-Oriented-Programming)攻击。漏洞攻击检测是信息安全领域的研究热点,特别是如何在二进制代码级检测攻击更是业界关注的焦点,但x86指令的复杂性给检测带来诸多挑战。本文针对缓冲区溢出攻击时,攻击代码来源于程序接收的输入数据这一特点,提出了一种基于数据不可信的检测方法。当程序修改流程时,如果将要执行的代码是输入数据的子串,就表明发生了缓冲区溢出攻击。为了避免频繁进行攻击代码匹配所带来的巨大额外开销,本文提出了一个预处理方法,将显然合法的跳转目的地址与可疑的跳转目的地址区分出来,只对可疑的跳转进行攻击代码匹配,这种方式可以有效地降低额外开销。对于ROP攻击,由于在ROP攻击时ROP链也是源于原始数据,因此数据不可信的思想同样可以用于检测ROP攻击。本文提出了一个基于数据不可信的ROP攻击检测方法,检测到疑似ROP链时,将当前栈顶指针ESP (Extended Stack Pointer)指向的内容与原始输入数据比较,从而判断是否发生了ROP攻击。利用动态插桩技术,本文在Win32平台下实现了基于数据不可信的缓冲区溢出攻击检测方法的原型系统。使用该系统对多种缓冲区溢出攻击进行检测,实验证明,本文提出的基于数据不可信的检测方法在准确性上达到了良好的效果。同时,本文方法也将额外开销降低到了一个合理的范围。