Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Micro-Virtualization Memory Tracing to Detect and Prevent Spraying Attacks

论文下载

这篇文章是发在Usenix Security 2016上的文章,作者是Universit`a degli Studi di Milano大学的Stefano Cristalli等人。文章的目的是来检测Heap Spray Attack。 代码开源在:https://github.com/graffiti-hypervisor/graffiti-hypervisor

Background

  • 过去检测Heap Spray的方法都是基于两个参数,一个是检测是不是在短时间内内存使用有快速上升,二是检测内存使用是不是达到一个阈值。
  • 作者认为这样的检测方法是有问题的,作者基于CVE-2011-1996修改了EXP,使得可以bypass这样的检测方法。
  • 作者提出了一种方法是基于Intel VT-x,并结合对内存数据的分析来检测Heap Spray Attack。

Design

检测工具分成两个部分,一个是Memory Tracer,另一个是Attack Detector。Memory Tracer会记录每个进程的内存分配,当内存分配超过一个阈值的时候,启动Attack Detector进行内存数据检测Heap Spray Attack。

Fig

Implementation

  • 检测工具是基于HyperDbg写的一个插件。
  • 在启动Memory Tracer的时候,会先遍历EPT表,把Guest VM的目标进程的所有页表结构设成不可写的。当有分配新内存或页表结构有改变时,会触发异常,控制流能转回Hypervisor,记录目标进程已经分配的内存。

Micro-Virtualization

Memory Tracer可以记录整个操作系统里所有进程的内存使用情况,但是当记录所有进程的时候会有很高的overhead。因为,操作系统里面进程之间有很多共享的内存(特别是Windows),当记录一个进程的页表更改时,可能会invoke另一个进程修改页表,这样就又要退出到Hypervisor记录另一个进程的内存使用。

为了解决这个问题,作者为每个进程都新分配了一个EPT表,当进程sleep的时候把EPT表对应的内存也重新设回可写的,就避免了要重新退出到Hypervisor的情况。在对Windows所有进程做Memory Tracing的试验中,Overhead从63%降到了23%

Attack Detector

Detector是以插件的形式组织进工具里的。当Memory Tracer记录下某个进程的内存使用超过了一个阈值,就会启动Detector检测是不是存在Heap Spray Attack。作者写了三个插件来执行不同的检测。

Malicious Code Detector

这个插件认为Heap Spray的payload是直接可执行的shellcode。Detector会选取最新分配的一部分内存页,每页随机选20个位置做反汇编。如果反汇编的结果是以syscall或者转移控制流到library,就认为可能是shellcode。每页都会统计出(20个中)有多少可能的shellcode,然后取平均值。如果最后结果超过一个阈值,就认为是检测到了Heap Spray Attack。

Self-unpacking Shellcode Detector

这个插件检测的是Heap Spray了加壳的shellcode。这个插件先检测写内存的情况,如果之后又执行了,就认为检测到了这类攻击。

Data Spraying Detector

这个插件检测的是内存中喷了地址直接做ROP的情况。他会先标记出最近新分配的一些内存页中可能的代码指针,如果这些代码指针的数量超过了一个阈值,就认为检测到了Heap Spray。

其中,可能的一个情况是指针指向的代码页被swap到了磁盘上,就无法确定这个指针是不是指向代码段的。这种情况,Detector会拦截Guest VM的page fault,如果swap回来的内存页是代码段,就把先前记录的指针标记成代码指针。

Experiment

实验环境:Intel Core i5-2500 @ 3.3 GHz and 8GB of RAM, running respectively Windows 7 Professional 32bit and Debian Wheezy 32bit (kernel 3.2)

在只开Memory Tracer的情况下,记录下的overhead分别是Windows 24%,Debian 25%

模拟正常使用时,设置不同的Memory Tracer阈值,overhead的情况:

Fig

检查EXP的准确率:

Fig

正常访问网页时检测到代码指针的数量:

Fig

正常访问网页是检测到shellcode的数量:

Fig