Thunderstrike: EFI bootkits for Apple MacBooks 重點筆記

吃飽飯閒閒沒事就看了鼎鼎大名 Thunderstrike 漏洞的演講錄影:https://www.youtube.com/watch?v=5BrdX7VdOr0

有2個方法可以讓目標執行任意代碼:ROM “in-system programming" 和透過 Thunderbolt Option ROM

ROM “in-system programming"

就是直接拆開機殼,用針腳去改 ROM 裡面的資料,這是可行的,因為這幾年的 Apple 電腦並沒有 TPM 晶片的保護,檢查 ROM 是否被篡改的程序本身也是存在 ROM 裡面,而且只有檢查 CRC32,沒有使用數位簽章,所以改了 ROM 之後只要重新計算 CRC 然後寫回去就可以了,也可以直接改寫 CRC 函式讓它直接 return true 。反正重點是沒有硬體保護,完全使用軟體檢查,所以只要打開機殼改 ROM 就可以為所欲為。

上面 CRC32 的檢查是針對 ROM 的資料。

雖然硬碟上的 EFI firmware volume (EFI 開機韌體磁區)有數位簽章保護,不過因為 EFI firmware volume 的檢查程式也存在 ROM 裡面,所以依舊很容易 bypass 。

Thunderbolt Option ROM

那有沒有方法不拆開機殼就改寫 ROM 呢?有的,透過 Thunderbolt 的向下相容 (legacy) 功能 Option ROM。在一般的開機流程中,執行 option ROM 的時候(DXE 階段) flash (ROM) 已經被鎖定了(早在 PEI 階段),因此就算執行了 option ROM 也沒辦法寫入系統 ROM 。

Thunderstrike presentation at 31C3

但有一個弱點,在韌體更新模式開機的時候,flash (ROM) 不會被鎖定,而 option ROM 也一樣會被執行,但又遇到一個障礙,recovery mode 開機的時候,在執行 option ROM 之前的 PEI 階段,會對 firmware volume (SCAP 檔案)進行 RSA 數位簽章檢查。

解法是,在驗證 SCAP 數位簽章,實際「掛載」firmware volume 之前(應該是指 ProcessFirmwareVolume 這個函式),option ROM 會被執行,而 ProcessFirmwareVolume 函式是透過 function pointer 呼叫,也就是在 RAM 裡面,而不是在 ROM 裡面,因此可以修改 function pointer 到我們想要的位置 (hooking) 。

Thunderstrike presentation at 31C3

在我們自定的 our_ProcessFirmwareVolume 函式當中,把 SCAP 中 Apple 的 public key 換成我們的,重新計算簽章和 CRC 校驗值,再呼叫原本的 ProcessFirmwareVolume 把修改過的 SCAP 寫入。

接下來,雖然 firmware volume 裡面的韌體還是原廠的,但是 public key 已經改成我們的了,接下來再刷我們改過的 SCAP 檔案(使用我們的 RSA 簽章)就會成功了。(但是後面的提問有提到,改掉 public key 之後,若再刷原廠的 SCAP ,就會變磚,因為 public key 已經是我們的了嘛,不過我們可以把判斷函式再寫複雜一些讓它會接受原廠的 SCAP)

所以這就是 Thunderstrike 漏洞,藉由 option ROM 觸發 recovery mode 開機,然後覆蓋 boot ROM ,就可以只認特定 firmware volume 的簽章,避免未來任何其他軟體手段覆蓋 firmware volume 。另外,作者的 proof of concept 也會停用 option ROM ,因此未來就無法再用同樣的方法觸發 Thunderstrike 了。

修補

在新的 Apple 修補韌體當中,recovery mode 將不會執行 option ROM 。但是這個修補並沒有辦法防止 Snare 的攻擊方法,把韌體降版至有漏洞的版本再進行攻擊。

Thunderstrike v2

另有 Thunderstrike 升級版,在作者演講的前一天,Rafal and Corey 發表了 Dark Jedi coma attack,從休眠 (ACPI state S3) 開機時,boot ROM 的鎖定會被清除,直接允許 option ROM 程式覆寫 boot ROM ,輕鬆達成攻擊,不需要前面提到的繞過數位簽章等麻煩事。

Q&A

在後面的提問當中,有人問到,在開機之後才插入 thunderbolt 裝置是否也會有風險?答案是不一定,若 thunderbolt 裝置是主動式,那隨時插入都會執行 option ROM ,但若是被動式,則只有在開機的時候才有風險。(不過照這樣看起來在休眠喚醒的時候 thunderbolt 若是插入的狀態也一樣有風險)

不過我沒有找到什麼叫被動式和主動式 thunderbolt 裝置的資訊。

所以若是電腦不在身邊回來發現被重開那就要小心了。

感想

整場演講我聽得懂九成感覺還蠻開心的(聽不懂的部分是技術真的聽不懂不是英文聽不懂),不過不要問我什麼是 PEI, DXE 哈哈。

另外,Club-Mate!

螢幕快照 2015-01-01 下午10.09.07

那瓶就是 Club-Mate 啊,果然是傳奇的駭客飲料,我去柏林黑客松的時候大家都在喝這個XDD

最後面的提問我覺得各個都很厲害,都提出非常簡短、明確,一針見血的問題,沒有人在嘴砲,不像在臺灣的研討會有些人問問題之前要把所有聽眾講師貴賓都問候一次然後提出落落長講完之後不知所云的模糊問題;這講者也超級厲害每個都清楚明確的詳加回答。

有一個提問者大概是 Coreboot 社群的人,問完之後直接說 We should talk ,真是太帥了。

演講的文字轉錄:https://trmm.net/Thunderstrike_31c3

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s