WebKit内存破坏漏洞利用杂谈

WebKit是目前使用范围最广的Web渲染引擎,无论是主流浏览器(Safari,Chrome等),系统内置应用(Mail,Dashboard等),移动端各种第三方应用(支付、聊天、社交应用等)基本上都会带有WebKit的影子。这几年来WebKit漏洞也是层出不穷,以影响移动应用安全居多。这些漏洞包括UXSS,信息泄露,拒绝服务,远程代码执行等。

这些漏洞中,以远程代码执行漏洞危害最大。远程代码执行漏洞也分逻辑类和内存破坏两类。逻辑类的漏洞在PC端几乎已经绝迹。安卓平台偶尔会出现,但也是补一个少一个,几乎绝迹。而内存破坏类漏洞在配合不同利用方法(Vulnerability-Based Exploitation)的情况下,通常能通杀所有WebKit应用,实现跨平台稳定利用,是名副其实的“核武器”。

最近几年来,Google和Apple紧密合作封杀WebKit内存破坏漏洞及其利用方法,使得WebKit漏洞挖掘以及漏洞利用变得越来越难。现在基于WebKit内存破坏漏洞利用的公开分析很少,Pinkie Pie的《Exploiting 64-bit Linux like a boss》以及Nils的《Pwn2Own 2013 Chrome Exploit》算是近三年来仅有的参考资料了。另外一些关于JS引擎(V8,JSC)漏洞的,例如Pinkie Pie的《Mobile Pwn2Own 2013 Chrome exploit》、Ian Beer的《Pwn4Fun 2014 Safari Exploit》通用性都稍差。

漏洞缓解措施方面,Arena的设计类似于微软IE的isolate heap,目前Branch的WebKit版本将所有RenderObject放入RenderArena中,其自身维护的FreeList单链表指针被XOR之后(XOR保护措施采用之前的利用方法可参考Georg Wicherski的Slide《Exploiting A Coalmine》),几乎封杀了所有RenderObject UAF漏洞利用, 而RenderObject的UAF占到了所有WebKit UAF的85%以上。

除此之外,目前WebKit的JS引擎V8和JSC已无法显式触发GC,这使得漏洞利用中的关键环节——堆布局变得很困难。Ian Beer提出的JSC中利用JSStringJoiner解决了特定条件下的挖洞+填洞问题,但很多情况下还是无法满足稳定Exploit的需求。

ASLR和DEP已经成了现代操作系统的“标配”,但不同的系统的ASLR/DEP强度也是不同的,例如iOS的dyld_cache机制,所有模块共享一个基址,使得泄露一个模块的基址即可泄露所有模块的基址。而Mac OSX下,每个模块都有两个基址,分别是.DATA和.TEXT基址,vtable在.DATA段中,这也意味着,泄露vtable地址并不能完全bypass ASLR实现ROP (因为ROP Gadget在.TEXT段中)

原生64位应用也是一个大趋势,Mac OSX中的Safari早已是原生64位, iPhone 5s+/iPad Air+等设备也采用了64位iOS系统。64位地址空间使得Heap Spray技术的Hit率变得很低,在利用过程中不得不尽量避免Heap Spray以求高稳定性。而这也对漏洞利用技术提出了很大的挑战。

WebKit内存破坏漏洞的利用已进入Vulnerability-Based Exploitation时代。换而言之,对特定漏洞在不同平台甚至是不同版本的WebKit中,需要加以特定的利用技术才能实现稳定利用。而这些技术也是为漏洞本身量身定做,脱离了某一特定漏洞,特定利用技术也变得毫无意义。但是掌握发现这些特定利用技术的方法却是很有意义的。

我在10月17日的BlackHat EU的议题《WEBKIT EVERYWHERE: SECURE OR NOT?》(https://www.blackhat.com/eu-14/briefings.html#webkit-everywhere-secure-or-not)中将通过Vulnerability-Based Exploitation方法(基于漏洞相关的利用方法)分析一个@rock509 发现的疑似越界1-bit读漏洞,实现越界限定性1-bit写,进而转换成有限长度的任意读写,最终实现任意地址的读写。期间采用JS-Controlled Free方法实现了精确堆布局;利用WebKit在原生64位系统中JIT内存随机性特征的弱点,在不使用Heap Spray和ROP的条件下实现Mac OSX Mavericks原生64位Safari中的稳定利用。这也是此次Pwn2Own 2014中我们突破Mac OSX所使用的WebKit漏洞和利用部分。

另外,一周之后(10月24日)@KeenTeam 在北京举办极客嘉年华@GeekPwn大赛,我和@rock509 以及其他队友也会参加,欢迎各位安全同仁在大赛期间一起加入交流探讨。

[via@陈良-Keen]