[工控資安]嵌入式設備的基本應用--TPM 2.0

小豪隨筆
8 min readNov 2, 2022

--

前言

Tursted Platform Module (簡稱:TPM)是在PC中專門處理加密金鑰的模組,我們可以理解TPM為一個處理安全加密的處理器。 區別於軟體的加密機制,TPM晶片直接內嵌在PC的主機板上,提供BIOS、Kernel、甚至是User Space的保護。除此之外,在微軟新出的Windows 11還規定用戶必須搭載 TPM 2.0 晶片,由此可知它的重要性以及未來性。

功能

我們看下圖TPM所提供的功能,包括加密的亂數產生器、以及加密演算法(RSA與SHA-1,TPM2.0更支援了ECC與AES)之外,還提供儲存密鑰的功能。

圖片來源:OWASP<Trusted Computing>

對使用者來說,有了TPM晶片,我們就防止磁碟錯誤或 BIOS 被惡意修改所帶來的資訊安全的危機,即使破壞PC硬體本身,也無法讀取磁碟上的檔案。

Hash function

大多數CS的學生都熟悉hash function,hash function在資料庫領域中可以讓我們加快搜索速度。 因為hash function有將擁有將意長度的消息壓縮為固定長度的序列的功能, 例如,SHA-256 hash值為 256 位或 32 字節。其中,hash function需要符合這兩項規則:

  1. 給定一message的hash值,不可能找到另一message擁有相同的hash值
  2. 在給定hash值的情況下,是不可能反推出message的。

舉例:”Hello”與”hello”的hash值:

"Hello" → "fedd18797811a4af659678ea5db618f8dc91480b"
"hello" → "aa5916ae7fd159a18b1b72ea905c757207e26689"

在TPM中的PCR暫存器則是用來存這hash值的。

PCR暫存器

在一開始的TPM1.0中規範了十六個PCR暫存器(功能如下圖所示),每個PCR(program control register)只能至多存20個字節。

UEFI Shell Dump

為了防止PCR中的值被篡改,TPM對每個新的PCR與之前的PCR值一起拿去進行SHA-1演算,由BIOS Code(PCR 0)開始,再來由PCR 0+PCR 1加密的hash存在PCR 1(步驟如下)…以此類推,我們稱這樣的機制為chain of trust:

  1. Start with an existing value, A.

2. Concatenate another value, B (the value to be extended) to it, creating the message, A || B.

3. Hash the resulting message to create a new hash, hash(A || B).

4. This new hash replaces the original value, A.

但是!!!TPM1.0 Chain of Trust的機制對於管理來說是一個惡夢,你可以想像身為使用者你只是想要改BIOS,可能需要解鎖15層密碼才可以更改嗎?因此,TPM2.0放棄了Chain of Trust這樣的機制,改為當有新的值更改時,將舊的PCR中存放的值一起HASH。

PCR[N] = HASH( PCR[N] || ArgumentOfExtend )

HMAC和KDF

但也因為同個message算出來的hash結果都一樣,所以攻擊方可以窮舉來將hash推算出來。因此TPM又使用HMAC,加入多個隨機值下去算hash。

function(password) -> key
HMAC(key, msg, hash_func) -> hash

下表顯示了現在TPM2.0所提供的加密演算法:

快速密鑰

在TPM 2.0 中,對於密鑰的生成、密鑰複製有了結構上的修改。TPM 2.0使用外部存儲器存儲的密鑰使用對稱密鑰操作進行加密。讓密鑰被快速加載。

在TPM2.0的密鑰樹中,只要儲存密鑰我們就可以稱之為parent,並且將密鑰對象分成可複製的對象、可跟隨parent複製密鑰的對象,以及不可複製密鑰的對象(fixedTPM, fixedParent, encryptedDuplication)。如上圖,我們可以發現SR1(parent)跟隨了三個複製密鑰的子代(children),TPM2.0也使用了對稱式加密來保證父子間的複製的安全。

又如上圖,我們可以發現SR2(parent)為儲存密鑰的parent又跟隨了三個複製密鑰的子代,他使用了與SR1不同的對稱加密方式來保證子代的安全。因此有這樣的密鑰樹,我們幾乎不用將密鑰緩存到TPM的內部磁盤(除非父密鑰變得不可用),反過來又可以更輕鬆地設計一個系統,在該系統上,多個應用程序似乎可以不受限制地訪問 TPM。

應用

有了TPM這樣類似於在電腦中的PKI機制,我們便可以實現硬體間數位簽章的功能。並且一定程度上保證了硬體的運算安全與可信任。

TPM2.0可以提供的功能也包括:

設備識別:在 TPM 規範發布之前,設備主要通過 MAC 地址或 IP 地址來識別,而不是安全標識符。

密鑰的安全生成:擁有硬件隨機數生成器是創建密鑰時的一大優勢。 由於密鑰生成不佳,許多安全解決方案已被破壞。

密鑰的安全存儲:保持良好密鑰的安全,尤其是從軟件攻擊,是 TPM 設計帶來的一大優勢一個裝置。

NVRAM 存儲:當 IT 組織獲得新設備時,它通常會擦除硬盤並使用組織的標準負載重寫磁盤。 擁有 NVRAM 允許 TPM 維護證書存儲。

設備運行狀況證明:在具有 TPM 的系統之前,IT 組織使用軟件來證明系統運行狀況。 但是,如果一個系統受到損害,它可能會報告它是健康的,即使它不是。

開發

以下是TPM的Software Stack,由下到上有TCTI,SAPI,ESAPI與FAPI

FAPI — 功能 API
FAPI 層位於 ESAPI 層之上。 FAPI 提供了一個高級接口,包括策略定義語言和密鑰庫。用戶可能希望在不了解底層系統的情況下創建密鑰。這可以通過使用 API 的 FAPI 層來實現。

SAPI — 系統 API
系統 API 是整個 TSS 架構的一層,它提供對 TPM 2.0 實現的所有功能的訪問。它設計用於對 TPM 功能進行低級別調用的任何地方:固件、BIOS、應用程序、操作系統等。

ESAPI — 擴展系統 API
這層提供了增強的上下文管理和加密操作。儘管 ESAPI 提供了一種更簡單的方式來使用 TPM,但使用 API 的 ESAPI 層仍然需要深入了解 TPM 的內部工作原理。

TCTI — TPM 命令傳輸接口
TCTI 是一個 IPC 抽象層,用於向 TPM 或 TAB/RM 發送命令並從其接收響應。這在 SAPI 和較低的硬件層之間提供了多個接口,具體取決於所使用的 TPM 類型。

其中tpm2-tss ( Trusted Software Stack )是一個系統實用程序,允許從操作系統和其他程序訪問 TPM。 該庫包含從 FAPI 到 TCTI 的所有層的實現

結論

隨著TPM1、TPM1.2到TPM2.0的進展,使用者對於系統安全的需求增高(防犯Bookit RootKit攻擊)。TPM提供了我們系統化的解決方式,包括微軟、IBM及Intel的不斷推動,我們可見TPM的發展前景多麼可觀。

--

--