刘惠明:沙箱内持久化:行之有效的沙箱攻击新思路

DSC_2663

刘惠明  腾讯玄武实验室安全研究员

摘要:随着攻防技术的不断迭代和演变,沙箱(Sandbox)技术作为现代浏览器广泛使用的安全保护措施,在减轻攻击方面已经被证明是行之有效的防护手段。沙箱策略新功能的不断叠加使得漏洞数量大幅降低。加之安全研究人员对浏览器沙箱漏洞的聚焦,实现沙箱逃逸的难度也随之增加本文会详尽地介绍了如何在不突破沙箱策略限制的情况下,实现对沙箱的深度持久化攻击。通过对包括Chrome在内的几款主流浏览器的研究,他们利用沙箱的固有特性,实现了Render进程持久化和绕过Chrome Site Isolation后毒化浏览器缓存两大持久化攻击手段。同时,还提出了一种新型的持久化攻击技术——“克隆攻击”,可以远程克隆并持久化控制目标用户账户。

首先做沙箱方面的简介,之后介绍我们研究的动机,在此基础上我们会实现三步对沙箱的攻击,首先是实现关掉浏览器页面之后仍然能够存在的。第二个即使重启设备攻击仍然是有效的,第三个甚至重装系统攻击仍然是有效的。

大家都用过浏览器,在浏览器上面打开一个页面那个页面和浏览器主进程之间是不一样的,如果它一样,我只要攻击了一个页面,其他浏览器的很多内容都能被我获取到,为了规避这样的情况,现在主流浏览器全部加上了一个(英),一个沙箱的机制,一个沙箱就是一个独立的进程,当(英)没有渲染和GS执行的时候会在一个独立的进程里面进行渲染,如果出现问题也不会影响其他的情况,它有几个不同的限制,这边列出的就是资源方面的限制,它本身获取到的资源有限,IBC和内核交互也有限制,在此之外,现在也有一些新的浏览器也加上了一个(英),一个页面上可能有不同站点的页面元素,每个站点元素在不同的进程中存在,就算攻陷了其中一个页面的进程你也无法去把整个页面其他来源的(英)拿到,它已经在2018年5月份在(英)上面已经生效了,而且是默认开启。

除此之我们要知道的是沙箱逃逸是非常困难的事情,现在想象一下手机上打开一个恶意页面,可能你觉得是正常页面,你连到了一个会场wifi中,随便打开一个页面它可能就在攻击你,然后拿到你浏览器的执行权限之后,仅仅能干的事情把自己本身的页面能偷到,但是不能干其他的事情,就是因为沙箱的限制,如果想做更多的事情,需要把沙箱给突破,突破沙箱是非常困难的,因为沙箱有很多新特性会把很多东西都限制起来,一般情况下大家能够开发的特性越多,那么你的漏洞会越多,沙箱不是这样,沙箱特性越多,限制越多,攻击越困难,越加越多的限制之后沙箱越来越攻击困难,大家也可以了解从一个侧面跟大家描述一下,因为大家都知道一个东西的难度跟它的价值是有正关系的,可以清楚的看到(英),(英)上突破沙箱要50万美元,一个漏洞是50万美元,如果没有沙箱逃逸只给7500美元,这就体现了沙箱逃逸本身漏洞的难度和价值所在,每年也会有沙箱逃逸漏洞存在,但是比较困难,我们能不能改变思路,在沙箱内部攻击而不直接打倒它,是不是也能获取很多攻击的结果?我们投入需要性价比,我拿一个50万美元的漏洞去打一个受害者投入产出比是非常低的,如果没有突破沙箱直接突破7500美元就可以达到,不打破沙箱可以做什么事情,这就是我们研究的东西,有很多之前的工作,在沙箱中不突破,可以干一些(英)横向移动,端口扫描,做攻击的人比较清楚,但是它本身也干不了更多的事情,只能在这个页面当中进行,一旦关掉了恶意页面所有攻击全都失效,在页面打开的情况下,我们可以通过一些页面上展示的方法,就不一一展开了,当(英)打开的时候保持攻击持久化是可行的,但是完掉这个页面之后,攻击代码是否还在手机或者是电脑里,一般情况下是不在了,之后我们的研究思路是什么?首先第一点想到的是就算关掉了浏览器页面,发现这个页面你把它关掉,关掉之后是不是恶意代码能不能不让它消失?这就是我们的目标,我们的目标是把恶意代码攻击的思路站在攻击者的角度,他们就想把恶意代码保持的越久越好,   可以通过渲染器进程的(英)拿到当你关闭这个页面之后,恶意代码仍然在的攻击方式,之后我们再使用(英)污染机制,即使打开一个恶意页面把手机重启了,恶意页面还在,之后我们就提出了一个新的攻击思路叫做(英),通过这样的方式即使升级了浏览器,把这样的方式装上仍然能够控制你的账户,相关细节就一笔带过,会把主要思路给大家讲一下。

