各浏览器抗uaf机制
今年中旬,微软针对旗下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机制的更多相关文章
- HTTP请求中浏览器的缓存机制
摘要:在Web开发过程中,我们可能会经常遇到浏览器缓存的问题.本文作者详细解释了浏览器缓存的机制,帮助读者更深层次的认识浏览器的缓存. 流程 当资源第一次被访问的时候,HTTP头部如下 (Reques ...
- 彻底理解浏览器的缓存机制(http缓存机制)
一.概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步s ...
- JS学习笔记:(一)浏览器页面渲染机制
浏览器的内核主要分为渲染引擎和JS引擎.目前市面上常见的浏览器内核可以分为这四种:Trident(IE).Gecko(火狐).Blink(Chrome.Opera).Webkit(Safari).这里 ...
- 转---JS 一定要放在 Body 的最底部么?聊聊浏览器的渲染机制
作者:德来 segmentfault.com/a/1190000004292479 如有好文章投稿,请点击 → 这里了解详情 一.从一个面试题说起 面试前端的时候我喜欢问一些看上去是常识的问题.比如: ...
- ASP.NET 表单验证方法与客户端(浏览器)服务器交互机制的故事
想到这个问题完全是一个意外吧,是在寻找另外一个问题答案的过程中,才对验证方法与浏览器服务器交互机制的关系有了清晰的认识. 先说下验证方法,验证方法分为前台验证和后台验证. 前台验证就是类似jQuery ...
- Web浏览器的缓存机制
Web缓存的工作原理 所有的缓存都是基于一套规则来帮助他们决定什么时候使用缓存中的副本提供服务(假设有副本可用的情况下,未被销毁回收或者未被删除修改).这些规则有的在协议中有定义(如HTTP协议1.0 ...
- 从php到浏览器的缓存机制,不得不看!
所有的php程序员都知道在php脚本里面执行 echo "1";访客的浏览器里面就会显示"1". 但是我们执行下面的代码的时候,并不是显示"1&quo ...
- 从Chrome源码看浏览器的事件机制
.aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } .crayon-line spa ...
- 【Web缓存机制系列】2 – Web浏览器的缓存机制
Web缓存的工作原理 所有的缓存都是基于一套规则来帮助他们决定什么时候使用缓存中的副本提供服务(假设有副本可用的情况下,未被销毁回收或者未被删除修改).这些规则有的在协议中有定义(如HTTP协议1.0 ...
随机推荐
- Debian 配置apt-get源
1.配置apt-get源 cp /etc/apt/sources.list /etc/apt/sources.listbak #备份原有配置文件 nano /etc/apt/so ...
- Maven 安装
简单记录maven的安装步骤: 在安装maven之前,先确保已经安装JDK1.6及以上版本,并且配置好环境变量. 下载maven3,最新版本是Maven3.2.3 ,下载地址:http://maven ...
- zookeeper windows 入门安装和测试
一.序言 以下是我对zookeeper 的一些理解: zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”. 栗子1号: 假设我是一家 ...
- IOS - UITableViewCell的选中时的颜色及tableViewCell的selecte与deselecte
1.系统默认的颜色设置 [cpp] view plaincopy //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 ...
- Spring面向切面编程(AOP)
1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即 ...
- 使用BAT安装 Windows Service
脚本如下: @echo off @setlocal enableextensions @cd /d "%~dp0" set InstallPath=C:\DBoxService\S ...
- setw()函数
- Mac系统下使用VirtualBox虚拟机安装win7--第五步 共享文件夹设置
1.启动virtualbox--选中win7虚拟机--点击设置--点击共享文件夹--点击右侧按钮添加共享文件夹
- mysql可以用这种方式<<! 输入内容 ! 做成脚本
以这种文件式做交接NB!!!!! [root@NB test]# mysql -uroot -p$passwd <<! > use mysql > select user,ho ...
- 【javascript】 for循环小技巧
最近在读[Jquery技术内幕],里面介绍了一种js for循环的实用写法. 一般写for循环是这么写的: var elemts = [1,2,3,4,5]; for(var i=0; i<el ...