潘传幸,张铮,马博林,姚远,季新生
(1.数学工程与先进计算国家重点实验室,河南 郑州 450001;2.国家数字交换系统工程技术研究中心,河南 郑州 450002)
进程控制流劫持是一种常见的攻击手段,其通常利用缓冲区溢出[1]等二进制漏洞篡改进程的控制流,从而进行程序正常功能之外的恶意操作[2]。控制流劫持攻击的危害非常大,控制流劫持的目的往往是获取目标机器的控制权,然后提取系统特权对目标机器实现全面控制。根据 CWE Top25[3]的排名,内存缓冲区溢出仍然是最危险的软件错误。
控制流劫持攻击可以分为代码注入和代码重用两大类[2]。代码注入类攻击利用程序本身的输入功能向进程的虚拟地址空间注入恶意代码,然后通过缓冲区溢出等方式覆盖返回地址,实现控制流劫持。代码重用类攻击不需要注入代码,而是利用程序自身的代码片段完成攻击。为了防御进程控制流劫持,研究人员和工程技术人员提出了许多防御手段。早期,控制流劫持攻击通过代码注入实现,为了防御代码注入攻击,研究人员提出了数据执行保护(DEP,data execution prevention)、栈不可执行[4]、栈监控[5]、地址空间布局随机化(ASLR,address space layout randomization)[6]等方法。然而,这些方法却无法防御面向返回编程(ROP,return oriented programming)[7]等基于代码重用的控制流劫持[8-11]。控制流完整性(CFI,control-flow integrity)[12-13]是防御代码重用较有效的方法,其通过对二进制可执行程序进行静态分析,建立可信的控制流图,在执行时限制控制流转移。但是,对于信息泄露和面向数据编程(DOP,data oriented programming)[14]攻击,即使细粒度的CFI 也难以起到防御作用。……