北京時間1月22日,“穿云箭”組合漏洞媒體溝通會于360大廈召開。上周,谷歌官方發文致謝360 Alpha團隊,并向360 Alpha團隊負責人龔廣頒發了總額為112500美金的安卓漏洞獎勵計劃(ASR)史上最高金額的獎金。360 Alpha團隊在2017年8月向谷歌提交了關于攻破Pixel手機的“穿云箭”組合漏洞報告。
谷歌砸重金求安全公司挑錯Android Security Rewards(ASR)項目是Google于2015年啟動,主要對那些向公司提交Android安全漏洞的安全專家提供獎勵。該項目要求專家在運行最新Android版的Pixel手機和平板上進行測試,然后根據漏洞的危險程度來提供不同的獎金。
該項目于2017年6月的到了安全專家和白帽子們的大力支持,但是Google表示:“每個Android版本包含更多的安全保護,但是已經有兩年沒有專家獲得漏洞鏈這個頂級大獎了。”不過在上周五,公司終于宣布來自奇虎360技術公司的Guang Gong贏得了這個大獎,獎金共計達到11.25萬美元(約合72萬人民幣)。
圖:谷歌團隊發文致謝360團隊
據360安全團隊介紹,這次發現的兩個漏洞分別是基于Chrome瀏覽器的V8引擎漏洞CVE-2017-5116,以及Android系統漏洞CVE-2017-14904,是ASR首個可以遠程有效利用的系列漏洞。其中,Chrome瀏覽器漏洞CVE-2017-5116可被用于在Chrome瀏覽器沙盒內遠程執行代碼。
“穿云箭”組合漏洞可以徹底遠程攻破谷歌Pixel手機,對用戶的隱私及財產安全造成極大的威脅。為了保護用戶的手機安全,360 Alpha團隊在17年8月將該組合漏洞報告給谷歌,已成功幫助其修復Android 系統和Chrome瀏覽器。
圖:360助理總裁兼首席安全工程師鄭文彬現場演講
之所以此次Google會頒發如此高的獎金,一方面是由于“穿云箭”組合漏洞的影響面廣,未修復前大部分安卓手機都可能會被黑客利用這個組合漏洞攻破。另一方面該漏洞是基于底層系統存在的,能影響手機設備上所有應用,甚至包括電話短信等基礎應用,造成的危害最大。不法分子可利用該漏洞獲取用戶短信驗證碼、支付應用權限等,對用戶的個人隱私和財產都造成極大威脅。
Pixel遠程利用鏈的技術細節根據谷歌發布的在線安全文檔,我們找到了有關這兩個漏洞的技術細節。
漏洞鏈包括兩個漏洞,CVE-2017-5116和CVE-2017-14904。CVE-2017-5116是一個V8引擎錯誤,用于在沙盒渲染過程中獲得遠程代碼執行。CVE-2017-14904是Android的libgralloc模塊中的一個漏洞,用于從Chrome的沙箱中轉移。通過訪問Chrome中的惡意URL,這個利用鏈可以用來將任意代碼注入到system_server中。
RCE錯誤(CVE-2017-5116)V8 6.0引入了對SharedArrayBuffer的支持,SharedArrayBuffer是一種在JavaScript工作人員之間共享內存的低級別機制,并在工作人員之間同步控制流。
SharedArrayBuffers給JavaScript訪問共享內存,原子和futexes。WebAssembly是一種可以在現代Web瀏覽器中運行的新類型的代碼,它是一種低級匯編式語言,具有緊湊的二進制格式,可以接近本機的性能運行,并提供匯編語言(如C / C ++)目標,使他們可以在網上運行。通過在Chrome中結合使用SharedArrayBuffer WebAssembly和web worker這三個功能,可以通過競爭條件觸發OOB訪問。簡而言之,WebAssembly代碼可以放入SharedArrayBuffer中,然后傳遞給Web Worker。當主線程解析WebAssembly代碼時,工作線程可以同時修改代碼,這會導致OOB訪問。
多功能代碼位于函數GetFirstArgumentAsBytes中其中參數args可能是一個ArrayBuffer或TypedArray對象。將SharedArrayBuffer導入到JavaScript后,TypedArray可能由SharedArraybuffer支持,因此TypedArray的內容可能隨時由其他工作線程修改。
i::wasm::ModuleWireBytes GetFirstArgumentAsBytes( const v8::FunctionCallbackInfo沙盒轉義錯誤是由map和unmap不匹配造成的,這會導致Use-After-Unmap問題。
static int gralloc_map(gralloc_module_t const* module, buffer_handle_t handle){ …… private_handle_t* hnd = (private_handle_t*)handle; …… if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) && !(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) { size = hnd->size; err = memalloc->map_buffer(&mappedAddress, size, hnd->offset, hnd->fd); //---> mapped an ashmem and get the mapped address. the ashmem fd and offset can be controlled by Chrome render process. if(err || mappedAddress == MAP_FAILED) { ALOGE("Could not mmap handle %p, fd=%d (%s)", handle, hnd->fd, strerror(errno)); return -errno; } hnd->base = uint64_t(mappedAddress) + hnd->offset; //---> save mappedAddress+offset to hnd->base } else { err = -EACCES;}…… return err;}gralloc_map將由參數句柄控制的圖形緩沖區映射到內存空間,而gralloc_unmap將其取消映射。映射時,mappedAddress加hnd-> offset被存儲到hnd-> base,但是當unmapping時,hnd-> base被直接傳遞給系統調用unmap減去偏移量。hnd-> offset可以從Chrome的沙盒進程中操作,所以可以從Chrome的沙盒渲染進程中取消映射system_server中的任何頁面。
static int gralloc_unmap(gralloc_module_t const* module, buffer_handle_t handle){ …… if(hnd->base) { err = memalloc->unmap_buffer((void*)hnd->base, hnd->size, hnd->offset); //---> while unmapping, hnd->offset is not used, hnd->base is used as the base address, map and unmap are mismatched. if (err) { ALOGE("Could not unmap memory at address %p, %s", (void*) hnd->base, strerror(errno)); return -errno; } hnd->base = 0;}…… return 0;}int IonAlloc::unmap_buffer(void *base, unsigned int size, unsigned int /*offset*/)//---> look, offset is not used by unmap_buffer{ int err = 0; if(munmap(base, size)) { err = -errno; ALOGE("ion: Failed to unmap memory at %p : %s", base, strerror(errno)); } return err;}盡管SeLinux限制了域isolation_app訪問大部分Android系統服務,但isolated_app仍然可以訪問三個Android系統服務。
52neverallow isolated_app {53 service_manager_type54 -activity_service55 -display_service56 -webviewupdate_service57}:service_manager find;要從Chrome的沙箱中觸發前面提到的Use-After-Unmap錯誤,首先將一個可解析的GraphicBuffer對象放入一個包中,然后調用IActivityManager的binder方法convertToTranslucent將惡意包傳遞給system_server。當system_server處理這個惡意軟件包時,會觸發該錯誤。
360攜手移動安全聯盟推出“先行者”行動目前,我國Android系統手機用戶占比超過50%,數量非常龐大。然而由于補丁的下放延遲,導致市場上的Android手機會存在漏洞修復相對滯后的情況。大多數手機廠商,對于Android系統漏洞的修復都是在等待谷歌官方的補丁。然而,從白帽子發現漏洞提交給谷歌,谷歌收到漏洞報告進行修復,最后下發補丁給廠商需要一段相對漫長的時間。在這段期間,手機用戶往往會因為各類漏洞而面臨著一定的安全威脅。
2017年12月,中國信息通信研究院泰爾終端實驗室牽頭會同設備生產廠商、互聯網廠商、安全廠商、高等院校共同發起成立移動安全聯盟(Mobile Security Alliance,簡稱MSA)。
因此,作為移動安全聯盟理事成員的360,與移動安全聯盟攜手,推出“先行者”行動,與移動安全聯盟一起,幫助國內移動廠商成為漏洞修補的“先行者”。
圖:移動安全聯盟標準政策組組長翟世俊博士現場演講
未來,“先行者”行動將配合移動安全聯盟漏洞修補相關計劃,360在發現漏洞信息的第一時間與移動安全聯盟成員共享,從政策、標準、檢測、修復、應急響應等方面積極推進,與合作廠商同步,判斷漏洞風險,并聯合制定防御方案,確保最短時間內對漏洞進行修復。