导读
代码重用攻击,又称为ROP攻击,是一种危险的攻击方法。它重用漏洞程序中以ret指令结尾的代码片段构造任意计算原语。近年来,许多有效的防御方法被提出来对抗这种攻击,如ASLR, XOM和DEP。同时使用这些技术可以阻止几乎所有现有的ROP攻击及其变种。另外,在被攻击的服务程序中,大多数系统调用指令(syscall)之后缺少返回指令(ret),即缺少系统调用类型的代码片段。但是,缺少这种类型的代码片段(gadget),会极大地限制代码重用攻击的能力。因为攻击者将无法串联多个系统调用来实现高级的行为,如发起一个远程的shell。
本文提出一个新的代码重用攻击方法,SeBROP攻击,可以在同时使用这些最先进的防御和缺少关键代码片段的情况下仍然完成远程利用的攻击方法。与以往的绕过ASLR的攻击方法不同,SeBROP仅利用服务端程序的一个栈溢出漏洞,而无需额外的内存泄露漏洞,就可以完成攻击。SeBROP利用了漏洞程序中的一个侧信道,可以在没有任何前置知识和无法读和反汇编代码段(XOM保护下)的情况下,找到代码重用攻击所需要的所有类型的代码片段。该侧信道泄露的是程序执行是否崩溃的信息,攻击者通过劫持控制流到特定的代码位置,及控制执行的参数,并根据最终的执行结果(崩溃与否,内存痕迹)来判断执行的位置是否包含所需的代码片段(gadget),并分析代码片段的类型。与BROP不同的是,SeBROP可以通过盲执行找全图灵完备的gadget集,并且能够绕过XOM防御,以及与64位和32位系统都兼容。更重要的是,我们提出一种新的技术,利用当前存在安全漏洞的信号检查机制在返回指令(ret)不存在的情况下实现控制流劫持。系统调用完成之后会进行信号检查,如果存在挂起的信号,则内核会调用信号处理函数。攻击者可以利用信号处理函数将控制转移走,从而不再返回。因此,我们精心构造了信号处理函数,并发送信号,用信号将多个断开的gadget链串联起来。我们提出的技术,可以在没有ret指令的情况下串联多个系统调用,这是比以往ROP攻击优越的地方。同时,SeBROP可以对抗几乎所有的最先进的防御技术。
为了验证它的有效性,我们在3个应用程序上进行了实验,Apache (32位), ProFTPD (32位),和Nginx (64位)。实验结果显示SeBROP可以在 Nginx, ProFTPD 和Apache上分别以少于8500/4300/2100的请求数成功发起远程的shell。
文章精要
请长按下方二维码识别,阅读该文。
文章中观点仅代表作者个人观点,不代表本网站的观点和看法。
神州学人杂志及神州学人网原创文章转载说明:如需转载,务必注明出处,违者本网将依法追究。