渲染器进程,我们的目标就是关掉这个页面之后依然存在,方式就是把退出的方式给(英)掉,我现在能够在你的页面中执行任意代码,这是我们的攻击思路,试想一下这样的场景,打开手机页面,关掉,那个浏览器页面还在,浏览器只是认为我把它关掉之后这个页面就不应该显示了,不显示之后页面还在后台,是不是会被浏览器杀掉,如果不杀掉是不是就存在在你的后台?关闭页面有两种方式,第一种是我告诉这个页面我要关掉你了,你把自己杀掉。第二种当我发现你没杀掉自己之后,我会强制把你给做掉,如果没有用第二种思路,仅仅告诉它自己关掉,岂不是就是一种攻击思路,我们测试了一下发现在windows上(英)和安卓上的(英)都可以实现这样的攻击,现在安卓手机打开一个页面,现在关掉页面,那个页面一直在后台运行着,这都是可以存在的,我们成功的在IE和Firefox,就是告诉这个页面自己关掉,chrome如何关闭tab,我们研究一下chrome,chrome是通过两种方式,首先会让它自己杀自己,会返回我正在跑的状态,发现你还在运行的时候,我们在第二个进程里面会调(英),调到最后是(英),在(英)上面是要去杀它,在这样的情况下,chrome在mac是不可以实现这样的攻击,在安卓上面是可以的,在安卓上面有一个特殊的机制,一般情况下大家理解打开一个页面,本身这个页面应该是浏览器进程产生的,但是在安卓上却不是这样的,安卓有一个特殊的机制叫做(英),发现沙箱进程负进程其实不是(英),负进程是在(英)这个特殊的进程,特殊进程是(英)tab页面,浏览器想杀它是杀不掉的,他们两个权限是在一个层级,都是在应用权限,其次他们俩也没有上下级,这里是杀不掉,杀不掉当然就出现了问题,(英)进程无法把(英)进程正确的杀掉,谷歌现在已经修了,通过(英)的方式,把它给修掉了,也是一个相关的漏洞CVE,大家有兴趣可以看一下,在整体的实现思路就是(英)API,API只要我自己不关闭就不杀掉,别人不杀我我就一直在,我的恶意页面一直在我的后台运行。

我们就实现了第一种攻击思路,在我关闭了页面之后恶意代码仍然存在,不仅关掉页面,又把浏览器关掉了,甚至把我的设备都关掉了,是不是我恶意攻击还能存在?我们继续往下研究,发现通过cache是可以实现的,为什么使用cache,本身浏览器它是经常会使用的,大家觉得我打开浏览器不多,但是你打开微信,打开支付宝上面点的每一个按钮,每一个链接都是用浏览器渲染后台的,现在相关的特性和速度大家觉得非常重要,cache是提升速度非常重要的方式,我把常用的方式cache到本地,就不用随时到本地下载,现在cache用的非常多,每个浏览器都会把常用的资源和代码cache,而这些cache会带来一定的问题,首先它广泛用于各大浏览器。其次可以保存很长的时间,最后它可以被污染,cache污染也是我在拿到浏览器tab页面可以做的事情,研究之后针对HTTPcache,这只是其中的一个cache,为了方便讲述,我们需要通过污染HTTPcache拿到一个持久权,我们成功在windows,MAC都做了实验,但安卓和其他限于时间,就没有都做这个实验,完全都是可以的。

这是我们的攻击思路,攻击者可以控制受害者打开一个页面,或者是受害者打开攻击页面,会把这个页面相关的cache污染代码给注入进去,之后我需要把这个页面设计它跳转到一个我要的页面上,比如说谷歌的(英),之后用受害者打开这个页面之后就会有cache的出发,它为了速度快肯定要先看一下本地有没有,发现本地有,我就不会在网上下载,就会加载污染cache,打开之后我就可以把我相关的代码给触发掉,好像听起来很简单,因为有cache的存在,只要把它污染,之后每次打开浏览器,打开页面都会产生这样的结果,而我们攻击的方式是污染新页面的tab,每次打开新页面就会触发代码,所有人都会打开一个新页面有这个操作,我是能够一直在你的浏览器当中存在的。

