UEFI BIOS Rootkit Analysis

Andrew.Hann發表於2017-04-23

catalog

1. BIOS簡介
2. UEFI BIOS
3. EFI程式設計簡介
4. UEFI Rootkit

 

1. BIOS簡介

BIOS("Basic Input Output System 基本輸入輸出系統),它是一組固化到計算機內主機板上一個ROM晶片上的程式,它儲存著計算機最重要的基本輸入輸出的程式、開機後自檢程式和系統自啟動程式,它可從CMOS中讀寫系統設定的具體資訊。 其主要功能是為計算機提供最底層的、最直接的硬體設定和控制

0x1: 晶片簡介

BIOS設定程式是儲存在BIOS晶片中的,BIOS晶片是主機板上一塊長方形或正方形晶片,只有在開機時才可以進行設定(一般在計算機啟動時按F2或者Delete進入BIOS進行設定,一些特殊機型按F1、Esc、F12等進行設定)。BIOS設定程式主要對計算機的基本輸入輸出系統進行管理和設定,使系統執行在最好狀態下,使用BIOS設定程式還可以排除系統故障或者診斷系統問題,BIOS本質是一段程式碼組成的程式,但是它與一般的軟體還是有一些區別,而且它與硬體的聯絡也是相當地緊密。形象地說,BIOS應該是連線軟體程式與硬體裝置的一座"橋樑",負責解決硬體的即時要求。主機板上的BIOS晶片或許是主機板上唯一貼有標籤的晶片,一般它是一塊32針的雙列直插式的積體電路,上面印有"BIOS"字樣

1. ROM

在微機(微型計算機Microcomputer System)的發展初期,BIOS都存放在ROM(Read Only Memory,只讀儲存器)中。ROM內部的資料是在ROM的製造工序中,在工廠裡用特殊的方法被燒錄進去的,其中的內容只能讀不能改,一旦燒錄進去,使用者只能驗證寫入的資料是否正確,不能再作任何修改。如果發現資料有任何錯誤,則只有捨棄不用

2. EPROM

EPROM(Erasable Programmable ROM 可擦除可程式設計ROM)晶片可重複擦除和寫入,解決了ROM晶片只能寫入一次的弊端。EPROM晶片有一個很明顯的特徵,在其正面的陶瓷封裝上,開有一個玻璃視窗,透過該視窗,可以看到其內部的積體電路,紫外線透過該孔照射內部晶片就可以擦除其內的資料,完成晶片擦除的操作要用到EPROM擦除器。EPROM內資料的寫入要用專用的程式設計器,並且往晶片中寫內容時必須要加一定的程式設計電壓(VPP=12—24V,隨不同的晶片型號而定)。EPROM的型號是以27開頭的,如27C020(8*256K)是一片2M Bits容量的EPROM晶片。EPROM晶片在寫入資料後,還要以不透光的貼紙或膠布把視窗封住,以免受到周圍的紫外線照射而使資料受損

3. EEPROM

由於EPROM操作的不便,586以後的主機板上BIOS ROM晶片大部分都採用EEPROM(Electrically Erasable Programmable ROM 電可擦除可程式設計ROM)。通過跳線開關和系統配帶的驅動程式盤,可以對EEPROM進行重寫,方便地實現BIOS升級

4. NORFlash

從奔騰時代開始,現代的電腦主機板都使用NORFlash來作為BIOS的儲存晶片。除了容量比EEPROM更大外,主要是NORFlash具有寫入功能,執行電腦通過軟體的方式進行BIOS的更新,而無需額外的硬體支援(通常EEPROM的擦寫需要不同的電壓和條件),且寫入速度快,需要明白的是,在方便系統管理員的同時,也為黑客向機器種植Rootkit帶來了便利

需要明白的是,不管採用什麼持久化儲存方式,主機板和BIOS互動的介面方式都是不變的,主機板從中讀取程式碼資料並執行

0x2: 主要程式

1. 主要I/O裝置的驅動程式和中斷例程
BIOS中中斷例程即BIOS中斷服務程式。它是微機系統軟、硬體之間的一個可程式設計介面,用於程式軟體功能與微機硬體實現的銜接。DOS/Windows作業系統對軟盤、硬碟、光碟機與鍵盤、顯示器等外圍裝置的管理即建立在系統BIOS的基礎上。程式設計師也可以通過對INT 5、INT 13等中斷的訪問直接呼叫BIOS中斷例程
由於BIOS直接和系統硬體資源打交道,因此總是針對某一型別的硬體系統,而各種硬體系統又各有不同,所以存在各種不同種類的BIOS,隨著硬體技術的發展,同一種BIOS也先後出現了不同的版本,新版本的BIOS比起老版本來說,功能更強

2. 系統設定程式
微機部件配置情況是放在一塊可讀寫的CMOS RAM晶片中的,它儲存著系統CPU、軟硬碟驅動器、顯示器、鍵盤等部件的資訊。關機後,系統通過一塊後備電池向CMOS供電以保持其中的資訊。如果CMOS中關於微機的配置資訊不正確,會導致系統效能降低、零部件不能識別,並由此引發一系列的軟硬體故障。在BIOS ROM晶片中裝有一個程式稱為"系統設定程式",就是用來設定CMOS RAM中的引數的。這個程式一般在開機時按下一個或一組鍵即可進入,它提供了良好的介面供使用者使用。這個設定CMOS引數的過程,習慣上也稱為"BIOS設定"。新購的微機或新增了部件的系統,都需進行BIOS設定

3. POST上電自檢
微機接通電源後,系統將有一個對內部各個裝置進行檢查的過程,這是由一個通常稱之為POST(Power On Self Test 上電自檢)的程式來完成的。這也是BIOS的一個功能。完整的POST自檢將包括CPU、640K基本記憶體、1M以上的擴充套件記憶體、ROM、主機板、CMOS存貯器、串並口、顯示卡、軟硬碟子系統及鍵盤測試。自檢中若發現問題,系統將給出提示資訊或鳴笛警告
在自檢成功後將磁碟相對0道0扇區上的載入程式裝入記憶體,讓其執行以裝入DOS系統

4. 自檢程式
在完成POST自檢後,ROM BIOS將按照系統CMOS設定中的啟動順序搜尋軟硬碟驅動器及CDROM、網路伺服器等有效的啟動驅動器,讀入作業系統引導記錄,然後將系統控制權交給引導記錄,由引導記錄完成系統的啟動

Relevant Link:

http://baike.baidu.com/item/bios

 

2. UEFI BIOS

新型UEFI,全稱"統一的可擴充套件韌體介面"(Unified Extensible Firmware Interface),是一種詳細描述型別介面的標準。這種介面用於作業系統自動從預啟動的操作環境,載入到一種作業系統上
可擴充套件韌體介面(Extensible Firmware Interface EFI)是Intel為PC韌體的體系結構、介面和服務提出的建議標準。其主要目的是為了提供一組在OS載入之前(啟動前)在所有平臺上一致的、正確指定的啟動服務,被看做是有近20多年曆史的BIOS的繼任者
與legacy BIOS 相比,UEFI最大的幾個區別在於

1. 編碼99%都是由C語言完成
2. 一改之前的中斷、硬體埠操作的方法,而採用了Driver/protocol的新方式 
3. 將不支援X86真實模式,而直接採用Flat mode(也就是不能用DOS了,現在有些EFI或UEFI能用是因為做了相容,但實際上這部分不屬於UEFI的定義了)
4. 輸出也不再是單純的二進位制code,改為Removable Binary Drivers 
5. OS啟動不再是呼叫Int19,而是直接利用protocol/device Path 
6. 對於第三方的開發,BIOS基本上做不到,除非參與BIOS的設計,但是還要受到ROM的大小限制,而UEFI就便利多了 
7. 彌補BIOS對新硬體的支援不足的毛病 

0x1: 結構

UEFI使用模組化設計,它在邏輯上可分為

1. 硬體控制
2. OS軟體管理
//作業系統 -> 可擴充套件韌體介面 -> 韌體 —> 硬體

根據UEFI概念圖的結構,可把UEFI概念劃為兩部分

1. UEFI的實體(UEFI Image)
根據UEFI規範定義,UEFI Image包含三種
    1) UEFI Applications
    uEFI Applications是硬體初始化完,作業系統啟動之前的核心應用,比如: 啟動管理、BIOS設定、uEFI Shell、診斷程式、排程和供應程式、除錯應用...等等
    2) OS Loaders
    OS Loaders是特殊的uEFI Application,主要功能是啟動作業系統並退出和關閉uEFI應用 
    3) UEFI Drivers 
    uEFI Drivers是提供裝置間介面協議,每個裝置獨立執行提供裝置版本號和相應的引數以及裝置間關聯,不再需要基於作業系統的支援

