今年中旬,微软针对旗下ie浏览器中大量出现的uaf漏洞,对ie浏览器的安全机制进行了一个大幅度的升级,其中主要体现为隔离堆及延迟释放两个机制,顿时又将uaf漏洞的利用向上提升了一个大坎,
但是类似的对抗uaf的机制在firefox以及chrome中已有类似的实现,本文就各个浏览器的该机制做一个小总结。

ie
Isolated Heap(隔离堆)
dom树对象以及supporting对象的对象空间在隔离的堆中被分配,该堆位于默认堆的低地址,该堆的句柄保存于一个全局变量中,对于该堆的内存分配涉及到两个函数
_MemIsolatedAlloc
_MemIsolatedAllocClear
其中分配时会通过对HeapAlloc函数中标记参数HEAP_ZEAR_MEMORY的设置,使的新分配的对象空间清零,但是该机制只是针对部分的对象使用(好在只是部分)。

delay free(延迟释放)
struct MemoryProtector{
void * BlockArray; //指向一个结构体数组,该结构体保存了所有被延迟释放元素的大小和地址
DWORD TotalSize; //此值就是所有被延迟释放的对象的总大小,即阀值。
DWORD NumberOfUsed;
bool Sorted; //标记暂时不知道具体含义
DWORD unknow;
DWORD unKnow;
DWORD StackHighAddress;
DWORD EnableReclaim;
}
具体的实现函数
MemoryProtection::CMemoryProtector::ProtectedFree
所谓的延迟释放就是指浏览器中释放的对象在释放时并不是真正意义上的释放,该函数会将这些无用对象(首先清零),并将这些无用的对象连接到st_ProtecFreeManageHeap对象中,直到所有延迟对象的
总大小到达一定阀值是在进行处理(此时依赖于TotalSize的值)。当所有的延迟对象到达阀值之后也并没有马上进行释放操作,而是调用了一下两个函数
MemoryProtection::CMemoryProtector::MarkBlocks
MemoryProtection::CMemoryProtector::ReclaimUnmarkeBlock
其中在函数MarkBlocks中会扫描栈中是否存在对这些延迟释放对象的引用,如果存在则对该元素进行标记。
在函数ReclaimUnmarkeBlock中完成释放(有标记的不释放)。

firefox
Frame Poisoning机制
目标:一些在页面渲染中常用框架型的对象
作用:该类对象在释放的时候其内存空间会被chosenpattern(该分配对象会被回收至freelist,并优先分配给类型相同的对象,提高了占位难度)
分配的时候支持三种类型的分配
By object ID
By frame ID
By size
对象A在空间分配的时候(此时会从freelist中优先获取一个空闲的内存空间)确保该分配的空间来自于一个与A对象的类型一致的对象,当freelist中没有类型一致的空间是才会创建自动创建一段空间返回。

chrome
PartitionAlloc机制
该机制管理堆的时候将对分成四个类型,依据申请对象的类型依次从中分配内存空间。
ObjectModelPartition:保存了所有node类的子类,也大致可以理解为就是DOM tree
RenderingPartion:保存了所有渲染树的对象
BufferPartition:保存了Web Template Framework的对象,同时也包含了一些js的类型,比如arraybuffer和stringlmpl
General Partition
在这四个分区中,又依据分配的对象的大小再次进行了分区,导致攻击者在站位时必须选择与可利用对象属于同一分类(并且在同一类型中又要满足同大小的分配)

其中每个分区又依照以下的规则进行划分,并在其中做了一些手脚。
从小到大,以此包含
bockets< superpages(0x200000)< extents < partition。
bockets 依照请求的大小分配出去
每个superpages的开始都有一个guard area的域用于检测攻击者的一系列连续读写操作,也就是说哪怕你费尽心思的构造了可全内存都写的数组,但是数组所在的内存空间中却插上了一堆检测域(guard area)。
superpages
  metadata
  dataarea(0x1f8000)
  guard area(reserves,inaccessible page)

