劉惠明 騰訊玄武實驗室安全研究員
首先做沙箱方面的簡介,之后介紹我們研究的動機,在此基礎上我們會實現三步對沙箱的攻擊,首先是實現關掉瀏覽器頁面之后仍然能夠存在的。第二個即使重啟設備攻擊仍然是有效的,第三個甚至重裝系統攻擊仍然是有效的。
大家都用過瀏覽器,在瀏覽器上面打開一個頁面那個頁面和瀏覽器主進程之間是不一樣的,如果它一樣,我只要攻擊了一個頁面,其他瀏覽器的很多內容都能被我獲取到,為了規避這樣的情況,現在主流瀏覽器全部加上了一個(英),一個沙箱的機制,一個沙箱就是一個獨立的進程,當(英)沒有渲染和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個是可以非常簡單的獲取到,一些財經應用,購物應用都會有這樣的問題,最后我們可以在不突破沙箱的情況下獲取到很多攻擊的方式,之前提到的能夠達到最終的(英),一直保持登錄。
這是我們的結論,很多攻擊仍然能夠在不突破沙箱的情況下完成,攻擊者可以偷掉很多受害者相關的賬號,克隆他們的賬戶實現非常長時間的攻擊,這句話跟瀏覽器安全或者是沙箱開發者說的,很多廠商也有這樣的疑惑,沙箱已經嚴謹了,很好了,但是它是現在最好的選擇,肯定要加,不是說加上就完全沒事,仍然可以做很多事情,現在研究很多的沙箱機制能夠實現更長的攻擊,這是我們今天實現的三種攻擊,都報給了廠商,也全部修補了,大家不用擔心。