1. 程式人生 > >《計算機韌體安全技術》學習筆記

《計算機韌體安全技術》學習筆記

[本文所有內容均來自於對周振柳博士出版的《計算機韌體安全技術》一書的摘抄、引用和歸納,如有侵權,請聯絡刪除]

1.引言

1.1 韌體和BIOS概念

1.1.1 概念

  • 計算機韌體是計算機系統中不可缺少的底層基礎系統,往往以軟體形式固化儲存在硬體晶片中。
  • BIOS:計算機主機板上最重要最核心的計算機韌體。
  • 韌體常常儲存於計算機或外部裝置的可程式設計只讀儲存器(Programable Read-Only Memory,PROM)中。韌體常用於對硬體裝置進行配置以完成指定功能,或者為作業系統提供硬體操作介面。一些韌體也可能成為作業系統核心的一部分,為作業系統的其他部分提供基本服務,並運行於特權模式
    下。**外圍裝置(顯示卡、網絡卡等)**上也存在韌體,用於初始化、驅動這些裝置,為作業系統提供操作介面。
  • 1996年以後,韌體儲存逐漸從ROM晶片轉換成flash晶片,特徵是
    • 晶片容量增大,越來越多應用加入到韌體中;
    • 作業系統執行過程中,通過指定技術直接對韌體晶片中的內容進行更新寫入。
    • 引入更多安全風險。

1.1.2 功能及地位

  • 開機自檢:計算機開始時BIOS獲得系統控制權,BIOS檢查CPU是否工作正常,並檢查定時器,中斷控制器等的狀態,以及基本記憶體,串並口,鍵盤,顯示卡等,發現問題將給出提示資訊或鳴笛警告。
  • 系統初始化:填充相應暫存器的值。
  • 提供常駐記憶體的執行時服務:作業系統和應用程式通過中斷方式呼叫這些服務程式碼,如Int 10h,Int 13h,Int 15h等。
  • 系統設定:提供文字或圖形介面的設定程式(BIOS setup),如設定BIOS密碼,引導順序,系統時間等。引數記載在非易失性儲存體中,如CMOS晶片或flash晶片的擴充套件系統配置資料區。
  • 引導作業系統:按照設定的啟動順序,查詢到有效啟動記錄後,讀入作業系統引導程式碼,然後將系統控制權交給引導程式碼,並由引導程式碼來完成作業系統的裝載啟動。

1.2 發展及現狀

  • 1981年第一個BIOS產品
  • 2003年,Intel釋出新一代BIOS產品新規範:擴充套件韌體介面(EFI)
  • 2007年~,Intel聯合Microsoft,IBM,Hp,AMI,Dell,Phoenix,AMD 等廠商推動行業規範:UEFI
  • 產品:BIOS產品一直由Phoenix,AMI,Award三家公司壟斷。

2.計算機韌體發展與技術基礎

2.1

2.1.1 演變

8086/8088時:CPU加電後第一個動作,就是設定程式碼段暫存器CS,資料段暫存器DS,附件段暫存器ES,堆疊段暫存器SS的初始值等於0FFFFh,設定指令指標暫存器IP的值為0000h,從而將指令指標指向了實體地址0FFFF0h,從該地址取得第一條CPU將要執行的指令。
當時中央處理器只有20跟地址線,最大定址空間是2^20bits = 1MBytes,即00000h~0FFFFFh.從CPU加電令指令指標指向的0FFFF0h地址到最大地址空間0FFFFFh地址,這之中僅有16位元組的空間,放不下足夠韌體BIOS初始化程式碼段,因此存放在這裡的起始指令是一條長跳轉指令:
FFFF:0000 EA5BE000F0 JMP FAR PTR 0F000:E05Bh
CPU加電後,首先從BIOS中取得這條長跳轉指令,執行這條指令,從而跳轉到前端空間的指定位置(0FE05Bh),從該位置處取得下一條將要執行的指令繼續執行。
中央處理器進化到32位後,其定址空間增加到了4GB,然而卻仍然保留了CPU加電後的指令指標設計特性,即CPU加電後讀取的第一條指令仍然存放在4GB空間的最後一個16位元組的起始位置,實體地址為0FFFFFFF0h。
這些固化在計算機主機板上晶片中的韌體BIOS程式碼的存放區域,雖然是獨立儲存在晶片中,佔用的卻是統一的計算機記憶體地址區域,通常就是記憶體的最高段的地址區域,這部分記憶體區域通常也稱為影子記憶體

