UEFI PK KEK 相關概念

一、UEFI 是什么?


UEFI 是一種規范,定義了平臺固件和操作系統之間的接口,從廠商實現的角度出發,我們可以把 UEFI 理解為比 BIOS 更安全、更具擴展性的新固件(固件就是固化在主板 EEPROM 中的子系統,用于處理計算機操作系統加載之前的所有事情),我們跟 UEFI 打交道的界面就是 UEFI 固件的 UI,大概長這個樣子(如下圖),我們都見過 BIOS UI,只有簡單的文本操作界面,為什么 UEFI 能夠做到圖形化呢?因為 UEFI 固件在啟動時可以加載 EFI 設備驅動,有了顯卡驅動, UEFI 的界面就可以實現豐富的圖形化。

  • UEFI 支持從網絡啟動
  • UEFI 能自動識別 USB 和 CD-ROM 中的啟動項
  • UEFI 啟動項等配置可以在操作系統上通過定義的接口進行修改
  • UEFI 啟動界面支持豐富的圖形化
  • UEFI 支持安全啟動
  • UEFI 支持擴展
ASUS UEFI UI
Intel NUC UEFI UI

二、 Secure Boot 和密鑰


Secure Boot 是 UEFI 標準的一部分,簡單地說,UEFI 通過公私鑰加密體系來確保 UEFI 啟動過程中加載的所有可執行文件(EFI 驅動程序、EFI 可執行程序、操作系統 bootloader 等)的有效性和合法性,即數字簽名存在且是有效的,這從根本上在在固件啟動過程中的可能遭受的攻擊問題,為了實現這個功能,UEFI 中定義了以下四個類型的安全變量存儲密鑰、簽名和哈希值。

盡管密鑰驗證看起來類似于 SSL 標準,但是還有些不同,密鑰鏈只驗證到密鑰數據庫中的密鑰本身,不會再往后追溯,但 SSL 會一直驗證到 CA 根。所有的密鑰都存儲在 UEFI 安全變量中,每個變量創建后,只有能證明(擁有對應的私鑰)自己是創建本安全變量的人才能更新此變量,其他人無法更新。

1. PK (Platform Key 平臺密鑰)

此處的平臺可以理解為某一個主板廠商的某一個型號的主板(所以一般計算機廠商都有 n 中不同的平臺),每個主板中改密鑰最多只能有一個,它的作用是用來驗證 KEK 變量中所有密鑰的合法性,大部分的廠商實現中,這個密鑰是 X509 數字證書格式(當然存儲在 NVRAM 中的密鑰是轉換后的二進制格式)。平臺密鑰的擁有者本質上就是平臺的擁有者,比如:聯想的某個主板中的 PK 擁有者就是聯想公司這個主體。如果平臺密鑰被清除,平臺一般會進入到安裝模式,同時平臺密鑰可以被替換成自己生成的密鑰。

2. KEK (Key Exchange Key 密鑰交換密鑰)

KEK 用于對 db 和 dbx 數據庫中內容進行存儲、更新、刪除時進行簽名驗證,只有有效簽名的密鑰、簽名和哈希值才能寫入、刪除或更新到數據庫中。KEK 可以包含多個,一般計算機出廠時包含兩個 KEK,一個是微軟的,一個是主板廠商的,這樣微軟和廠商都可以發布固件更新包對固件進行直接更新。

3. db (Signature Database 簽名數據庫)

用于在 Secure Boot 打開的情況下對 EFI 二進制文件進行簽名驗證,db 中可以包含密鑰、簽名和哈希,在 Secure Boot 模式下,EFI 二進制文件(EFI 驅動,bootloader 等)中的簽名信息會跟這個數據庫中的數據進行比較,如果滿足以下任何一個條件,則說明該二進制文件合法可執行。

  • 文件沒有簽名,但 db 中包含該文件的 SHA-256 哈希值
  • 文件已簽名并且 db 中包含這個簽名信息
  • 文件已簽名并且 db 中包含給這個文件簽名的密鑰并且簽名是有效的

