系統安全之教你如何利用漏洞ROOT安卓手機

2021-12-29 20:23:53 字數 3137 閱讀 9409

隨著移動網際網路的快速發展,智慧型手機、平板電腦等智慧型終端裝置逐漸普及,慢慢的融入了我們的生活。然而與此同時智慧型手機安全問題也越來越凸顯,手機支付漏洞、手機遠端定位、手機資訊洩露等問題屢見不鮮。

11月9日,為期兩天的第二屆中國網際網路安全領袖峰會(cyber security summit,簡稱css)在北京成功召開。作為主辦方的騰訊安全攜手來自世界的頂級安全廠商、產業鏈上企業、個人等圍繞時下物聯網、網際網路+等諸多議題進行了深入**,並在大會第二日特設了安全極客秀分論壇。該論壇邀請了來自今年geekpwn的優勝選手,對當時未能展示完全的專案進行深入展示。現正就讀於北京理工大學計算機系,來自長亭科技安全研究實驗室的實習生於晨公升帶來了題為《我的手機怎麼被別人控制了?——利用未公開漏洞root掉一款最**的流行手機》的精彩演講。

長亭科技安全研究實驗室的實習生於晨公升

在論壇現場,首先他邀請了一位參會者一起演示了如何利用未公開漏洞控制安卓手機,隨後與大家分享了自己是如何發現並利用漏洞,最終控制安卓手機的。

於晨公升與參會者正在進行現場演示

android系統架構解析

於晨公升指出,想要利用漏洞進行攻擊,第一步應該對android系統架構有足夠的了解才行。android系統架構主要分為四層,即是:application層、framework層、library層以及kernel層。手機的自帶應用在application層,這一層從安裝到執行其許可權最低。framework層主要為application層的應用提供系統服務,隨後在安卓程式執行時,需要第三層library層的支援,通過此層引入執行時所依賴的動態庫。kernel層為系統核心層。具體如圖所示:

如圖所示,特別是在android系統第四層核心層中包含許多廠商相關的驅動,例如顯示卡、相機、觸控螢幕的驅動等。於晨公升表示,為了支援不同的手機不同的晶元,需要進行驅動編寫給使用者提供相同的介面,導致廠商驅動的安全性比android核心本身的安全性差,廠商驅動為android系統帶來了新的攻擊面新的漏洞。因此,尋找手機漏洞,可以從這個層面出發。

漏洞分析

在分會場現場,於晨公升針對最新的一款手機實現了root,所利用的漏洞還未公開,所以他選擇了乙個已經公開並修補的漏洞分享了cve-2015-0569,cve-2015-0570, cve-2015-0571三個已知漏洞的利用思路和過程。

據悉,這三個漏洞由slipper在2023年的geekpwn上公開,存在於高通wlan驅動中的棧溢位與堆溢位漏洞,漏洞由於在進行記憶體拷貝之前未檢驗拷貝長度,導致緩衝區溢位。

隨後高通第一時間修補了漏洞,在記憶體拷貝操作之前進行了檢查,同時在呼叫對應的**塊之前進行了許可權檢查(cap_net_admin)。

漏洞利用

如何從發現漏洞到利用漏洞,再獲得手機root許可權呢?於晨公升解釋說,觸發漏洞後,就能夠達到的任意核心位址寫0效果。從0開始的位址無法申請,寫函式指標寫0無法實現,所以需要提公升條件,寫0但是不把所有的指標寫為0只是更改高位的,然後對位址進行操作。無kaslr,覆寫固定位址的指標高位是可行的。有時改寫函式值是不可行的,因為多數arm64架構的手機上pxn是開啟的,不能直接申請一段使用者態記憶體讓核心去執行shellcode。那麼此時該如何利用呢?

為了解決以上問題,於晨公升在煉表頭陣列inetsw中尋找到了突破口,如圖所示:

inetsw是linux核心用於維護socket建立時所需要的資訊的雙向鍊錶,inet_register_protosw時,將特定型別的socket資訊加入到鍊錶中, inet_create時遍歷鍊錶尋找對應資訊。包含proto, ops等結構的指標,這些結構中又含有許多的函式指標。

因此,如果在無pan的條件下,覆寫inetsw中某乙個next指標的高位,在使用者態偽造資料結構,可建立乙個完全被控制的socket,最終達到如下效果:

如圖所示,我們可以看到pc指標形成了乙個特殊的指令,此時我們可以控制pc指令了。

那麼,控制pc之後如何進一步利用呢?此時 無法執行使用者態**,只能利用核心態**。我們注意到ioctl中r0, r1, r2暫存器可以控制,於是可以利用以下gadget達到任意位址讀寫:

0x000000000021b598 : str w1, [x2] ; ret

0x00000000001e246c : ldr x0, [x2] ; add w0, w0, #1 ; ret

通過任意位址讀寫,利用init_task可以找到當前程序的task_struct(或者利用洩露sp的gadget,通過thread_info找到task_struct,更穩定)。找到task_struct之後即可修改cred,將uid等改為0即可。同時patch掉selinux_enforcing,關掉selinux、mount -o rw,remount /system即可關掉/system分割槽寫保護。在實際利用中,發現mtk裝置的核心**是可寫的。在關閉selinux之後,某處的assert會失敗,可以利用上面的特性patch掉assert的**。或者通過修改修改當前程序的sid,將其selinux的context修改為u:r:init:0。實際測試中,我們會發現u:r:init:0程序啟動/system/bin/sh後許可權會降為u:r:init_shell:0。

總結

演講最後,於晨公升表示,android 6.0/7.0版本中已經增強了sepolicy,防止未經授權的app訪問白名單以外的裝置,減少了攻擊面,大大增強了安全性。並建議,廠商應該更加重視自家驅動的安全性,防止被黑客濫用,造成惡劣影響。

軟體測試之系統安全測試

一 開場白 我剛開始接觸安全測試的時候,想的最多就說那種在昏暗的燈光下,帶著神秘面具的黑客,對著鍵盤噼里啪啦一頓猛如虎的操作,然後長舒一口氣,最後來了句yes,完美收工!之後,讓我覺得安全測試只不過如此嘛,隨著個人工作經驗的不斷積累,我對於安全測試的理解也越來越深刻,此致,記錄個人對於安全測試的理解...

CentOS 7系統安全之賬號安全

在 linux 系統中,除了超級使用者 root 之外,還有其他大量賬號只是用來維護系統運作 啟動或保持服務程序,一般是不允許登入的,因此也稱為非登入使用者賬號。為了確保系統的安全,這些使用者賬號的登入 shell 通常被設為 sbin nologin,表示禁止終端登入。對於 linux 伺服器中長...

如何提高Linux系統安全性

1 取消不必要的服務 早期的unix版本中,每乙個不同的網路服務都有乙個服務程式在後台執行,後來的版本用統一的 etc inetd伺服器程式擔此重任。inetd是internetdaemon的縮寫,它同時監視多個網路埠,一旦接收到外界傳來的連線資訊,就執行相應的tcp或udp網路服務。由於受inet...