歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

Lenovo ThinkPad P51s固件SMM驅動逆向及漏洞分析

來源:本站整理 作者:佚名 時間:2020-01-31 TAG: 我要投稿

一、前言
從去年夏天開始,我嘗試對自己的Lenove ThinkPad P51s計算機固件進行逆向分析。之所以對這個型號的固件感興趣,其原因在于獨立BIOS供應商(專門從事固件開發的公司)似乎是Phoenix Technologies而不是AMI,因為此前已經研究過大多數固件。盡管大多數固件都使用EDKII,但供應商的不同意味著其中的很多代碼都將有所不同。
我們首先開始分析SMM驅動程序,很快就發現了一個漏洞——在一個SWSMI處理程序中調用SMRAM。該漏洞已經由Lenove在8月完成修復,目前我無法在網上找到關于該漏洞的任何信息。
在本文中,將首先介紹SMM和UEFI的基礎概念,隨后對這一漏洞進行詳細分析,這里面的漏洞利用涉及到在此前另一篇文章中發表的技術——SMM中的Code Check(mate)。
以下內容已經公開發表,幻燈片可以參考這里。
二、SMM和UEFI
UEFI是描述開發固件(特別是BIOS)標準接口集的規范。該固件是啟動期間在CPU上執行的第一批內容,負責初始化硬件并進行設置,從而讓操作系統可以啟動。該固件存儲在計算機SPI Flash中。攻擊者如果成功攻擊這個硬件,就可以在硬盤以外的其他位置實現持久性。
系統管理模式(SMM)是一種Intel CPU模式,因為該模式與內存或系統管理程序相比具有更高的特權,因此通常被稱為Ring 2。SMM擁有自己的存儲空間,稱為SMRAM,可以防止其他模式對其進行訪問。SMM可以被看作是一個“安全的世界”,與ARM上的Trust Zone類似。但是,其最初的目標并非是提供安全功能,而是處理計算機的特定要求,例如高級電源管理(APM,已由ACPI替代)。如今,它還用于保護對包含UEFI代碼的SPI Flash的寫訪問。
Inter手冊中“處理器工作模式之間的轉換”:

從上面的示意圖中可以看出,可以從任何“普通模式”訪問SMM。SMM還支持16位、32位和64位,這使其成為所有其他模式的一個備份。當觸發系統管理中斷(SMI)時,將會在普通模式和SMM之間進行轉換。發生這種情況時,處理器會切換到SMM:它首先將CPU的當前狀態保存到一個稱為“已保存狀態(Saved State)”的存儲區(后續可以從該位置恢復到已保存的狀態),然后更改包括指令指針在內的上下文,以執行SMRAM中的代碼。
基本SMRAM映射,SMBASE可能不會隨著SMRAM的開始而被使用:

SMRAM是由UEFI固件保留的物理RAM區域,提供給SMM使用。SMRR可以保護其不被“普通”訪問,也可以保護其不備DMA訪問。SMBASE是一個必須在特定范圍內的地址,用于確定切換到SMM時已保存狀態必須存儲的位置,以及應將指令指針設置在哪個位置。為避免兩個內核同時切換而造成已保存狀態的相互重寫,每個內核只有一個SMBASE,并且對SMRAM內部的位置沒有限制。
目前,存在幾種不同的SMI,但特別需要強調的是其中一種SoftWare SMI(SWSMI),往往會被攻擊者利用。在ioport 0xb2上寫入值后,代碼通常會搜索與寫入ioport的值相對應的SWSMI處理程序。這些處理程序通常是以64位編寫的。
最后,由UEFI固件初始化在SMM中運行的代碼(在SMRAM中設置)。特別是,通常在UEFI引導的驅動程序執行環境(DXE)階段設置SWSMI處理程序。DXE階段由數百個驅動程序組成,這些驅動程序用于從硬件初始化到網絡棧實現的所有過程。
這些驅動程序提供了位于普通模式下的一組服務(特別是EFI_BOOT_SERVICES和EFI_RUNTIME_SERVICES),這些服務提供了一組基本功能,例如分配和訪問非易失性(Non-Volatile)變量。
EFI_BOOT_SERVICES還允許注冊和訪問協議。協議允許驅動程序共享功能,并根據GUID進行標識。實際上,由于在UEFI引導過程中所有的內存訪問都是在物理內存中進行的,因此協議只會將GUID與指針相關聯。這些協議中,有一些是公開的,并且有文檔記錄(一些是記錄在UEFI規范中,一些是在edk2中),而另外一些則針對每個構造函數。在DXE階段結束時,固件將鎖定SMRAM,阻止對其進行訪問,然后嘗試啟動引導加載程序以過渡到操作系統。
三、漏洞分析
3.1 初始逆向工程
當我開始進行固件逆向時,我首先需要確定驅動程序是使用哪個協議來注冊SWSMI處理程序的。經過分析,發現他們使用了edk2(MdePkg/Include/Protocol/SmmSwDispatch2.h)中定義并記錄的經典EFI_SMM_SW_DISPATCH2_PROTOCOL。在確定該協議之后,我開始對使用該協議的所有驅動程序進行了簡單的二進制搜索,然后開始進行逆向。
其中一個驅動程序名為SmmOEMInt15,它是一個非常小的驅動程序,僅包含21個函數,其中包括一個注冊SWSMI的函數:
// [...]
res = gSmst->SmmLocateProtocol(&UnkProtocolGuid, 0i64, &unk_protocol); // (1)
// [...]
swsmi_number = 0xFFFFFFFF;
if ((*unk_protocol)(&swsmi_oemint15_guid, &swsmi_number) Register( // (4)
          EfiSmmSwDispatch2ProtocolInterface,
          swsmi_handler_unk_func,
          &RegisterContext,
          &DispatchHandle))
    return EFI_UNSUPPORTED;
return EFI_SUCCESS;
上面的代碼片段執行了以下操作:
1. 使用GUID ff052503-1af9-4aeb-83c4-c2d4ceb10ca3(UnkProtocolGuid)檢索未記錄的協議(unk_protocol),這里利用了EFI_SMM_SYTEM_TABLE2(gSmst),其中包含一些SMM服務。

[1] [2] [3] [4]  下一頁

【聲明】:黑吧安全網(http://www.650547.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        安徽快3自由的百科 甘肃快3基本走势一定牛 上海11选5跨度走势图 好运快三彩票正规吗 炒股入门书单 安徽25选5开奖公告 广东福彩好彩一 必赢客时时彩软件下载 河南快三在线开奖视频 东风科技股票分析 排列三走势图综合版啥