4. dbx (Forbidden Signatures Database 禁用簽名數據庫)

這是一個類似黑名單的數據庫,只要 EFI 可執行文件的簽名、哈希等信息存在于黑名單中,那么這個 EFI 二進制文件將不能被執行。

三、如何執行數字簽名和驗證數字簽名


首先會對該文件使用哈希算法(SHA-256,MD5等)進行消息摘要操作,生成一個固定長度的摘要信息,MD5后的消息摘要長度為 32 (128/8) 字節,SHA-256 哈希后的長度為 64 (256/8) 個字節,然后使用私鑰對生成的固定長度的摘要進行不對稱加密(只有對應的公鑰才能解密),加密后的密文就是數字簽名,數字簽名可以追加到原始文件的后面,也可以單獨用另一個文件保存,隨原始文件一起發布。

問題: 為什么不對文件直接進行非對稱加密操作,而是對文件哈希后的摘要加密?
因為非對稱加密是個 CPU 密集型操作,需要消耗大量算力,當需要加密的文件很大時,這個操作帶來的性能問題是難以接受的,而哈希算法的不可逆性和生成的摘要長度短小且固定正好能夠用在這個場景中。

數字簽名和驗證簽名

四、常見問題


PK 、KEK 能不能被清除或寫入?
大部分兼容機都可以被清除和寫入自己的 PK,但有些筆記本不行,比如:Surface 的 Secure Boot 無法被關閉,所有密鑰都不能被清除。

EFI 可執行文件包括哪些?
包括在 UEFI 啟動過程中加載的所有可執行文件、驅動、鏡像、操作系統 bootloader 等。

PK KEK 安全變量中存儲的密鑰格式?
密鑰大部分是 X509 數字證書格式,存儲到安全變量中的是轉換后的二進制格式。

幾種類型密鑰之間的關系?

密鑰之間的關系

UEFI 模式轉換關系

UEFI MODE

如何創建自己的密鑰?
在 Windows(安裝 git bash) 或 Linux 主機上可以使用以下腳本自己創建對應的密鑰。

#!/bin/bash

echo -n "請輸入一個通用名,比如公司名稱或個人名字: "
read NAME

openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME PK/" -keyout PK.key \
        -out PK.crt -days 3650 -nodes -sha256
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME KEK/" -keyout KEK.key \
        -out KEK.crt -days 3650 -nodes -sha256
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME DB/" -keyout DB.key \
        -out DB.crt -days 3650 -nodes -sha256
openssl x509 -in PK.crt -out PK.cer -outform DER
openssl x509 -in KEK.crt -out KEK.cer -outform DER
openssl x509 -in DB.crt -out DB.cer -outform DER

GUID=`python -c 'import uuid; print(str(uuid.uuid1()))'`
echo $GUID > myGUID.txt

cert-to-efi-sig-list -g $GUID PK.crt PK.esl
cert-to-efi-sig-list -g $GUID KEK.crt KEK.esl
cert-to-efi-sig-list -g $GUID DB.crt DB.esl
rm -f noPK.esl
touch noPK.esl

sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
                  -k PK.key -c PK.crt PK PK.esl PK.auth
sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
                  -k PK.key -c PK.crt PK noPK.esl noPK.auth
sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
                  -k PK.key -c PK.crt KEK KEK.esl KEK.auth
sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
                  -k KEK.key -c KEK.crt db DB.esl DB.auth

chmod 0600 *.key

echo ""
echo ""
echo "For use with KeyTool, copy the *.auth and *.esl files to a FAT USB"
echo "flash drive or to your EFI System Partition (ESP)."
echo "For use with most UEFIs' built-in key managers, copy the *.cer files."
echo ""

參考文章

UEFI SecureBoot on Debian
Protecting the pre-OS environment with UEFI

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容