2. 平臺初始化框架
uEFI框架主要包含兩部分
    1) PEI(EFI預初始化)
    PEI主要是用來檢測啟動模式、載入主儲存器初始化模組、檢測和載入驅動執行環境核心
    2) 驅動執行環境(DXE)
    DXE是裝置初始化的主要環節,它提供了裝置驅動和協議介面環境介面 

0x2: 優點

1. 糾錯特性
與BIOS顯著不同的是,UEFI是用模組化、C語言風格的引數堆疊傳遞方式、動態連結的形式構建系統,它比BIOS更易於實現,容錯和糾錯特性也更強,從而縮短了系統研發的時間。更加重要的是,它執行於32位或64位模式,突破了傳統16位程式碼的定址能力,達到處理器的最大定址,此舉克服了BIOS程式碼執行緩慢的弊端

2. 相容性
與BIOS不同的是,UEFI體系的驅動並不是由直接執行在CPU上的程式碼組成的,而是用EFI Byte Code(EFI位元組程式碼)編寫而成的。Java是以"Byte Code"形式存在的,正是這種沒有一步到位的中間性機制,使Java可以在多種平臺上執行。UEFI也借鑑了類似的做法。EFI Byte Code是一組用於UEFI驅動的虛擬機器器指令,必須在UEFI驅動執行環境下被解釋執行,由此保證了充分的向下相容性
一個帶有UEFI驅動的擴充套件裝置既可以安裝在使用安騰的系統中,也可以安裝在支援UEFI的新PC系統中,它的UEFI驅動不必重新編寫,這樣就無須考慮系統升級後的相容性問題。基於解釋引擎的執行機制,還大大降低了UEFI驅動編寫的複雜門檻,所有的PC部件提供商都可以參與=

