• 1.摘要
  • 2.基本信息
  • 3.什么是Heap Spraying
  • 4.Heap Spraying的历史
  • 5.优缺点
  • 5.1.优点
  • 5.2.缺点
  • 6.防范和检测

Heap Spraying

基本信息

  • 中文名

    堆喷射

  • 外文名

    Heap Spraying

  • 领域

    计算机安全领域

  • 定义

    较易获得任意代码执行Exploit

什么是Heap Spraying

在计算机安全领域中,Heap Spraying(堆喷射)是一种较易获得任意代码执行Exploit的技术手段。这个短语同样用于描述一套Exploit源码中采用此技术的代码部分。在一般情况下,堆喷射代码试图将自身大面积地分配在进程堆栈中,并且以正确的方式将命令写满这些区域,以此实现在目标进程的内存中预定的位置写入一串命令。它们通常利用了堆喷射代码执行时这些堆栈区域总是在同一位置的这一特性。

Heap Spraying的历史

Heap Spraying在编写Exploit中的应用至少始于2001年 ,但是这项技术在一系列针对于IE 的大面积漏洞而编写Expolit时被采用后,开始普遍用于Web浏览器的Exploit编写。Heap Spraying技术在这些Exploit的开发应用上十分相似,这体现了它的广谱性和可移植性(各Exploit间无需做大的改动)。它被证实是易懂易用的,能被新手hackers加以利用,快捷地为各种浏览器和浏览器插件漏洞编写可用的Exploit。许多采用Heap Spraying开发的浏览器Exploit,只要在前一个版本的Exploit基础上更改一小处代码,便能触发漏洞。 执行方式JavaScript方式

针对浏览器的堆喷射一般通过JavaScript执行,即向heap提交超长的由同一字母组成的Unicode字符串,这种字符串不断复制自身并追加在原字符串末尾。这样,字符串的长度会呈指数增大至脚本引擎允许的最大长度。当达到预期的长度时,一条指令将会加到字符串的末尾。Heap Spraying代码复制下这一带有指令的字符串并存储为一数组,使得Exploit的目标内存区域被指令所覆盖。VBScript有时(尽管很少)也用来生成字符串,因为其string函数更加简单。

图像方式

尽管Heap Spraying证实可被用于其他方式执行,比如被进程加载图片文件时触发,但并不多见。

优缺点

优点

增加缓冲区溢出攻击的成功率

覆盖地址变得更加简单了,可以简单使用类NOP指令来进行覆盖

它也可以用于堆栈溢出攻击,用slidecode覆盖堆栈返回地址即可

缺点

会导致被攻击进程的内存占用暴增,容易被察觉

不能用于主动攻击,一般是通过栈溢出利用或者其他漏洞来进行协同攻击

上面说了,如果目的地址被shellcode覆盖,则shellcode执行会失败,因此不能保证100%成功

防范和检测

1、一般来讲,应用程序的堆分配是很平滑的,分配模式也应该是随机的,或者从理论上来说随机性非常明显,不应该出现内存暴增现象,从已有的一些Heap Spray的代码来看,都会瞬间申请大量内存,从这个特点出发,我们可以设计这样一种方案,如果发现应用程序的内存大量增加(设置阈值),立即检测堆上的数据,看是否包含大量的slidecode,如果满足条件则告警提示用户“受到Heap Spray攻击”或者帮助用户结束相关进程。不过这种方式有一个缺点是无法确定攻击源,而优点则是能够检测未知漏洞攻击。

2、针对特殊的浏览器,将自身监控模块注入浏览器进程中,或者通过BHO让浏览器(IE)主动加载。当浏览器的脚本解释器开始重复申请堆的时候,监控模块可以记录堆的大小、内容和数量,如果这些重复的堆请求到达了一个阀值或者覆盖了指定的地址(譬如几个敏感地址0x0C0C0C0C,0x0D0D0D0D等等),监控模块立即阻止这个脚本执行过程并弹出警告,由于脚本执行被中断,后面的溢出也就无法实现了。这种检测方法非常安静,帮助用户拦截之后也不影响用户继续浏览网页,就好像用户从来没有遇到过此类恶意网页。