古淳仁,胡懷湘,陳相宇
(中國電子科技集團公司第十五研究所,北京 100083)
隨著信息技術(shù)的不斷發(fā)展,計算機廣泛應(yīng)用于各行各業(yè),隨之而來的信息安全問題也越來越受到關(guān)注[1-2]。例如私自插入、替換存儲設(shè)備或篡改操作系統(tǒng)內(nèi)核等重要文件可能會使計算機運行惡意代碼,進而嚴重破壞計算機的信息安全[3-4]。
因此,該文提出了一種基于UEFI 的軟硬件度量技術(shù),在執(zhí)行引導(dǎo)啟動程序前對重要的軟硬件進行度量,并將結(jié)果與預(yù)期度量值相比對,確定一致才允許啟動。同時引入了“三員”管理機制,以約束系統(tǒng)管理員的行為,降低軟硬件被篡改的風(fēng)險,提高計算機系統(tǒng)的安全性。
UEFI 是定義操作系統(tǒng)與固件之間軟件界面的技術(shù)規(guī)范[5-7],它將計算機從啟動到關(guān)機的全過程劃分為安全驗證、EFI 預(yù)初始化、驅(qū)動執(zhí)行環(huán)境、啟動設(shè)備選擇、臨時操作系統(tǒng)加載、運行操作系統(tǒng)、災(zāi)難恢復(fù)七個階段[8-9]。該文依據(jù)規(guī)范在啟動設(shè)備選擇階段以模塊化的方式實現(xiàn)“三員”管理模式下的軟硬件度量功能。
為明確硬件存儲設(shè)備是否與上一次啟動時保持一致,應(yīng)獲取存儲設(shè)備的唯一標識,將其經(jīng)過哈希運算后與預(yù)期度量值進行比較。若一致,則認為硬件設(shè)備度量成功,啟動過程可以繼續(xù);反之若存在某一存儲設(shè)備標識映射與所有的預(yù)期度量值都不一致,則認為是新插入的設(shè)備,記錄并回顯度量失敗的具體設(shè)備。
需要說明的是,盡管設(shè)備的唯一標識已經(jīng)可以區(qū)分不同的設(shè)備,但對唯一標識進行哈希的步驟仍是必要的,原因是不同廠商或不同型號的存儲設(shè)備序列號一般為不同長度的字符串,直接存儲會造成存儲空間的浪費,將其無沖突地散列為64 位的整數(shù),既節(jié)約存儲空間又保持了數(shù)據(jù)長度的一致。
但僅通過設(shè)備唯一標識的哈希映射來識別存儲設(shè)備仍不能認為設(shè)備中的軟件是未篡改的。比如,硬盤通過其他計算機修改內(nèi)核文件或?qū)氩话踩绦蚝笤僦匦虏寤?,由于硬盤唯一標識未改變,所以仍然可以度量成功。因此硬件度量功能應(yīng)當(dāng)與軟件度量或硬盤加密技術(shù)配合使用。其中,硬盤加密技術(shù)已十分成熟[10-12],市面常見的通用兼容機固件普遍具備這項功能,因此該文只研究軟件度量技術(shù)。
區(qū)別于硬盤加密,軟件度量功能的對象是可以選擇的文件個體,而非某硬盤或某硬盤分區(qū),并且僅對目標文件進行校驗[13],不進行加密操作。為了防止重要的程序被替換或篡改,可以將其作為度量的目標文件,如引導(dǎo)程序、內(nèi)核文件等二進制可執(zhí)行文件和啟動配置文件等。
讀取目標文件并度量后,將實際度量結(jié)果與預(yù)期度量值進行比較,若所有目標文件的度量值均與預(yù)期度量值保持一致,則表示文件未改動,允許繼續(xù)啟動;否則記錄并回顯度量失敗的具體文件,拒絕執(zhí)行后續(xù)的啟動步驟,最后提供更新預(yù)期度量值或關(guān)閉計算機的交互選項。
通常情況下,計算機固件一般提供設(shè)置基本輸入輸出系統(tǒng)(Basic Input Output System,BIOS)密碼功能[14],而不為BIOS 設(shè)置多個用戶,單一系統(tǒng)管理員擁有全部管理權(quán)限。若僅單純地加入軟硬件度量功能,那么系統(tǒng)管插入或替換硬盤后更新預(yù)期度量值即可順利啟動,也就失去了度量功能存在的意義。單一管理員模式依賴絕對可信的管理員,這在具有保密需求的計算機系統(tǒng)中存在較大的安全隱患。因此該文引入了“三員”管理模式,建立了區(qū)別于系統(tǒng)管理員賬戶的安全管理員賬戶和審計管理員賬戶,將度量值的管理權(quán)限與日志的管理權(quán)限從系統(tǒng)管理員賬戶中剝離,并分別授予安全管理員和審計管理員,以充分發(fā)揮軟硬件度量功能。
“三員”指系統(tǒng)管理員、安全管理員和審計管理員[15]。三類管理員權(quán)限劃分如表1 所示,系統(tǒng)管理員保管機箱鑰匙,負責(zé)維護計算機設(shè)備,擁有變更存儲硬件和調(diào)整啟動選項的權(quán)限,但以上操作會導(dǎo)致開機后度量結(jié)果不符合預(yù)期度量值,因此計算機無法順利啟動;安全管理員具有修改預(yù)期度量值的權(quán)限,若系統(tǒng)管理員對系統(tǒng)作出的軟硬件調(diào)整為合規(guī)操作,則可以向安全管理員提出申請,由安全管理員更新預(yù)期度量值,更新后實際度量值與預(yù)期值一致,計算機可以順利啟動;審計管理員擁有管理系統(tǒng)日志的權(quán)限,更新預(yù)期度量值的操作會在系統(tǒng)中留下記錄日志,這些日志只允許被審計管理員查看和修改,用于對管理員行為的跟蹤和審查。
表1 管理員類別與相應(yīng)權(quán)限
三類管理員的權(quán)限相互分離,相互制約,可以有效地規(guī)避單一管理員模式引起的安全風(fēng)險。
文中引入“三員”管理模式后的軟硬件度量流程如下:
步驟1:系統(tǒng)上電開機后,UEFI 運行至啟動設(shè)備選擇階段末期,所有必要的設(shè)備驅(qū)動均已加載完成,即將執(zhí)行預(yù)設(shè)啟動項。此時進行軟硬件度量,并臨時保存實際度量值。在開機交互界面用戶會面臨兩個選擇:按熱鍵主動進入UEFI 固件設(shè)置界面或跳過設(shè)置直接根據(jù)默認啟動項引導(dǎo)操作系統(tǒng)。若按下熱鍵,則進入步驟2,否則進入步驟6。
步驟2:輸入管理員賬戶和密碼。輸入系統(tǒng)管理員賬戶和密碼進入步驟3;或輸入安全管理員賬戶和密碼進入步驟4;或輸入正確的審計管理員賬戶和密碼進入步驟5。
步驟3:可以調(diào)整計算機系統(tǒng)啟動選項。退出后進入步驟6。
步驟4:可以更新存儲設(shè)備和目標文件的預(yù)期度量值,若更新預(yù)期度量值則記錄操作日志。退出后進入步驟6。
步驟5:可以查看和刪除操作日志。退出后進入步驟6。
步驟6:退出固件設(shè)置界面,比較所有項目的實際度量值是否與預(yù)期度量值一致,若所有項目度量成功則進入步驟7,否則記錄度量失敗的項目并進入步驟8。
步驟7:向用戶回顯軟硬件度量成功,繼續(xù)執(zhí)行啟動流程,加載并運行操作系統(tǒng)。
步驟8:向用戶回顯度量失敗的項目,并提供交互選項:登錄安全管理員賬戶以更新度量值,或放棄啟動并關(guān)機。若選擇前者則進入步驟2,若選擇后者則關(guān)閉計算機。
以上流程如圖1 所示。
圖1 “三員”管理模式下的軟硬件度量流程
為驗證軟硬件度量功能和“三員”管理機制,該文采用EDK2[16]完成固件原型的開發(fā),在開放虛擬機固件[17](Open Virtual Machine Firmware,OVMF)的基礎(chǔ)上進行改造,增加軟硬件度量功能并引入“三員”管理機制。
UEFI BIOS 調(diào)用硬件度量過程時,首先遍歷所有外部設(shè)備,通過讀取EFI_DEVICE_PATH_PROTO COL 結(jié)構(gòu)體中的Type 和SubType 成員判斷是否為PCI、SATA 或USB 存儲設(shè)備,若為存儲設(shè)備則調(diào)用GetDeviceDescriptor 函數(shù)獲取設(shè)備描述符,讀取其VendorID、ProductID 以及SerialNumber。其中Serial Number 為長度不均的字符串類型,而VendorID 和ProductID 都是兩個字節(jié)長的整數(shù)類型,將它們均轉(zhuǎn)化為字符串類型拼接在SerialNumber 之后,形成未經(jīng)哈希映射的唯一標識字符串。為盡可能地降低沖突率,采用BKDRHash[18]函數(shù)將唯一標識字符串映射為64 位寬的整數(shù),作為存儲設(shè)備的度量值。
軟件度量即是對目標文件的度量,該文將目標文件指定為boot 分區(qū)中的引導(dǎo)加載程序、啟動配置文件和操作系統(tǒng)內(nèi)核。通過EFI_SIMPLE_FILE_SY STEM_PROTOCO 依次取 得bootx64.efi 文件、grub.cfg文件和以vmlinuz 為前綴的文件的句柄,然后調(diào)用信息摘要算法(Message-Digest Algorithm 5,MDA5)對目標文件依次度量,其中efi 文件與內(nèi)核文件以二進制文件只讀的方式打開,而cfg 文件以文本文件只讀的方式打開,每一個文件都將生成一個長度為32 的16 進制數(shù)值字符串,即目標文件的度量值。
OVMF 的交互界面通過人機接口架構(gòu)(Human Interface Infrastructure,HII)來實現(xiàn)。其中前端部分修改vfr 文件中的formset 以增加預(yù)期度量值管理、日志管理選項標簽以及相應(yīng)的子結(jié)構(gòu),并對不同管理員用戶frontpage 中的可選標簽加以動態(tài)區(qū)分,以設(shè)定不同管理員的權(quán)限。后端通過實現(xiàn)EFI_HII_CO NFIG_ACCESS_PROTOCOL 接口獲取HiiHandle,即預(yù)先在HII 數(shù)據(jù)庫中注冊的句柄,從而實現(xiàn)觸發(fā)與前端操作相對應(yīng)的函數(shù)調(diào)用。
首先注冊模塊并編譯為efi 文件,將新生成的efi文件封裝入fd 文件。然后配置QEMU 虛擬機,啟用關(guān)聯(lián)fd 文件的flash,以物理磁盤作為硬盤,輸出重定向至控制臺。最后進行驗證前的準備工作,以物理機為媒介在虛擬機硬盤的boot 分區(qū)建立目錄結(jié)構(gòu),寫入文件bootx64.efi、grub.cfg 和vmlinuz-4.18.0-348.x86_64,啟動虛擬機后登錄安全管理員賬戶,在固件設(shè)置界面更新所有軟硬件預(yù)期度量值,保存并關(guān)閉虛擬機。配置另一塊啟動磁盤,建立同樣的目錄結(jié)構(gòu),并寫入bootx64.efi、grub.cfg 和vmlinuz-4.15.0-142.x86_64,即更換了硬盤和操作系統(tǒng)內(nèi)核。
啟動虛擬機,登錄系統(tǒng)管理員賬戶,觸發(fā)熱鍵進入固件設(shè)置界面,如圖2 所示,系統(tǒng)管理員無法選中預(yù)期度量值管理和日志管理選項卡。
圖2 系統(tǒng)管理員界面
將光標移動到Continue,按下回車鍵繼續(xù)啟動。如圖3 所示,硬盤和操作系統(tǒng)內(nèi)核已更換,因此度量失敗,用戶選擇登錄安全管理員賬戶以更新預(yù)期度量值或放棄啟動。
圖3 軟硬件度量失敗
選擇重新登錄,以安全管理員賬戶登錄固件設(shè)置界面,安全管理員只擁有管理預(yù)期度量值的權(quán)限。分別進入Expected Measurement of Hardware 選項卡和Expected Measurement of Software 選項卡,看到硬盤和操作系統(tǒng)內(nèi)核的實際度量值的確與預(yù)期度量值不符,如圖4 和圖5,分別更新它們的預(yù)期度量值。
圖4 硬件預(yù)期度量值管理
更新預(yù)期度量值后保存并退出,將重新比較實際度量值與預(yù)期度量值,此時二者一致,度量結(jié)果如圖6 所示。
圖6 軟硬件度量成功
最后重啟虛擬機,以審計管理員賬戶登錄固件設(shè)置界面,審計管理員只擁有管理日志的權(quán)限。進入日志管理選項卡,查看和刪除由于安全管理員賬戶更新預(yù)期度量值而產(chǎn)生的日志,如圖7 所示。
圖7 日志管理
對比第三部分所分析的流程,上述操作驗證了固件原型中“三員”管理模式下的軟硬件度量功能。
為防止計算機內(nèi)重要的存儲設(shè)備和軟件程序被篡改,該文提出了一種基于UEFI 規(guī)范的軟硬件度量技術(shù),保護了計算機系統(tǒng)的數(shù)據(jù)安全。同時,引入了“三員”管理機制,有效規(guī)避了單一管理員模式下系統(tǒng)管理員違規(guī)操作的風(fēng)險。但是,該文提出的策略還不十分完善,后續(xù)的研究中可以在軟硬件度量的基礎(chǔ)上增加對硬盤分區(qū)哈希碼的檢查以及配合硬盤加密技術(shù)等其他策略,共同保護計算機的信息安全。