
駭客接管 CPU 的夢想?AMD CPU 安全漏洞暴露 Microcode 的脆弱性
研究人員發現了 AMD Zen CPU 中一個名為 EntrySign的漏洞,該漏洞允許執行任意 Microcode 更新程式。此缺陷源自於 AMD 在Microcode簽章驗證期間使用 CMAC 函數作為Hash,而該函數容易發生衝突。透過利用此弱點,攻擊者可以偽造 RSA 公鑰和簽章,從而繞過安全措施。研究人員開發了一套工具“zentool”,用於分析、創建、簽署和載入客制化Microcode更新。這允許修改 CPU 行為,例如改變 RDRAND 指令的輸出。此後,AMD 發布了使用安全雜湊函數的更新程式來緩解 EntrySign漏洞。儘管存在局限性和潛在的安全風險,但該研究提供了對 AMD Microcode架構的深入了解,並為進一步探索 CPU 定制和安全增強提供了可能性。

Microcode背景
現代 x86 CPU 使用複雜指令集計算機 (CISC) Kernel,每個Kernel使用精簡指令集計算機 (RISC)(稱為 Microcode 引擎)來執行複雜指令。英特爾和 AMD 都設計了獨特的RISC-based 的Microcode指令集,其概念上與 ARM 或 RISC-V 類似。 Microcode 更新用於更新硬體中發現的錯誤。 CPU 製造商無需製造新硬件,而是可以在運行時更新 CPU 的 Microcode 來修復已知的錯誤。 AMD 自 2003 年的 K8 開始提供 Microcode 更新,而 Intel 自 1995 年的 P6 開始提供 Microcode 更新。此更新 RAM 可以在 Microcode 更新期間(通常是在 BIOS 和 OS 啟動期間)載入新指令。更改Microcode更新 RAM 的唯一有記錄的方法是加載來自 AMD 的真實 Microcode 更新,並透過加密簽章進行驗證。
AMD Microcode更新的驗證和載入
CPU Microcode 指令和資料被儲存在ROM與Patch SRAM粿晶(on-die)裡。此Patch RAM 可以在 Microcode 更新期間(通常是在 BIOS 和 OS 啟動期間)載入新指令。更改 Microcode Patch RAM 的唯一有文件記錄的方式是載入來自 AMD 透過加密簽章進行驗證的 Microcode 認證更新(authentic microcode update)。 AMD Microcode更新的驗證和載入過程包括四個步驟:
- 1. 源頭:AMD 產生一個新的 Microcode 更新,以二進位 blob 的形式提供,其中包含標頭、RSA 簽章和公鑰、蒙哥馬利反元素公鑰(Montgomery inverse of the public key)、加密指示符、暫存器和遮罩值配對(Match)以及 Micro-ops 陣列。
- 2. 驗證:AMD 使用其 RSA 私鑰對新的Microcode更新進行簽章,該私鑰與更新中嵌入的公鑰相對應。 CPU 將對 RSA 公鑰進行Hash處理,並驗證它與 AMD 公鑰的雜湊值是否匹配,該雜湊值在製造過程中被Hardcode在 CPU 中。
- 3. 交付:AMD 將Microcode更新程式交付給 OEM、作業系統平台和其他合作夥伴進行驗證和分發。
- 4. 驗證與安裝:Microcode在運行時或下次重啟時載入。 BIOS 或 OS 識別正確的Microcode更新檔案並開始更新程式。軟體將Microcode更新區塊的虛擬位址寫入 MSR 0xc0010020,指示 CPU Microcode開始執行Microcode更新程式。Microcode將更新複製到內部記憶體,並驗證更新的 CPU 識別碼是否與實際硬體的識別碼相符。它會檢查更新程式的版本是否比目前安裝的更新程式版本舊,如果是則拒絕,以防止Rollback攻擊。此更新使用AES-CMAC 對 RSA 公鑰進行雜湊處理,並確認雜湊值與 AMD 在製造過程中融合(fused)的值相符。對更新內容進行雜湊處理,並對 RSA 簽章進行解密,如果簽署的雜湊與計算的雜湊匹配,則將更新內容複製到內部 CPU 更新 RAM 中。最後更新CPU Microcode 版本。
AMD Microcode更新簽章驗證演算法
AMD Zen CPU 使用幾乎標準的 RSASSA-PKCS1-v1_5 演算法,但使用 CMAC 函數作為雜湊函數。
金鑰衝突
EntrySign漏洞的存在是因為 AMD Zen Microcode 簽章驗證演算法使用 CMAC 函數作為雜湊函數;然而,CMAC 是一種訊息認證碼,不一定提供與加密雜湊函數相同的安全保證。使用 CMAC 作為雜湊函數的弱點在於,任何擁有加密金鑰的人都可以觀察加密的中間值併計算出一種「修正」差異的方法,以便即使輸入完全不同,最終的輸出也保持不變。每個 AMD Zen CPU 都有相同的 AES-CMAC 金鑰來計算 AMD 公鑰和 Microcode 更新內容的雜湊值。如果金鑰從一個 CPU 洩露,則所有使用相同金鑰的其他 CPU 都會受到威脅。
持續鍛造
來自舊 Zen 1 CPU 的金鑰是 NIST SP 800-38B 出版物的範例金鑰,並且至少在 Zen 4 CPU 之前重複使用。使用此金鑰,可以偽造產生與真實 AMD 金鑰相同雜湊值的新公鑰,並計算簽署的衝突以產生與另一個合法簽署的訊息共享相同簽章的 Microcode 更新。
漏洞緩解
AMD 發布了一個修復程序,該修復程序修改了Microcode驗證例程以使用客制化安全雜湊函數。這與 AMD 安全處理器更新相結合,確保在 x86 核心嘗試安裝被篡改的 Microcode 更新程式之前更新程式驗證例程。
Zentool:將所有部分整合在一起
Zentool 是用於 Microcode 更新檢查、編寫、簽署和載入的工具集合。 zentool 套件由用於 Microcode 更新檢查的工具組合,包括有限的反組譯(Disassembly)、使用有限數量的逆向工程反組譯的 Microcode 更新創作、 Microcode 更新簽章和 Microcode 更新加載。
未來運作
EntrySign漏洞的安全性影響有限,因為攻擊者必須先獲得主機 Ring 0 存取權才能安裝 Microcode 更新,並且這些更新不會在電源循環後持續存在。 AMD 的更新修復了簽章驗證漏洞。研究界可以利用這項新功能來編寫新指令來實現安全功能、存取內部 CPU 緩衝區和追蹤 Microcode 。
結論
總而言之,該研究詳細介紹了 AMD Zen CPU 中的 EntrySign漏洞,該漏洞源於使用 CMAC 函數(訊息認證碼)而不是安全的加密雜湊函數進行 Microcode 簽章驗證。此弱點使得擁有加密金鑰的攻擊者可以偽造 Microcode 更新。 AMD 透過採用客制化安全雜湊函數的 Microcode 更新來緩解該漏洞。 zentool 套件用於檢查、編寫、簽署和加載 Microcode 更新,為進一步研究和探索 AMD Microcode 提供一種手段。雖然 EntrySign對安全的影響有限,但該研究為安全社群開發新的安全功能和探索 CPU 內部結構打開了大門。此漏洞的發現和利用凸顯了硬體安全中加密嚴謹性的重要性以及 CPU Microcode 創新研究的潛力。