我们看一下我们是怎么实现的,这是第一步,首先我要获取你的远程代码执行权限,因为浏览器越来越重视性能,可能加很多提升方式,它漏洞的数量就不是特别少,几乎每个月都有一个非常好的控制你手机浏览器的漏洞出现,而这些漏洞能够非常轻易的被攻击者拿到,拿到你手机浏览器tab控制权,拿到你浏览器页面控制权之后,把相关cache的代码给放进去,我现在放到页面上是一个测试的,转入目标页面注入payload,我们注入的是(英)页面,大家都要打开,每次打开都会触发,每次它打的时候我们就会(英)一下,受害者打开目标页面,每次打开浏览器,打开新页面的时候,都会受害,手机重启或者是浏览器重启都是可以的,它还是一直存在,每次(英)能注意到,如果注入的是密码GS,就完全注意不到了。

我们能存活多久?是有几个字段控制存活长度,控制的方式比较方式,这边不再具体讲,我们测试了之后在有限的测试环境下两天时间是完全可以的。

如何获取更久的存活?因为这个cache是会过期的,根据每个页面的属性都不一样,可能存储几天可能这个cache就该更新了,如何活的更久?如何让我的恶意代码,攻击者,怎么让更久的存活?像(英)存活更久的本地cache,(英)是一个网站为了提升访问速度的思路,把常用的GS代码,拉下来以后直接存到本地,下一次直接用,是没有过期时间的,分析了前一万个域名,发现四千个网站把(英)存在本地,只要把这个(英)里面的GS代码污染,每次打开这些页面都会触发恶意代码,这是在国内讲,不方便放国内的厂商,一万多个四千多个都有大家可以想象到,它不是一个漏洞,本身仅仅是为攻击者打开一个持久化大门,能让厂商说你不要用(英)吗,也不行,是为了提升速度,为了提升速度带来的麻烦我们要了解的。

在此之外,新的浏览器特性也注意到这些点,也开了更多的特性,像Site Isolation在我们的攻击当中,过不了Site Isolation,有了Site Isolation之后,每一个页面上的站点都会是一个进程,互相之间是没法污染的,一个攻击者,比如说叫(英),它的GS是没法污染到(英)GS的,即使你们在一个页面中用(英)连接进来也是没办法污染的,但是我们也把它给突破了,我们是怎么突破的,首先先看一下Site Isolation是在(英),去年上去的,它当时是为了缓解(英)攻击,当时是一个幽灵漏洞,正好把我们的攻击思路也给修掉了,它不同的页面会在不同的进程里,如何绕过它,我们在此基础上研究了其他的cache,发现其中有一个特殊的cache叫做V8代码cache,而这个代码也是cache的一种,但是并不受(英)的影响,我们可以用它实现长久的攻击,(英)它的核心函数在(英)里面,相关的攻击策略跟刚才的有点类似,受害者打开页面,攻击者可以获取页面控制权,之后打开一个被污染的页面之后可以触发代码,其中会有很多比较多的(英)在里面,我们需要把其中的(英)给匹配上,因为本身这个(英)并不是说你给他任何一个东西都可以,他需要看的是正常(英),我们可以分析一下在第一次check的时候会有这么多的流程,在其中最主要的是标黄这一点,(英)它是一个比较重要的参数,我们需要把这个东西给模拟出来,怎么拿到相关的参数模拟出来正确的check?渲染进程通过自身获取(英),之后通过这样的思路,同样的方式去(英)请求我们需要的(英),获取之后就可以把其中的(英)找出来构建出来正常的(英),过了这个check就会有额外的check,刚才是部署时候的check,也是跟刚才一样,也会检查一些参数是否匹配,而这些参数恰好我们也能拿到,比如说(英)我们可以看到是通过这样的计算方式拿到的,这就不展开讲,计算方法包括(英)我们都在tab的权限下获取到的,之后我们可以通过比较公开的特征把它给绕过,check C也是一样,这边就不展开讲,之后我们成功的在(英)两个月前的最新版本实现了cache持久化,即使打开了(英)最新的特性,我仍然可以在你的页面中长久的存在,打开恶意页面重启浏览器、手机都没用,这是我们相关的攻击思路,首先(英)它的函数,构建payload,构建相关的payload,可以把这个cache写进去,通过一个(英)也是一样的(英),让大家清楚的看到我们攻击成功了,注入进去,V8的code cache是不受跨域污染,这个code  cache是执行权限的cache,是在页面当中需要执行的片段,在cache持久化的防御方面,我们会发现它有很多的cache,检查了很多次,我们一一把它突破,这是为什么?是因为核心能够在我自己的权限当中获取所有的cache相关的知识,仍然能够把cache过掉,我们现在就需要提出一些思路,本身是有(英)进程来限制,而不是由你自己来限制,而(英)不能修改其他(英)的限制,同时跟刚才的思路一样,我们在(英)进程那边得设置一些我tab不知道的东西去cache才能真正防御,否则加上之后在下面仍然能把你过掉,(英)加上(英),大家也不用担心这是我们之前的例子,这是它的评估,在V8 cache这一方面可以实现在重启手机之后仍然存在,如果重启(英)到一个新的(英),直接升级了(英),重装了(英)一个新的版本是可以的,是能够突破攻击的条件,目标的URL把(英)给改了也可以继续突破,在这样的防御方案都是可以通过精巧的攻击把它绕过的。

