Secureboot概念进阶版
之前寫過一篇Secureboot概念—>【Secureboot概念】
全部的內容比較淺顯,當然內容的也不夠豐富,最近看到了一位前輩的博客,覺得很好,值得學習。
淺析安全啟動(Secure Boot)
前言
安全啟動的根本目的是為了防止消費者從軟硬件層面對產品的部分關鍵系統進行讀寫、調試等高權限的操作。以限制消費者的能力,來達到保護產品的商業機密、知識產權等廠家權益的目的。當然,廠家是不會這樣宣傳 Secure Boot 的。他們的文案通常都是通過這項技術保護用戶的隱私,防止惡意軟件修改系統軟硬件等等。不過不論如何,隨著 ARM 架構的廣泛授權,基于 TrustZone 的 Secure Boot 也越來越普遍了。本文是通過我自己對市面上的一些基于 ARM TrustZone 的 Secure Boot 實現的淺見、零零碎碎讀到的一些安全分析文章、看到的一些講座,總結一些常用的攻擊思路,介紹一些真實的攻擊案例。
一、當消費者成為威脅
可以說,Secure Boot 的安全模型建立在消費者是攻擊者這一假設上。消費者在物理上擁有產品硬件,可以對產品進行物理連接、拆機、改裝等等物理上的操作。可以說跟傳統的安全模型中的攻擊者相比根本不在一個層面上。
消費者作為攻擊者的目的,一般常見的有刷機安裝自定義的操作系統(Mod)、繞過廠家封閉的支付平臺(IAP)和應用商城安裝自定義的應用程序、繞過版權保護系統(DRM)達到復制廠家保護的數字產品內容等等。這些操作往往都會直接影響廠家的利益,因此需要一種能抵抗消費者攻擊的安全機制。
上面提到了,消費者可以直接拆機干涉產品的硬件模塊。比如比較專業的消費者甚至可以使用數字示波器監聽 CPU 和 RAM 、eMMC 之間的數據傳輸來讀取非常底層的數據傳輸。如下圖所示,我拿某廠的電視盒子的 PCB 拍了張照方便大家理解,如圖中圈出來的,CPU 、RAM 、eMMC 都是分開的芯片,中間的連接電路是有可能被監聽的,有些研究人員可以焊接極細的導線到電路上,來監聽、攔截、甚至篡改不同芯片之間數據的傳輸。
而且像 eMMC 這種芯片通常都是業界標準化的,攻擊者甚至可以把芯片拆下來,然后用市面上現成的通用 eMMC 編程工具來讀寫上面的內容。
不過業界還是給攻擊者的能力設置了一個上限。這個上限通常是認為攻擊者不至于能夠剝離芯片的封裝,然后用電子顯微鏡等納米級別精度的顯像設備來逆向芯片的內部結構。或者說能成功攻破芯片安全機制的一次性投資成本至少需要在十萬美元以上才可以認為是安全的。
Secure Boot 安全機制的原理,就是將最為核心的安全機制整合到最關鍵的主 CPU 中。因此就算攻擊者可以監聽電路板上的線路,甚至拆裝個別芯片單獨調試,也無法破壞 Secure Boot 的安全機制。
二、CPU 內部的安全機制
下圖是一個比較粗略的,各個啟動階段,軟硬件組件之間的關系。這只是我接觸比較多的一種架構,當然還有別的不同的架構,因為接觸得不多這里就不列舉了。
1)bootROM
所有支持 Secure Boot 的 CPU 都會有一個寫死在 CPU 中的 bootROM 程序。CPU 在通電之后執行的第一條指令就在 bootROM 的入口。bootROM 擁有最高的執行權限,也就是 EL3。它將初始化 Secure Boot 安全機制,加載 Secure Boot Key 等密鑰、從 eMMC 加載并驗證 First Stage Bootloader(FSBL),最后跳轉進 FSBL 中。
bootROM 是完全只讀的,這個在 CPU 出廠時就被寫死了,連 OEM 都無法更改。bootROM 通常會被映射到它專屬的一塊內存地址中,但是如果你嘗試向這塊地址寫入內容,一般都會出錯或者沒有任何效果。
有些芯片還會有一個專門的寄存器控制 bootROM 的可見性,bootROM 可以通過這個寄存器禁止別的程序讀取它的代碼,以阻止攻擊者通過逆向 bootROM 尋找漏洞。
2)iRAM
為了避免使用外部 RAM 芯片,支持 Secure Boot 的 CPU 上都會內置一塊很小的 RAM,通常只有 16KB 到 64KB ,我們稱之為 iRAM。這塊 iRAM 上的空間非常寶貴,bootROM 一般會用 4KB 的 iRAM 作為它的堆棧。FSBL 也會被直接加載到 iRAM 上執行。
3)eFUSE
所有支持 Secure Boot 的 CPU 都會有一塊很小的一次性編程儲存模塊,我們稱之為 FUSE 或者 eFUSE,因為它的工作原理跟現實中的保險絲類似:CPU 在出廠后,這塊 eFUSE 空間內所有的比特都是 1,如果向一個比特燒寫 0,就會徹底燒死這個比特,再也無法改變它的值,也就是再也回不去 1 了。
一般 eFUSE 的大小在 1KB 左右,OEM 從 CPU 廠家購買了芯片,組裝了產品后,一般都要焼寫 eFUSE 的內容,包括產品的運行模式:測試、開發、生產等。面向終端消費者的產品都會被焼寫為生產模式。這個模式下 bootROM 會禁用很多權限,更大面積地限制用戶的能力。
另外一個很重要的焼寫內容就是根密鑰了,一般有兩種根密鑰:一個是加密解密用的對稱密鑰 Secure Boot Key,一般是 AES 128 的,每臺設備都是隨機生成不一樣的;另一個是一個 Secure Boot Signing Key 公鑰,一般用的 RSA 或 ECC,這個是每個 OEM 自己生成的,每臺設備用的都一樣,有些芯片會存公鑰的 Hash 來減少 eFUSE 的空間使用。
只有 Secure World(后面會介紹)才能訪問 eFUSE 的寄存器。除了讀寫 eFUSE 的基礎寄存器之外,還有一些控制寄存器可以禁止別的程序訪問 eFUSE,來保護其中的密鑰。因此 eFUSE 中的根密鑰以及 bootROM 將作為 Secure Boot 的根信任。
4)Security Engine
有些 CPU 中還會有一個專門負責加密解密的模塊,我們稱為 Security Engine。這個模塊也是只有在 Secure World 中才能訪問。這個模塊通常會有若干個密鑰槽(Keyslots),可以通過寄存器將密鑰加載到任意一個 Keyslot 當中,Keyslot 的加載操作將復蓋之前加載過的密鑰。通過寄存器操作 DMA 讀寫,可以使用 Keyslot 中的密鑰對數據進行加密、解密、簽名、HMAC、隨機數生成等操作,但是沒有辦法從一個 Keyslot 中讀取已經加載的密鑰值。
5)First Stage Bootloader(FSBL)
FSBL 的作用是初始化 PCB 板上的其他硬件設備,給外部 RAM 映射內存空間,從 eMMC 的 GPT 分區上加載驗證并執行接下來的啟動程序。
6)根信任的建立
CPU 通電后執行的第一行指令就是 bootROM 的入口,bootROM 將初始化各種 CPU 內部的模塊,但最主要的是,它會讀取 eFUSE 上的內容,首先它會判斷當前的運行模式是不是生產模式,是的話會開啟 Secure Boot 功能,然后把 Secure Boot Key 加載到一個 Security Engine 的 Keyslot 當中,有時候它還會通過 Key Derivation 從 Secure Boot Key 或別的 eFUSE 內容生成多幾個不同用途的密鑰,分別加載到不同的 Keyslots 中。然后它會從 eMMC 上加載 FSBL,FSBL 里面會有一個數字簽名和公鑰證書,bootROM 會驗證這個簽名的合法性,以及根證書的 Hash 是否和 eFUSE 中的 Signing Key 的 Hash 相同。如果驗證通過,說明 FSBL 的的確確是 OEM 正式發布的,沒有受到過篡改。于是 bootROM 就會跳轉到 FSBL 執行接下來的啟動程序。有些 CPU 在跳轉之前會把 bootROM 的內存區間設為不可見,防止 FSBL 去讀取 bootROM。有些 CPU 還會禁止 eFUSE 的讀寫,或者至少 Secure Boot Key 區域的讀取權限,來防止 FSBL 泄漏根信任的解密密鑰。還有要注意的是,FSBL 是被加載到了 iRAM 上執行的,而且 FSBL 仍然擁有 EL3 級別的權限。
 FSBL 會進一步初始化 PCB 板上的別的硬件,比如外部的 RAM 芯片等等,使其不再受限于 iRAM 的內存空間。然后它會進一步加載 eMMC 上的內容到 RAM。我們接下來會著重講講跟 Secure Boot 密切相關的啟動內容。
