Google于2022年4月11日更新了Chrome的100.0.4896.88,其中修复了由@btiszka在3月18日报告的正则表达式模块的UAF漏洞;6月28日,Google纰漏了该漏洞的具体细节,目前该漏洞已被修复并公开了技术细节,本文将从技术角度分析漏洞的成因和修复方式。
要理解这个漏洞,需要对V8的垃圾回收机制有一定的了解,本文首先简单介绍V8的垃圾回收机制,然后结合具体漏洞PoC代码分析漏洞成因。
V8垃圾回收机制
垃圾回收一直是V8引擎的优化重点,是多种复杂优化策略组合形成的机制,其本质采用的标记跟踪回收算法,在堆布局上使用分代布局,大致可以分为新生代和老年代,具体的回收策略可分为Major GC(Mark-Compact)和Minor GC(Scavenger)。这里仅对两种策略的关键阶段做简单介绍,详细实现可以从参考文档和源代码进行学习。
Major GC(Mark-Compact)
V8的主要GC负责对整个堆区的垃圾进行回收,可分为标记、清除、整理三个阶段,其中清除阶段释放无用内存,整理阶段将已使用内存移动压实,算法的重点在标记阶段。
标记阶段中,收集器需要发现并标记所有的活动对象。收集器从维护的一组根对象开始,跟随指针迭代发现更多的对象,通过持续标记新发现的对象并跟随指针,直到没有需要标记的对象为止。