2.1.2 傳統BIOS缺陷

  • 執行在16位真實模式下。
  • 晶片廠商希望有統一的韌體驅動模式和介面,由晶片廠商自行開發出在不同廠商韌體BIOS上都能執行測試的驅動,而非由韌體BIOS廠商來定製和整合,以加快PC硬體研發的速度。
  • 安全考慮欠缺。

2.1.3 新一代韌體EFI/UEFI

Intel定義了EFI驅動程式(EFI Driver)和EFI應用程式(EFI Application)結構,允許硬體開發商,作業系統開發商,應用軟體開發商以及普通使用者從外部儲存裝置中載入各自開發的硬體驅動程式和韌體應用程式。另外,還提供了韌體層次的程式除錯診斷工具和除錯執行模擬環境;定義了統一的引導服務(Boot Services)和執行時服務(Runtime Services)以滿足韌體和作業系統兩個層次的功能呼叫需求;並且它在執行階段,很早就從中央處理器加電預設的真實模式切換到32位保護模式下執行。

2.2 韌體產品和技術研發狀態

2.2.1 公用韌體產品

三足鼎力:Phoenix、AMI、Award。

2.2.2 開源韌體BIOS專案

  • TinyBIOS
  • OpenBIOS
  • LinuxBIOS
  • Bochs

2.2.3 我國計算機韌體產品研發現狀

聯想、方正、長城、浪潮等國內計算機或主機板大廠商,其計算機或主機板上韌體BIOS都需要向專業韌體BIOS廠商取得授權,並請韌體BIOS廠商作必要的技術協助,針對計算機硬體平臺特性作必要的修改和移植工作。

2.3 韌體開發基礎技術與規範

2.3.1 硬體體系架構

北橋晶片負責記憶體、顯示卡、CPU之間的整合或連線,南橋晶片負責PCI 、IDE、USB、SATA儲存裝置以及鍵盤滑鼠網絡卡等外圍介面的整合或連線處理。
初始化包括:中央處理器CPU初始化、記憶體初始化、系統晶片組初始化

2.3.2 匯流排介面規範

為了簡化硬體電路設計、簡化系統結構,常用一組線路,配置以適當的介面電路,與各部件和外圍裝置連線,這組共用的連線線路被稱為匯流排。匯流排一般有內部匯流排、系統匯流排和外部匯流排。

  • LPC 匯流排
  • SMBUS 匯流排
  • ATA 匯流排
  • USB 匯流排
  • PCI 匯流排
  • 2.3.3 韌體相關管理介面規範

計算機傳統韌體BIOS發展過程中,其中涉及一些規範是需要硬體廠商韌體BIOS廠商以及作業系統廠商通力合作,在各自的產品中都能夠遵循同一個規範,使得硬體、韌體和作業系統能夠協同一體工作完成某些功能要求。

  • ACPI規範
    計算機韌體產品必須能夠產生各種ACPI Table,並且向作業系統報告ACPI Table的記憶體佔用情況。而各種外圍裝置、控制器(軟盤、硬碟、光碟機、網絡卡等)則需要隨時將自身的電源使用及開關狀態記錄在ACPI暫存器中,主機板中的感測器也會隨時將各晶片的最新電壓、溫度等引數通過ACPI表格和SMBus匯流排回傳給作業系統。韌體還要為系統在各種不同狀態下的啟動設計和選擇正確的路徑。
    對於韌體開發者來說,重要的是建立各種ACPI表格,根據平臺特性收集並填寫周邊裝置的ACPI資訊;瞭解主機板佈線結構,設計必要的ASL語言程式碼等。ASL程式碼可由微軟提供的ASL編譯器編譯生成AML目的碼,儲存在韌體產品執行時構造的ACPI Table中。
  • SMBIOS(System Management BIOS)
    SMBIOS規範規定了在x86系統架構下,主機板和系統製造商如何通過韌體BIOS擴充套件介面,以標準格式提供產品的管理資訊。韌體開發者必須遵照規範,收集足夠多的平臺資訊,提供韌體擴充套件介面,以向用戶或上層作業系統提供這些資訊。SMBIOS資訊的核心是一個SMBIOS結構表。該表存在於0F0000h到0FFFFFh記憶體空間中,以對齊於16位元組邊界的“SM”標識該表。表內容由表頭和表結構資訊組成。結構資訊的內容包含最多128類的資訊,由Type0到Type 127.
    韌體執行時要儘可能多地收集和填寫規範中的這些資訊,並且實現SMBIOS結構資訊訪問存取的介面函式。這些介面函式通常用於作業系統向韌體索取這些系統資訊。