三、信任鏈的延伸
一般 FSBL 都非常靠近 eMMC 的第一個扇區,bootROM 一般不會管 eMMC 有沒有用 GPT 分區,而是簡單的從第一個扇區讀取一些頭信息然后直接找到 FSBL 的扇區進行加載的。所以一般我們要做 GPT 分區的話都會放在 FSBL 后面。FSBL 加載一個 GPT 分區也是要跳過 eMMC 前面的非 GPT 扇區再進行加載。
1)TrustZone
從 FSBL 開始我們就要引入 TrustZone 的技術概念了。TrustZone 是 ARM 家的 Trusted Execution Environment(TEE)實現。相對應的,Intel 家的叫做 Software Guard Extensions(SGX),AMD 家的叫做 Platform Security Processor(PSP)。雖然本文只關注 TrustZone,但其實原理上都大同小異。
TrustZone 將 CPU 的執行環境劃分為了 Secure World 和 Normal World,Secure World 擁有更高的權限,可以訪問 Normal World 的內存、eFUSE 寄存器、Security Engine 寄存器等等。但是 Normal World 中的最高權限卻無法訪問 Secure World 的內存。
但是 Normal World 可以通過 SMC 指令調用 Secure World EL3 中注冊的命令,然后 EL3 程序再將 Normal World 的請求轉發給 Secure World,從而達到兩個世界之間的通訊。
2)Secure Monitor
這是一個運行在 Secure World EL3 權限中的程序,Secure Monitor 的主要作用就是注冊 SMC 指令的回調,轉發兩個世界之間的消息。
3)Trusted OS
這是一個通常運行在 Secure World EL1 權限中的內核程序,比較常見的是基于開源的 ARM Trusted Firmware 進行擴展修改的,別的實現還有基于 Little Kernel 的,以及一些芯片廠家自己的實現。它的主要作用是給 Secure World 中運行的程序提供一個基本的系統內核,實現多任務調度、虛擬內存管理、System Call 回調、硬件驅動、IPC 通訊等等。
3)Trusted Application(TA) / Trustlet / Secure Service
這些是在 Secure World EL0 中運行的程序、Daemon。根據不同的 Trusted OS 的實現,TA 的格式、運行模式也會有所不同,比如 ARM Trusted Firmware 的 TA 使用的是 ELF 格式,而高通的 TA 用的是自家的格式。
4)Keybox
因為 eFUSE 的大小有限,而且不可更改,有些體積比較大的,或者有可能更新的密鑰數據,包括像各種 DRM 系統、HDCP、Attestation 等等的密鑰,都會用 Secure Boot Key 或者一個 Derived Key 進行加密后儲存在 eMMC 的一個 GPT 分區上,因此基本上沒什么大小限制。FSBL 一般會將這個分區加載到 RAM 中,然后 TA 再通過 Security Engine 中已經載入的 Keyslot 對其進行解密獲得相應的密鑰。
5)Second Stage Bootloader(SSBL)
SSBL 的作用是給 Normal World 做初始化,加載驗證并執行 Linux/Android 內核。常見的 SSBL 是基于 U-Boot 項目改的,通常這里已經支持像 Fastboot、Recovery boot 等等的常見啟動對象了。
6)搭建信任鏈
FSBL 的下一階段一般包含三個程序:Secure Monitor、Trusted OS、Second Stage Bootloader。FSBL 會分別從 eMMC 加載驗證這些程序,最后跳轉到 Secure Monitor 執行。
Secure Monitor 會初始化 TrustZone 環境,設置 SMC 回調,然后開始執行 FSBL 已經加載好的 Normal World 中的 Second Stage Bootloader,和 Secure World 中的 Trusted OS。
Trusted OS 會初始化 Secure World 中的系統內核環境,然后從 eMMC 加載各種 Trusted Applications(TA),認證它們的數字簽名,然后執行它們。每個 TA 都會有自己獨立的虛擬內存空間。TA 如果要訪問特定的硬件,比如 Security Engine,會在一個描述 TA 的頭信息中申請,TA 的簽名也會涵蓋這部分頭信息。Trusted OS 如果同意 TA 訪問這些硬件,會把對應的寄存器地址 mmap 映射到 TA 的虛擬內存空間中。
Second Stage Bootloader 也就是我們一般說的 Android Bootloader,它會加載驗證然后執行 Android Kernel。
可以看出來,從 bootROM 到 Normal World 的 Kernel,到 Secure World 的 TA,每一步的加載都是要經過數字簽名認證的,而所有這些簽名認證的根證書,是要跟 eFUSE 中的 Signing Key 匹配的。這就形成了一個信任鏈。
四、信任鏈攻擊思路
回顧我們前面定義的威脅模型,如果攻擊者的目的是刷自定義 ROM,那至少要同時拿到 Normal World 和 Secure World 的 EL1 權限才能勉強讓一個自定義 ROM 正常運作。如果攻擊者的目的是破壞由 TrustZone 保護的 IAP 支付機制,或者 DRM 保護機制,則至少要拿到實現這些保護機制的 TA 的權限才行,也就是至少要拿到 Secure World EL0 的權限。
目前我接觸到的攻擊思路,我基本上分為兩類:Top Down 和 Bottom Up。
1)Top Down 攻擊思路
所謂 Top Down,就是從最上層的程序,也就是最低級的權限一步步提權,每一次提權就獲得更底層一點的權限,慢慢滲透到目標權限層。
一個特別適合了解 Top Down 的案例來自 Quarkslab 的 Breaking Samsung’s ARM TrustZone (PDF & GitHub)
這個案例他們假設一開始只有 Normal World 中 EL0 的權限,但是可以自己寫程序調用 TrustZone 的 Driver,通過 Driver → Android Kernel → SMC → Secure Monitor → Trusted OS Kernel → Trusted Application 這條線路調用 TA 的相關功能。他們逆向了 TA 的代碼,找到了一處 memcpy 越界漏洞,從而拿到了該 TA 的 Secure World EL0 權限。
但是這個 TA 的權限有限,他們又通過 Trusted Application → System Call → Trusted OS → Secure Service 的線路調用同是 Secure World EL0,但是有更多 System Call 權限的一個 Secure Service。他們同樣在這個 Secure Service 中找到了一處 memcpy 越界漏洞,從而拿到了更高權限的 Secure World EL0 執行權限。
然后他們發現這個 Secure Service 的其中一個 System Call 是一個任意地址 mmap,而且沒有任何限制。于是他們可以直接把 Secure Monitor 的物理地址直接 mmap 到 Secure Service 的虛擬地址空間,然后直接改寫 Secure Monitor 的代碼,直接拿到 Secure Monitor 所在的 Secure World EL3 權限。基本上來說,拿到 EL3 權限,就已經可以做到任何想做的事情了。
Top Down 的思路需要在各個權限層都能找到漏洞進行利用,可以說難度非常大,而且所有這些都是基于軟件上的漏洞,OEM 可以通過系統更新來進行修復。不過大部分廠家沒有防回滾機制,所以攻擊者可以通過降級刷機刷回一個有漏洞的版本,再進行提權。
一種防回滾的操作是每次重大安全更新都燒掉一個 eFUSE 比特,然后每個版本的固件都會檢查當前燒掉的 eFUSE 比特數是否等于當前的版本號,如果大于的話會拒絕執行,如果小于的話會燒掉相應的比特。如果設備有防回滾機制,攻擊者會盡量保持使用舊版固件,然后盡力阻止固件更新。
Top Down 的一種捷徑是通過 Diff 分析對比更新前后固件的變化,找到安全更新修復的漏洞,然后進行利用。
2)Bottom Up 攻擊思路
對應的,Bottom Up 就是直接找 bootROM 的漏洞。因為 bootROM 是整個信任鏈的根基,擁有最高的執行權限,如果可以做到 Code Execution,那所有的 Secure Boot 保護措施都將形同虛設。而且因為 bootROM 是寫死在 CPU 中的,連 OEM 都無法更改,所以一旦可以被利用,廠家將永遠無法修復它,只能通過發售新的修復過的硬件來避免它。
一個最適合了解 Bottom Up 的案例是 Glitching the Switch,這個漏洞幾乎同時被好幾個研究團隊發現,稱為 Fusée Gelée。
Nintendo Switch 使用的是 NVIDIA 的 Tegra X1 芯片,這款芯片的 bootROM 是不可讀的,原理是在 bootROM 即將跳轉到 FSBL 的時候,會通過一個專門的寄存器,改變 bootROM 的可讀區間,使得大部分的 bootROM 代碼變得不可讀。這個不論是開發設備還是消費產品都是如此。
所以他們攻擊 bootROM 的第一步就是要 dump 出來 bootROM 的代碼。他們用了一種 Glitching 的手段來做到這一步。Glitching 的硬件原理在視頻中有詳細介紹,簡單來說就是通過在非常精確的時間點,執行微秒級的電壓驟變使得 bootROM 在寫那個可視性寄存器的時候出現錯誤,導致 bootROM 沒有被不可視化,進而他們可以在一塊開發板上用自己寫的 FSBL 讀取 bootROM 代碼。
拿到 bootROM 之后他們根據芯片的數據手冊和自己的實驗,分析出各種寄存器的用途,然后對 bootROM 的 USB 層進行逆向分析。最后他們發現了在一個叫做 RCM 的 USB 模式下,可以通過棧溢出拿到 bootROM 的執行權限。
拿到 bootROM 權限之后,他們就可以禁用掉 FSBL 的簽名驗證,相似的,Secure Boot 接下來的所有環節的簽名驗證都可以被禁用掉,那基本上就是想干什么都可以了。
五、總結
可以說,現在 Secure Boot 攻擊的 Holy Grail 就是 bootROM 級別的漏洞,因為它最為強大,而且無法被廠家修復。但是 Top Down 的思路在沒有 bootROM 級別漏洞的情況下也是一種考慮方式,而且 Top Down 的話對每一個 Secure Boot 的組成部件能有更深的了解,作為學習 Secure Boot 來說也是一個不錯的選擇。
總結
以上是生活随笔為你收集整理的Secureboot概念进阶版的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 直连路由、静态路由、动态路由
- 下一篇: 安装和使用 ubuntu 服务器
