雷鋒網註:該報告轉載自360信息安全部涅槃團隊博文,原文標題為《iPhone BootROM 漏洞說明及威脅評估》。
0x00 相關詞彙
AP:應用處理器。
SEP:安全協處理器。
SecureROM:又稱 BootROM 是固化在 iPhone 只讀區域中的一段代碼,該區域中的代碼是啟動鏈及啟動信任鏈的起點,主要負責加載後續的啟動鏈,該區域中的代碼無法通過系統更新來更新,所以該區域中的代碼一旦出現安全問題,影響是非常大,並且這種影響是持久的,只能通過召回設備修復問題。關於 SecureROM 的具體功能,可以參考筆者之前寫的一篇文章 《SecureROM 分析筆記》。
GID:GID 是固化在 iPhone 加密引擎中的 AES 密鑰,所有相同型號的設備具有相同的密鑰,比如:所有 iPhone X 都具有相同的密鑰。該密鑰主要用來解密系統更新固件。SEP 有獨立的 GID,與 AP 的不同。
UID:UID 也是固化在 iPhone 加密引擎中的 AES 密鑰,但每臺手機都有不同的 UID,UID 主要用來加解密用戶相關的數據。SEP 有獨立的 UID,與 AP 的不同。
0x01 事件起因
北京時間9月 28 日凌晨,國外安全人員 @axi0mX 通過 Twitter 公開了一個 iPhone BootROM 的漏洞[1],同時公開了相關的利用代碼[2]。
就像 @axi0mX 在推文中所說[3],這是從 2010 開始,9 年間,第一個公開的針對 64 位蘋果設備的可以利用的 BootROM 的漏洞。我們知道越獄社區一直在跟蘋果設備的安全性做著「鬥爭」,隨著蘋果不斷地提高 iPhone 的安全性,越獄變得越來越難,而 BootROM 漏洞不僅可以用來越獄當前最新的 iOS 版本,還可以用來越獄將來的 iOS 版本(因為硬體漏洞無法通過系統更新進行修補),所以該漏洞在越獄社區中引起了巨大的轟動。
0x02 受影響的設備
影響從 iPhone 4s 到 iPhone X 的所有設備,同時影響這段時間內生產的 iPad 設備。
0x03 漏洞成因說明
@axi0mX 是通過二進位對比發現的這個漏洞[4],同時 @littlelailo 獨立的通過代碼審計的方式也發現了這個漏洞[5]。@littlelailo 對這個漏洞的成因及利用思路做了說明[6][7]。
由於 @littlelailo 對漏洞的成因已經說得非常清楚了,這裡就不再畫蛇添足,下面是@littlelailo 說明的直接機器翻譯結果。下文中的圖像並不是指圖片,而是指 img4 固件文件。
這個錯誤一開始也被稱為Moonshine基本上,我查看過的所有bootrom中都存在以下錯誤:1.當usb開始通過dfu獲取圖像時,dfu註冊一個接口來處理所有命令,並為輸入和輸出分配一個緩衝區2.如果您將數據發送到dfu,則設置包由主代碼處理,然後調出接口代碼3.接口代碼驗證wLength短於輸入輸出緩衝區的長度,如果是這種情況,它將使用指向輸入輸出緩衝區的指針更新作為參數傳遞的指針4.然後返回wLength,這是它要接收到緩衝區的長度5. USB主代碼然後使用長度更新全局變量,並準備接收數據包6.如果接收到數據包,則通過作為參數傳遞的指針將其寫入輸入輸出緩衝區,並使用另一個全局變量來跟蹤已經接收了多少字節7.如果接收到所有數據,則再次調用dfu特定代碼,然後繼續將輸入輸出緩衝區的內容複製到以後從中引導映像的存儲位置8.之後,usb代碼將重置所有變量並繼續處理新軟體包9.如果dfu退出,則釋放輸入輸出緩衝區,並且如果映像解析失敗,則bootrom重新輸入dfu
退出dfu可以通過發送dfu中止包或通過觸發USB重置觸發解析來完成
問題:在第5步,將更新全局變量,並且Bootrom準備接收數據,但是使用便宜的控制器,您可以違反USB規範並且不發送任何信息(arduino主機控制器或類似的東西)。然後,您可以觸發USB重置以觸發圖像解析。如果解析失敗,bootrom將再次輸入dfu,但未執行步驟8,因此全局變量仍包含所有值。但是,執行了步驟9,因此釋放了輸入輸出緩衝區,而在步驟3中作為參數傳遞的指針仍然指向它。因此,您可以通過將數據發送到設備來輕鬆觸發對已釋放緩衝區的寫入。
對A8的利用:1.將0x40的隨機數據發送到dfu,必須發送此數據,否則您將無法使用USB重置ctrlReq(bmRequestType = 0x21,bRequest = 1,wLength = 0x40)退出dfu2.通過發送ctrlReq(0x21,1,0)ctrlReq(0xa1,3,1)ctrlReq(0xa1,3,1)ctrlReq(0xa1,3,1)ctrlReq(0xa1,3,1)使dfu處於等待USB重置的狀態ipwndfu dfu.py)3.僅發送了帶有bmRequestType 0x21和bRequest 1以及有效載荷大小的wLength的設置數據包(此數據包將更新全局變量)4.發送一個狀態包以標記控制傳輸的結束(即使將wLength設置為一個值,我們也會跳過數據階段)5.觸發總線復位6.等待設備重新輸入dfu(現在將釋放輸入輸出緩衝區,並且將在釋放的緩衝區下分配usb任務)7.發送設置的配置請求ctrlReq(bmREQ_SET,USB_REQUEST_SET_CONFIGURATION,wLength = Payloadsize),但將有效載荷與數據階段一起發送(bootrom中的設置配置處理程序忽略wLength)
有效負載將覆蓋usb任務結構,並且將成為usb堆棧之後的下一個分配。通過定位USB任務結構中的連結列表,您可以插入偽造的任務。而且您可以將usb任務堆棧用作暫存空間,因為看起來它永遠都不會寫到那麼高。當dfu退出並且usb任務停止時,將生成該代碼。因此,您可以在第7步之後發送dfu中止數據包,並在該代碼執行exec的情況下控制所有較高的寄存器,因為您的虛假任務將添加到列表中並在以後的某個時刻運行。
0x04 能力及威脅評估
限制條件
漏洞利用的限制條件:需要將設備置入 DFU (Device Firmware Upgrade)模式。
漏洞及利用目前所具有的能力
1、BootROM 中的任意代碼執行能力。
2、開啟 CPU 的硬體調試能力(JTag)。
3、使用 AP 的 GID 進行加解密。
4、使用 AP 的 UID 進行加解密。
任意代碼執行能力及 CPU 級調試能力
BootROM 是 iPhone 啟動信任鏈的基礎,在 BootROM 中具有了任意代碼執行能力,意味著 iPhone 的整個啟動信任鏈被打破了,最終可以用來加載修改過的 iOS 內核,從而破壞 iOS 的基礎安全特性。這部分能力主要會被用來做越獄(這裡的越獄是指越獄所帶來的能力,而不僅僅指越獄行為)。
CPU 級調試能力,這個能力主要會被用來分析 iPhone 的安全啟動鏈及調試相關的漏洞及利用。
使用AP 的 GID 進行加解密的能力
使用 AP 的 GID 進行加解密的能力主要會被用來解密 iPhone 的固件,破壞了蘋果對相關組件的封閉性保護,進而可以用來評估相關模塊的安全性,下面是利用該能力解密出來的固件密碼:
; iOS-v13.1.1-17A854, iPhone X; iBoot.d22.RELEASE.im4pIV: 1ef67798a0c53116a47145dfff0aac60KEY: 9a6ddfb9f432a971be8ae360c6ce0a8e3170f372d4e3158bb04e61d81798929f
使用 AP 的 UID 進行加解密的能力
根據筆者目前所掌握的知識,用戶相關數據的密鑰主要是使用 SEP 的 UID 進行的加解密,因此尚不清楚使用 AP 的 UID 進行加解密的能力是否會對用戶數據造成直接的威脅。
對用戶數據的威脅評估
對用戶數據威脅的評估結論:筆者認為這個漏洞對用戶數據僅構成間接威脅,沒有構成直接威脅。
對用戶數據威脅評估基於的前提:用戶設置了鎖屏密碼。
一些離散的、iPhone 數據安全相關的知識:
1、 iPhone 的磁碟是加密的(SEP UID 相關)。
2、 設備中保存密碼是加密的(SEP UID 相關,且與鎖屏密碼相關)。
3、 iPhone 中的用戶文件是加密的(SEP UID 相關,且間接地與鎖屏密碼相關)。
4、 用戶相關的數據,只有在設備重啟後,第一次解鎖屏幕後,才有可能被解密,即:繞過鎖屏不會造成用戶數據解密。
5、 破解鎖屏密碼主要在 SEP 上進行,根據蘋果的文檔[8],蘋果做了相關的防暴力破解的防護。
通過上面的一些知識點,以及我們前面提到的漏洞限制條件:需要將設備置入 DFU 模式(DFU 模式意味著需要將設備重啟)筆者可以得到如下 2 個結論:
1、 利用該漏洞,攻擊者雖然無法直接解密用戶數據,但是可以解密 iPhone 磁碟的數據分區,該分區中包含一些系統日誌及程序行為的日誌。
2、 利用該漏洞,從取證的角度,攻擊者可以暴力破解鎖屏密碼,但仍會面臨一些限制。
但事情沒有絕對的,做過應用防護的應該清楚:如果端被攻破,那麼端上產生的數據會變得不安全;端上使用的數據也會變得不安全。前面我們說過,利用這個漏洞攻擊者可以破壞內核完整性,進而破壞內核的安全特性,獲得內核空間的任意代碼執行能力,獲得用戶空間的任意代碼執行能力,因此:雖然攻擊者無法利用該漏洞直接獲取用戶數據,但是配合一些其它的攻擊手段,攻擊者還是可以獲取用戶數據。
0x05 安全建議
1、不要將自己的受此漏洞影響的蘋果設備交給他人。
2、將鎖屏密碼設置為 6 位數字,或者設置為更複雜的由字母+數字構成的密碼。
3、定期重啟設備。
0x06 參考資料
1、https://twitter.com/axi0mX/status/1177542201670168576
2、https://github.com/axi0mX/ipwndfu
3、https://twitter.com/axi0mX/status/1177542362853040129
4、https://twitter.com/axi0mX/status/1177544539046703104
5、https://twitter.com/littlelailo/status/1177554568626024448
6、https://twitter.com/littlelailo/status/1177555154549313537
7、https://gist.github.com/littlelailo/42c6a11d31877f98531f6d30444f59c4
8、《iOS Security Guide》,iOS 12.3
0x07 時間線
2019-09-28 安全人員 @axi0mX 通過 Twitter 公開漏洞
2019-09-30 360信息安全部 涅槃團隊 完成本次報告
2019-09-30 360CERT發布本次報告