4.BIOS安全漏洞及威脅研究

CVE:全球資訊保安界對電腦保安漏洞和脆弱性統一命名的權威知識庫。

主要的10類安全漏洞:

BIOS遠端開機漏洞
BIOS定時開機漏洞
ChipAwayVirus 漏洞
磁碟恢復精靈漏洞
Phoenix Net漏洞
BIOS弱口令漏洞
CVE-2002-2059
CVE-2005-0963
CVE-2005-4175
CVE-2005-4176

5.計算機韌體BIOS安全檢測方法與實現

安全檢測包括:BIOS系統漏洞檢測和BIOS系統惡意程式碼檢測

5.1 安全檢測負責性

安全漏洞:需要針對不同的安全漏洞,提取該漏洞存在的特徵,包括漏洞程式碼的特徵、漏洞存在的環境特徵(如系統或軟體版本號、補丁狀態、配置引數等),建立漏洞庫,通過特徵匹配的方法實現對漏洞的檢測。BIOS系統存在於flash晶片中,BIOS漏洞所有特徵的提取,只能通過對flash晶片的二進位制映像檔案分析得到。
惡意程式碼: 包括對原始BIOS程式碼的篡改、插入新程式碼、增加新的非標準BIOS模組。
BIOS產品程式碼演化過程:

{BISO廠商}
:基礎BIOS程式碼

{主機板廠商:平臺化}
:主機板BIOS程式碼

{主機廠商:客戶化}
:主機BIOS程式碼

5.2

兩種可用的安全漏洞自動檢測方法:
基於漏洞庫的漏洞掃描:發現漏洞後,能夠提取漏洞的程式碼特徵或者環境特徵,將所有被發現的漏洞及其特徵儲存成漏洞庫(決定檢測結果完備性和準確性,完備性依賴於漏洞庫中漏洞的數量和質量,而準確性則依賴於漏洞庫中的漏洞特徵是否有效,是否能夠唯一確定和識別漏洞,而不會出現大量的錯報和誤報),通過特徵匹配的方法實現漏洞自動掃描。是一種靜態檢測方法。
基於缺陷注入的漏洞測試:通過典型邊界輸入值或者模擬攻擊,發現漏洞存在,是一種動態檢測方法,通常在系統或軟體執行過程中實施。
通過收集不同BIOS廠商、不同計算機BIOS產品樣本,對BIOS二進位制映像檔案進行模組分解解壓縮,利用反彙編技術(IDA Pro工具)進行漏洞特徵分析、提取、驗證,最終獲取已發現的BIOS安全漏洞的特徵。漏洞特徵主要包含兩種形式:特徵字串特徵二進位制碼。特徵字串通常包括同漏洞存在相關聯的字串資訊,如BIOS版本號、BIOS ID、BIOS廠商資訊、表格頭部特徵資訊、提示和介面資訊等。特徵二進位制碼則是通過反彙編從模組程式碼中提取的一處或多處最能代表漏洞存在的二進位制指令碼序列。在BIOS漏洞庫中,漏洞的特則往往是以多個特徵的與組合構成,成為漏洞的特徵組。

5.3 基於語言的韌體惡意程式碼檢測(簽名?)

基於語言的安全驗證是指,當從一個非信任源獲取並裝載可執行程式碼時,在程式碼執行前,要求同時裝載該可執行程式碼附帶的一個安全證書,通過對證書的驗證以證明程式碼的執行將會是安全的。可執行程式碼的安全證書由程式碼提供者在編譯程式碼時通過編譯器自動生成。

5.5 BIOS產品結構分析

BIOS在flash晶片中的儲存是按照類似於一個簡單的檔案系統來構成的,其構成的最小成分是模組。不同廠商BIOS產品flash映像檔案的結構都不一樣。而且,為降低成本,減少佔用的儲存空間,許多模組經過壓縮儲存。因此,對BIOS進行漏洞掃描和惡意程式碼檢測,都需要首先將BIOS的flash映像檔案解析成模組,對壓縮的模組再進行解壓縮,才能得到真實的資料和程式碼。