2015年7月份,随着Windows 10的发布,Edge浏览器也备受关注。下面,笔者就向大家详细介绍下Edge独有的安全机制 — MemGC。
一、MemGC简介
MemGC(Memory Garbage Collector):内存垃圾收集器,是Edge的内存管理机制,由IE11的Memory Protector改进而来,首次在EdgeHTML和MSHTML中使用。Edge使用MemGC来管理DOM和DOM支持的对象,其采用标记清除(Mark-Sweep)算法对垃圾进行回收,能够阻止部分UAF漏洞。
二、MemGC的工作流程
MemGC的工作流程分为三步:分配(Allocate)、释放(Free)和标记清除(Mark-Sweep)。
1、分配(Allocate)
MemGC为其管理的对象分配内存:MemGC首先在堆中找到合适的bucket,然后在bucket所指向的内存块block中分配一个小的数据块chunk给它,并将这个分配的chunk标记为root,如图1所示。
2、释放(Free)
当对象被释放时,为其分配的chunk的root标记被清除,此时,这个chunk成为垃圾回收的候选者,如图2所示。
值得指出的一点是:此处虽然清除了chunk的root标记,但并未真正释放chunk,其他对象不能使用这个chunk。
3、标记清除(Mark-Sweep)
(1)标记Mark
当被释放的chunk逐渐增多,达到特定的阈值,将触发垃圾回收机制。
图3 释放的chunk达到阈值
此时,除了待回收的chunk,还有未被释放的对象所占用的chunk,即标记为root的chunk(如图4所示),MemGC将全部进行扫描标记。首先,MemGC会将所有chunk的标志位清除。其次,将标有root的chunk进行标记。接着扫描寄存器、堆栈以及标有root的chunk,若在扫描中发现被引用的chunk,则将其标记。
图4 标记开始时,还有标有root的chunk
(2)清除Sweep
如图7所示,当标记完成时,MemGC将回收未被标记的chunk,可供再次分配利用,此时,所有被申请对象释放且没有被其他未free的对象所引用的chunk才真正被回收利用。
图7 MemGC回收未被标记的chunk
三、MemGC阻止UAF漏洞
1、什么是UAF漏洞
UAF(Use After Free):即释放后使用。CWE 给出的定义是:引用一段被释放的内存可导致程序崩溃,或处理非预期数值,或执行若干指令。
如图8展示了一个简单UAF漏洞的示例,对象A引用了对象B,使用完后释放B,但未将指针赋值为NULL,此时,攻击者在B的空间内写入恶意代码,从而利用A去执行恶意代码。从图9中可以看出,UAF漏洞并不罕见。
图9 普遍存在的UAF漏洞
2、MemGC如何阻止UAF漏洞
图10 MemGC阻止UAF漏洞
图10展示了MemGC是如何阻止UAF漏洞的:对象A申请了一个数据块,当释放这个数据块时,若还有其他对象引用这个数据块,那么MemGC不会回收利用,其他程序无法将数据写入这个数据块,从而阻止了UAF漏洞的利用;若没有其他对象引用这个数据块,就不存在UAF漏洞了。
总结
微软在Windows 10系统中放弃了一直以来的IE浏览器,推出一款新的浏览器Edge。Edge浏览器不仅在功能和性能方面有了很大提高,在安全方面也做了很大改善,文中介绍的MemGC内存管理机制就是Edge在安全方面的一个典型代表,它能够阻止部分UAF漏洞,大大提高了Edge的安全性。
参考文章