重装浏览器把原来的删掉再装一个新的进去,这样是可以防范我们的攻击,我们怎么能把这个攻击也给做了?即使你把设备重启,即使把浏览器重装,还能攻击呢,我就提出了一个克隆攻击的思路,我们知道安卓webView本身是非常重要的组件,这个浏览器并不是独立的浏览器,如果打开朋友圈的链接,一点,并没有跳到浏览器,直接在微信里打开,就是因为微信直接用了系统webview,就可以在任何应用当中打开界面,而且能够微信打开页面之后被微信所配置,可以配置它各种方面的属性,(英)它的安全机制首先在安卓7或者是7.1之前,都是和主app是共享一个进程,微信打开一个恶意页面,那个恶意页面本身所在的进程和你微信的进程是一样的,是不是觉得很危险?但是安卓8.0之后打开一个页面之后,那个页面和你本身微信、支付宝本身的APP是隔离开的,通过(英)来缓解这样的攻击思路。

我们再说一下克隆攻击是什么,如何在(英)得到一个持久化攻击?首先我们需要从webView拿到应用本身的东西,我就是想知道支付宝的数据,其次还要保持控制,其次最好是远程的,隐蔽的,(英)是满足了所有的条件,什么是克隆攻击?说克隆大家都会觉得是生物学上的克隆,我通过一个细胞核就可以把一个生物完整的拷贝过来,对移动设备,移动设备最重要的是移动应用,怎么能够克隆到所有的信息?本身是我们需要梳理的东西,现在说一下移动应用什么是它的细胞核,最关键的一点怎么把它拿过来,现在的应用,大家现在用的微信、微博都是基于云端去考虑设备的,很多东西并不是存本地,肯定是存在云端,想要的就拉下来。

第二个长时间保持在线状态,每次登微博都上一次账号,输入一下账户密码才行这肯定是不接受的,保持登录状态长久。第三点也是比较重要的,跟PC端为什么不一样,因为用手机IP和位置经常会变的,云端并不知道你到底是不是你自己了,马上出差到美国,现在就在美国登录了,异地登录也是很容易之前PC端异地登录了,在另外一个地方下线,现在下线大家的用户体验非常差,稍微移动一下或者是拿着手机跑到其他的地方就下线了。

首先我们在移动应用上需要的是长久存活的,我们就有这样的想法,能不能通过某种方式把你的这些核心(英)给偷过来,这里面跟(英)有一些区别,左边是受害者,右边是攻击者,受害者用了最新款的三星手机,Facebook用也是最新款,受害者需要做的就是随便扫一个二维码,之后我们会发现攻击者这边有一些反应,攻击者这边是把受害者整个APP信息全部都拿过来了,是一模一样的东西,而且受害者根本不知道,他觉得自己的账户很正常,实际上有一个远处的人在盯着你,当我想发一个东西的时候,可以随时在攻击者的手机上发出去,他已经把状态直接发到他的账户上了,攻击者可以拿到受害者应用上面的所有东西,基于云端,只要拿到(英),云端申请,所有东西都在我这里,我想发什么都没有问题。

怎么才能达到这样的攻击效果?首先怎么偷到?之前在安卓7.1之前,(英)和(英)是共享一个进程,现在我们都知道我直接通过一类或者是N类的漏洞,而这个漏洞是(英),而webview并不是app自带的,装一个微信或者是支付宝并不自带的浏览器,这个浏览器是你手机里面的,而手机里面浏览器的更新webview更新会非常慢,根据我们的调查,绝大数的手机webview都会有,拿到它的(英)是非常简单的,在安卓7.1之前他们俩又是在同一个进程里,访问一个恶意链接,拿到你的控制权,把你的(英)全部偷过来,刚才那个并不是Facebook的问题,是手机上webview组件的问题,它的组件更新到最新版本但还是有这样的漏洞,导致我可以拿到那个手机上面所有跟Facebook这样所有APP,并不是Facebook的问题。