3. 滑鼠操作
UEFI內建圖形驅動功能,可以提供一個高解析度的彩色圖形環境,使用者進入後能用滑鼠點選調整配置,一切就像操作Windows系統下的應用軟體一樣簡單

4. 可擴充套件性
UEFI將使用模組化設計,它在邏輯上分為硬體控制與OS(作業系統)軟體管理兩部分,硬體控制為所有UEFI版本所共有,而OS軟體管理其實是一個可程式設計的開放介面。藉助這個介面,主機板廠商可以實現各種豐富的功能。比如我們熟悉的各種備份及診斷功能可通過UEFI加以實現,主機板或韌體廠商可以將它們作為自身產品的一大賣點。UEFI也提供了強大的聯網功能,其他使用者可以對你的主機進行可靠的遠端故障診斷,而這一切並不需要進入作業系統

5. 圖形介面
目前UEFI主要由這幾部分構成
    1) UEFI初始化模組
    2) UEFI驅動執行環境
    3) UEFI驅動程式
    4) 相容性支援模組
    5) UEFI高層應用
    6) GUID磁碟分割槽組成
UEFI初始化模組和驅動執行環境通常被整合在一個只讀儲存器中,就好比如今的BIOS固化程式一樣。UEFI初始化程式在系統開機的時候最先得到執行,它負責最初的CPU、北橋、南橋及儲存器的初始化工作,當這部分裝置就緒後,緊接著它就載入UEFI驅動執行環境(Driver Execution Environment DXE)。當DXE被載入時,系統就可以載入硬體裝置的UEFI驅動程式了。DXE使用了列舉的方式載入各種匯流排及裝置驅動,UEFI驅動程式可以放置於系統的任何位置,只要保證它可以按順序被正確列舉。藉助這一點,我們可以把眾多裝置的驅動放置在磁碟的UEFI專用分割槽中,當系統正確載入這個磁碟後,這些驅動就可以被讀取並應用了。在這個特性的作用下,即使新裝置再多,UEFI也可以輕鬆地一一支援,由此克服了傳統BIOS捉襟見肘的情形。UEFI能支援網路裝置並輕鬆聯網,原因就在於此

值得注意的是,一種突破傳統MBR(主開機記錄)磁碟分割槽結構限制的GUID(全域性唯一標誌符)磁碟分割槽系統將在UEFI規範中被引入。MBR結構磁碟只允許存在4個主分割槽,而這種新結構卻不受限制,分割槽型別也改由GUID來表示。在眾多的分割槽型別中,UEFI系統分割槽用來存放驅動和應用程式

Relevant Link:

http://baike.baidu.com/item/UEFI

 

3. EFI程式設計簡介

0x1: 背景

可擴充套件韌體介面(EFI—Extensible Firmware Interface)最早可追溯到1998年的Intel Boot Initiative(IBI)專案。現在EFI規範主要由一些公司財團來開發和維護(包括Intel和Microsoft),定義了為系統韌體匯出的一系列API和資料結構,可以被下列客戶端所使用

1. 作業系統載入器(boot loader)
2. 作業系統
3. EFI裝置驅動
4. EFI診斷和系統工具
5. EFI命令直譯器(shells)

0x2: 標準EFI開發環境

要開始進行UEFI開發,需要用到兩個開發包

1. EFI開發工具(EDK)
該工具包裡含有TianoCore(Intel的UEFI參考實現的公開部分)的原始碼、許多範例和二進位制的EFI Shell,我們可用make系統構建工具來構建,甚至還可以在Win32 UEFI模擬器中構建,這樣可以更方便地開發和測試

2. EFI工具集(EFI Toolkit) 

0x3: EFI開發簡介

1. 生成支援EFI二進位制檔案的GNU編譯器工具鏈
2. 利用該工具鏈,編譯GNU EFI軟體包,該軟體包提供了EFI程式設計介面的初始集合,如果在EFI程式用到了某些GNU EFI不能提供的EDK功能,我們可以從EDK原始碼中引入相關程式碼

Relevant Link:

http://blogs.ejb.cc/archives/4211/introduction-to-efi-programming
http://h17007.www1.hp.com/docs/iss/proliant_uefi/sch_help/v24599840.html
http://www.intel.cn/content/www/cn/zh/architecture-and-technology/unified-extensible-firmware-interface/uefi-driver-and-application-tool-resources.html

 

4. UEFI Rootkit

https://github.com/hackedteam/vector-edk
http://blog.trendmicro.com/trendlabs-security-intelligence/hacking-team-uses-uefi-bios-rootkit-to-keep-rcs-9-agent-in-target-systems/

Copyright (c) 2015 Little5ann All rights reserved

相關文章