各浏览器抗uaf机制的更多相关文章

  1. HTTP请求中浏览器的缓存机制

    摘要:在Web开发过程中,我们可能会经常遇到浏览器缓存的问题.本文作者详细解释了浏览器缓存的机制,帮助读者更深层次的认识浏览器的缓存. 流程 当资源第一次被访问的时候,HTTP头部如下 (Reques ...

  2. 彻底理解浏览器的缓存机制(http缓存机制)

    一.概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步s ...

  3. JS学习笔记:(一)浏览器页面渲染机制

    浏览器的内核主要分为渲染引擎和JS引擎.目前市面上常见的浏览器内核可以分为这四种:Trident(IE).Gecko(火狐).Blink(Chrome.Opera).Webkit(Safari).这里 ...

  4. 转---JS 一定要放在 Body 的最底部么?聊聊浏览器的渲染机制

    作者:德来 segmentfault.com/a/1190000004292479 如有好文章投稿,请点击 → 这里了解详情 一.从一个面试题说起 面试前端的时候我喜欢问一些看上去是常识的问题.比如: ...

  5. ASP.NET 表单验证方法与客户端(浏览器)服务器交互机制的故事

    想到这个问题完全是一个意外吧,是在寻找另外一个问题答案的过程中,才对验证方法与浏览器服务器交互机制的关系有了清晰的认识. 先说下验证方法,验证方法分为前台验证和后台验证. 前台验证就是类似jQuery ...

  6. Web浏览器的缓存机制

    Web缓存的工作原理 所有的缓存都是基于一套规则来帮助他们决定什么时候使用缓存中的副本提供服务(假设有副本可用的情况下,未被销毁回收或者未被删除修改).这些规则有的在协议中有定义(如HTTP协议1.0 ...

  7. 从php到浏览器的缓存机制,不得不看!

    所有的php程序员都知道在php脚本里面执行 echo "1";访客的浏览器里面就会显示"1". 但是我们执行下面的代码的时候,并不是显示"1&quo ...

  8. 从Chrome源码看浏览器的事件机制

    .aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } .crayon-line spa ...

  9. 【Web缓存机制系列】2 – Web浏览器的缓存机制

    Web缓存的工作原理 所有的缓存都是基于一套规则来帮助他们决定什么时候使用缓存中的副本提供服务(假设有副本可用的情况下,未被销毁回收或者未被删除修改).这些规则有的在协议中有定义(如HTTP协议1.0 ...

随机推荐

  1. log4net使用

    平时项目里一直都有在使用log4net作为日志记录模块,当时一直都没有去理解log4net的配置文件信息.今天抽出了一点时间来看了看配置文件信息. log4net配置文件信息: <log4net ...

  2. 【leetcode】Swap Nodes in Pairs (middle)

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...

  3. 【XLL 文档翻译】【第3部分】必要的和有用的 C API XLM 函数

    本节中将介绍几个对于 DLL 和 XLL 开发人员来说十分重要的回调函数,xlfRegister 函数是可用于注册函数,使得 Excel 可以直接访问 DLL 和 XLl 中的函数. xlfUnreg ...

  4. 地图API文档

    目录 腾讯地图API 2 1.API概览... 2 1.1 WebService API(官网注明是beta版本,可能不稳定,慎用):... 2 1.2 URL API:... 2 1.3 静态图AP ...

  5. 3dmax导出3ds具有过多要导出的面超过64k解决方法

    参考:http://blog.sina.com.cn/s/blog_7a71dd090100w3r0.html 修改器->网格编辑->ProOptimizer 选中对象, 原始模型 顶点数 ...

  6. kmp

    #include <bits/stdc++.h> #define MAXN 100000 using namespace std; string a, b; int next[MAXN]; ...

  7. DB2 SQL Mixed data in character strings

    Mixed character data and graphic data are always allowed for Unicode, but for EBCDIC and ASCII, the ...

  8. Android init.rc执行顺序

    转自:http://blog.csdn.net/kickxxx/article/details/7590665 1. 所有的action运行于service之前 2.  下面为各个section的执行 ...

  9. 全局压缩http响应头

    见代码: public class CompressAttribute : ActionFilterAttribute { public override void OnActionExecuting ...

  10. ASP.NET Web API 中的异常处理(转载)

    转载地址:ASP.NET Web API 中的异常处理