在安卓8.0之后,大家用安卓觉得7.1之前也只占用户量的一半左右,大多数人已经升级到了8.0,甚至9.0,那么安卓O之后怎么攻击?安卓O之后每一个webview的进程都是独立的,我获取到页面之后我是没法获取到应用的(英),之后怎么办?把这个APP和webview是有相关的墙在那儿挡着,自己不能访问网络、读写硬盘,我们可以通过一个误配置的webview来实现克隆攻击,手机浏览器页面是有需求跟手机APP通信,现在在微信支付宝打开一个他们自身的链接,他们总不能让你再登录一次,他们俩之间肯定需要有信息交互,很多时候需要打开相关的配置,开关,而这其中有两个配置开关叫(英),这两个开关能够打开会怎么样,会发现打开之后如果他们俩任何一个打开了,(英)都能够允许通过(英)的方式获取到这个APP中所有的文件,当一个应用打开开关之后,我们可以通过webview来实现同样的攻击效果,通过SD卡放一个(英)存到SD卡之后,之后再通过get的方式把它(英)给传到云端,就直接获取手机APP中的文件,如何让一个APPwebview去漏的一个file,这个有点绕,对安卓不太熟悉会不太理解,我们今天讲的内容是沙箱,沙箱APP也有沙箱,不仅APP有沙箱,而且不同浏览器不同域之间也有相关的限制,我们从APP打开的页面是APP的,是无法跨域到(英)域,无法通过(英)去获取到(英),怎么才能能够从APP域到(英)域,用一个UXSS漏洞也是不太合理的,最后我们发现可以使用(英),这个是每个APP自定义的链接形式,比如说打开了一个淘宝:/线,打开它,浏览器就会跳转到淘宝,打开浏览器的页面会跳转到APP上,就是这样的思路,本身我们在webview会有这样的攻击入口,通过(英)这个就不详细展开了,这边的效果,我点一个页面,下载到SD卡之后,我再通过(英)让它再加载SD卡的恶意文件,我需要一个跳板,首先下载下来一个文件,这个文件有恶意代码,再通过(英)的方式把它给加载进来,加载的方式是通过(英)加载的,现在就不存在(英)和APP之间的跨域关系,现在直接拿到应用里面的(英),这个是我们攻击的思路,受害者打开一个钓鱼链接,是能够直接把文件下载到SD卡,相关的(英)会不会触发,就会把英)发送到攻击者服务器上,之后通过(英)去拿到所有的账户信息,任何沙箱都没突破,任何沙箱也都没有阻挡,但是已经拿到了他的账户永久控制权,现在他的APP(英)是不过期的,file,URL,并不是我想加载一个什么就可以加载,应用也会想着去防御攻击,大部分应用防御是比较困难的,前面的防御几乎是不可能的,可以通过(英)或者是(英)的方式把它绕过去,之后就可以实现在很多应用上实现攻击思路,这都是我们攻击的流程中需要绕过的方法,通过这样的方法几乎能绕过几乎所有的APP都可以绕过。

绕过防御,还有另外一点防御,有一些应用会想到会不会把我的(英)给偷走在其他地方就可以登录?那我需要跟你的设备绑定一下,我要绑定到设备的(英),只有你的设备(英)跟我登录过的设备一样,才能认为你可以登录上去,否则就是把你的(英)偷过来,这样他们想到了防御,但是没有想到是不是可以简单的绕过,虽然有一些应用会有防御措施,但是他把获取到的(英)绑定信息也当成文件存到了本地,之后仍然可以通过刚才提出的攻击方式把这些文件也拷贝到,这就绕过了相关的防御,这是相关的攻击思路。

这是我们对于漏洞的缓解和防御,我们可以通过把(英),不要接受任何的外部链接,把(英)安全的放在(英)来防御。

这是举的国内厂商的例子,200家有27个是可以非常简单的获取到,一些财经应用,购物应用都会有这样的问题,最后我们可以在不突破沙箱的情况下获取到很多攻击的方式,之前提到的能够达到最终的(英),一直保持登录。

这是我们的结论,很多攻击仍然能够在不突破沙箱的情况下完成,攻击者可以偷掉很多受害者相关的账号,克隆他们的账户实现非常长时间的攻击,这句话跟浏览器安全或者是沙箱开发者说的,很多厂商也有这样的疑惑,沙箱已经严谨了,很好了,但是它是现在最好的选择,肯定要加,不是说加上就完全没事,仍然可以做很多事情,现在研究很多的沙箱机制能够实现更长的攻击,这是我们今天实现的三种攻击,都报给了厂商,也全部修补了,大家不用担心。(速记)

上一篇:汤青松:PHP反序列化漏洞分析实践

下一篇:李琦:声纳信号:安卓图案锁的噩梦