本議題將介紹演講者對多款流行安卓模擬器的安全研究,演講者在其中中發現了數十個安全漏洞,這些漏洞可以導致虛擬機器ROOT提權、資訊洩露、DOS、虛擬機器逃逸等攻擊效果,議題將以這些實際的案例介紹對安卓模擬器進行動靜態分析的技巧,然後介紹每款模擬器和 Guest 作業系統的通訊機制、攻擊面、軟體架構以及發現的部分典型漏洞,此外還會展示幾個從虛擬機器普通apk許可權,提升到 ROOT 許可權,然後進一步完成虛擬機器逃逸的案例,最後會給出一些提升安卓模擬器安全性的建議。
下面就讓我們來回顧看雪·第七屆安全開發者峰會(2023 SDC)上《從探索到利用:揭示安卓模擬器漏洞》的精彩內容。
01
演講嘉賓
【羅思禮-安全研究員】
二進位制安全工程師,有豐富的二進位制漏洞挖掘和利用經驗,在 HITB,BlackHat 發表過技術演講。
02
演講內容
以下為速記全文:
大家上午好,很高興有機會跟大家分享一下我之前對安卓模擬器的一些研究。我現在是在華為RO0T實驗室,做一些二進位制漏洞挖掘相關的工作。今天主要會以這三個部分來進行介紹:首先我們會進行一些背景介紹,然後講幾個具體的案例,最後做一些總結,給出一些增強安卓模擬器的安全能力的建議。
首先講一下為什麼要去研究安卓模擬器。本身我自己也經常用安卓模擬器來做一些 Apk的分析以及一些遊戲的使用,還有我想透過這個去研究一下模擬器的實現,還有虛擬機器逃逸的一些方式。
下面兩張圖是分析機構對安卓模擬器市場的一些統計:
模擬器的一些攻擊場景主要有三類:
第一個是普通的使用者,可能會去跑一些不可信的應用,比如破解應用、外掛。
第二個話就是惡意軟體分析人員分析惡意apk的時候,會用到模擬器。
第三個比較嚴重一些,可能是雲手機這樣的場景。其實雲手機的實現也基本上是基於模擬器做的。
危害其實有兩塊:
目前模擬器的實現方案大概有這麼幾種:
一個是基於Docker的,就是開源的Anbox;
windows的安卓子系統,它是基於他們自己的Hyper-V虛擬機器;
QEMU,QEMU是谷歌的官方模擬器,我瞭解到有一部分的雲手機廠商,他們其實也是基於QEMU去做了一些定製;
第四大塊的話基於VirtualBox,個人使用者用的這種桌面級的虛擬機器其實都是基於VirtualBox做的。
我們今天就是對基於VirtualBox的模擬器進行安全分析。
下面這張圖其實是之前長亭的一個專家分享過的一個VirtualBox的一些架構圖,VirtualBox它在 Guest和host的使用者態和核心都會放一些東西來完成這些虛擬化的過程以及它的一些互動。
之前的一些研究主要集中在host 側的一些外設,我們今天也是針對這些外設進行一些分析,主要專注在各個廠商為了提升他們模擬器的使用者體驗方面,所實現這種自定的外設這方面的一些安全漏洞。
我分析了市面上6款這種安卓模擬器,這幾款其實都是會有一些漏洞。至於效果,其實5款我們可以做到用普通apk提到root許可權,然後其中的三款是做了虛擬機器逃逸的一個exp,漏洞型別的話主要就是一些比較常見的記憶體漏洞,像這種溢位、陣列越界、條件競爭以及一些邏輯漏洞。
由於時間限制,我主要介紹4個廠商。
A 廠商是沒有實現虛擬機器逃逸的,以它為例來介紹一下整個的分析流程。
首先我介紹一下分析使用的一些工具和思路,工具的話其實就是用了Ida做一些逆向分析,然後用了偵錯程式以及Frida做一些程式執行時的分析。
下面的procexp以及tcpview用來從宏觀的角度上看一下目標的程式情況以及一些埠情況,能夠方便我們去定位關鍵的程式。
最後面 dadb庫的話,它是用Java實現了一個APP的客戶端,它的作用是可以透過apk使用Java程式碼去連線,以TCP模式起的abdadb的服務,後面會講到。
然後我們分析的思路的話,其實有以下幾部分:
首先我們需要去定位模擬器程式,因為目標的一個模擬器它會有很多的程式,它其實只有某一個程式,它是專門做虛擬機器模擬以及外設的一些模擬的程式。
我們定位程式之後,我們要定位到它這個裝置起來之後,它到底有哪些外設是載入進來給 guest用的,之後我們需要去恢復一些關鍵的結構體,再去定位這種ml以及破了io這種 guess的測和後側的互動的函式,用來做攻擊的一些入口。
後面我們再基於這個入口開始去做一些分析,就能夠發現一些漏洞。
我們分析之前需要被繞過反調式,VirtualBox非除錯版是有反調式的,繞過方式:隨便找一個dll,把它第一條指令改成一個死迴圈,那麼它在程式起來之後,會處於一個死迴圈的狀態,然後我們再用除錯attach上去就可以進行除錯了。
然後我們需要去恢復一些關鍵的結構體。在VirtualBox裡面的話,其實每一個外設它都有一個 devIns 這樣一個結構體來管理它裡面的一些狀態以及一些資訊。
devIns 中有一個函式表指標,透過逆向以及除錯去恢復這樣一個結構體的函式表
之後,我們再根據這些函式的作用,可以進一步反推它外設的一些邏輯。
這邊是一個我們恢復之後的情況,我們恢復之前它是會有很多那種交指標加引用,然後我們透過除錯恢復右側那種標紅的那幾個函式之後,我們透過這個函式的使用,可以進一步的去把剩下的一些結構體給它恢復出來,大概恢復完之後就是一個可以人工分析的狀態了。
然後介紹一下對廠商A 的分析思路。
首先我們介紹guess側提權的 bug。在安卓系統啟動之後,他會在5555埠監聽一個 adb server,然後我們去連線5555埠就可以獲取一個root許可權。
然後我們透過反覆的開啟和關閉模擬器程式,去對比程式情況,其實可以找到這麼幾個程式是和目標模擬器相關的,然後我們再去透過一些除錯以及一些字串的檢視的話,其實是可以定位到程式大概是叫做VendorVmHandle.exe。
我們找到目標程式之後,需要去定位到它有哪些外設被啟用。VirtualBox的pdmR3DevInit 函式的作用是調每個外設的建構函式,初始化外設。
它初始化的過程中,它後面會有一個字串,我們可以透過這個字串找這個函式,然後我們在這個地方下一個日誌斷點,就可以把模擬器啟動過程中的所有的外設都給它列印出來。
這個裝置其實是隻有一個外設AAAptdevice 。它位於 VENDORa.dl 裡面,然後這去分析DLL 的入口函式叫做VboxDevicesRegister,它裡面會去註冊gDevStruct,這個結構體定義的外設的名字和建構函式。
ptR3Construct 會註冊IO Port, guest寫這些IO Port 與 host 通訊,這邊是它裝置比較高層次的結構的一個互動圖,它左邊是guest,右邊是 host。
Host裡面會有很多執行緒,主要就是IO 執行緒,IO PORT註冊的回撥函式就在該執行緒處理,還有一個GL 執行緒用於 GPU渲染加速。
外設的主要邏輯是透過 port io以及共享記憶體,實現了一個virtio的通訊通道,然後這兩個guest的側透過這些透過 virtio 和 GL 執行緒 進行互動,主要就是guest的側會把一些影像解析、影像渲染的東西扔給GL 執行緒 去完成圖形的渲染。
ptR3Construct會去構造初始化8個 virtio佇列,然後註冊 IO Port的區域,在透過除錯可以知道它的起始地址為d240,Guest讀寫這個區域就會進到 vendor_pmio_xxx 函式中。
漏洞位於ptR3QueueTrans,它的關鍵程式碼如下:
漏洞在於read_size 大於 hdr->length 時會導致堆溢位。
我們進入下一個目標。它其實也是一樣的一些邏輯,透過連線5555 埠,可以拿到 root 許可權。
然後分析啟動日誌,可以知道它有6個自定義外設,均都位於 VendorDD.dll。
今天我們只看VendorPipeCommand 外設,它會註冊一些 virtio佇列,Guest 透過寫io port 選擇回撥函式進行通訊。
簡化的互動圖如下:
它的漏洞位於SHELL-TX 佇列的回撥函式中,它的一個漏洞成因其實也是非常簡單粗暴的,aSegsOut.CB沒有檢查會導致棧溢位:
經過分析目標程式沒有開啟棧保護且存在一個DLL 的基地址固定,利用思路如下:
我們會遇到一個問題,在嘗試使用者態去寫這種IO PORT的時候,Guest 核心會崩潰,經過一些排查,可能的原因是他用了 x86CPU暫存器的一個特性,禁止了在使用者態寫 IO PORT。
那麼解決思路也很直接,我們可以寫ko模組在核心去寫IO PORT,接著遇到第二個問題,我們如何在沒有原始碼的情況下編一個可執行的ko 模組,解決方案如下:
然後進入廠商D,經過嘗試發現開啟和關閉 root 許可權,虛擬機器不需要重啟,猜想想它應該內部有些程式會再去處理GUI請求。然後我在日誌裡面搜一下字串,發現了左邊這一塊程式碼,它好像是在設定 root 相關的屬性,我嘗試去把屬性給設成 1 ,發現系統會掛載 /system/xbin/su,透過執行 su 可以拿到 ROOT 許可權。
然後透過一樣的方式去找到目標的自定義外設,它總共有5個自定義外設:
今天我們主要講其中4個外設,這4個外設它的建構函式都是 VmmgrPciConstruct,該函式主要就是註冊共享記憶體、MMIO。
啟動之後,我們使用root許可權去目標系統裡面看一下io記憶體。
我們主要講講這4個外設,它其實每個外設都是類似的一個東西,它有一塊記憶體,然後有一塊共享記憶體做一些控制,比如說 Guest 要和 Host 互動會透過寫MMIO通知Host,具體的資料透過共享記憶體進行傳遞。
我們去讀寫記憶體的時候就會進到這兩個函式,最關鍵的就是PciMmiioWrite函式。
透過交叉引用,可以找到每個外設的pciWriteFn。
然後我們看一下一些漏洞,下面是由於校驗有誤導致的越界寫漏洞:
接著再介紹一下hcall機制:
hcallDecode 裡面存在許多服務和漏洞,比如OOB:
控制QDesktopServices::openUrl 引數導致程式碼執行的漏洞:
虛擬機器逃逸利用步驟:
下面進入最後一個廠商F,這個目標沒有提供啟用root許可權的開關,但是它的檔案系統中存在suid 的程式,可以用來提升到 ROOT 許可權。
模擬器在安裝之後,會在d盤一個固定路徑下面建一個共享目錄,這個目錄會掛載到虛擬機器的 /data/share目錄。
我們今天講的外設主要是VirtioVendorFPipe 外設,它也是註冊了一堆 virtio 佇列。
它註冊了16個佇列,不過16個佇列的回撥函式是同一個,只是引數不一樣。
越界寫漏洞:
第二行的時候,它會去讀一個32位元組的req,然後沒有檢查 req->payload_size,最後呼叫PhysRead把資料讀到 req->payload裡面去,控制req->payload_size 可以溢位 req->payload。
越界讀:
經過分析 req 位於 d11的的全域性資料區,透過除錯,發現它後面會有一些函式指標,我們透過讀取和篡改這些函式指標,我們可以實現繞過ASLR 和實現程式碼執行。
漏洞利用步驟:
最後給出一些提升模擬器安全性的建議:
*峰會議題PPT及回放影片已上傳至【看雪課程】https://www.kanxue.com/book-leaflet-171.htm
PPT及回放影片對【未購票者收費】;
【已購票的參會人員免費】:我方已透過簡訊將“兌換碼”發至手機,按提示兌換即可~
《看雪2023 SDC》
看雪安全開發者峰會(Security Development Conference,簡稱SDC)由擁有23年悠久歷史的頂尖安全技術綜合網站——看雪主辦,面向開發者、安全人員及高階技術從業人員,是國內開發者與安全人才的年度盛事。自2017年七月份開始舉辦第一屆峰會以來,SDC始終秉持“技術與乾貨”的原則,致力於建立一個多領域、多維度的高階安全交流平臺,推動網際網路安全行業的快速成長。
鑽石合作伙伴
黃金合作伙伴