# 硬體信任根(HRoT) > 資料來源:[PUFsecurity Corp. Hardware Security Theory and Practices 課程](https://www.youtube.com/watch?v=JspYigs4fqM&list=PLDNrc1OLJC_WGd5nxmkOl_TYV4Jom_mCc&index=1)。 ## Hardware Root-of-Trust ### 硬體資安 ![圖片](https://hackmd.io/_uploads/BJQNuhv0R.png =80%x) 舉例-Side-Channel Attack Using Power Analysis: ![圖片](https://hackmd.io/_uploads/r1lcunD0R.png =90%x) 為何需要硬體資安,有不同面向: - 硬體的實現比軟體還有效率。 - 針對硬體的攻擊防護。 - 需要一個我們「真正可以信任的元件」。 - 物理上的隨機性。 ### RoT(Root-of-Trust) ![圖片](https://hackmd.io/_uploads/Skg5jYhv0R.png =80%x) ### Unpredictability 如圖: ![圖片](https://hackmd.io/_uploads/BkhLj2DCC.png =80%x) 今天 Alice 要產生一把 key $K_A$ 來作加解密運算;Eve 則是想要預測該 key。 則我們會希望 Eve 猜測得到 $K_A$ 的機率越小越好。 透過 **entropy** 來量化 Unpredictability。 如公式 Min-entropy $H_\infty = -log_2(max(Pr(K_A=k)))$ 。 > 與 $K_A$ 最容易出現的值有關。 舉例 Min-entropy 的計算如下: ![圖片](https://hackmd.io/_uploads/HkCg33vCA.png =80%x) Full-entropy 意味著「越難被預測」。 故我們會想讓 key 具有 full-entropy 的特性。 ### Entropy ![圖片](https://hackmd.io/_uploads/HJE9hhvRA.png =80%x) 我們不應該用任何演算法來產生 entropy,因其皆是「決定性的」。 True Randomness 應來自於「物理的機制 / 源頭」。 如下圖之晶片上的 Entropy Sources 舉例: ![圖片](https://hackmd.io/_uploads/HkXZ03w00.png =80%x) - Dynamic Entropy:會隨時間變化。通常拿來用作 True random number generators。 - Static Entropy:固定,只跟隨設備的不同。用作 **Physically unclonable functions**。 :::info 小總結: RoT 需具有 Unpredictability(Full-entropy)及 Physical security 兩種特性。 ::: ### Why PUF? ![圖片](https://hackmd.io/_uploads/Hk3MkawA0.png =80%x) PUF 能同時提供「True randomness」和「Physical security」,實現真正的**硬體信任根**。 ## Physically Unclonable Functions ### PUF 定義 PUF 是具有下列特性的「電路」: - Physical unclonability - Evaluability - Uniqueness - Reliability 若具有如上特性,則該電路就能當作 PUF 來使用。 > 此時,PUF 就類似該晶片的「指紋」。 ### Bad: Key 儲存在 NVM ![圖片](https://hackmd.io/_uploads/r1TQrAD0R.png =80%x) 如果將 Key 儲存在 NVM(Non-volatile Memory),會有如下缺點: - Reverse engineering 的威脅。 - 更高的製造成本(因需要額外的電路設計,來保障 NVM 的安全性)。 ### Better: PUF ![圖片](https://hackmd.io/_uploads/ryIkIy_RA.png =80%x) > 每個晶片都產生一把自己的 Key。 需要使用 Key 時,再透過 PUF 生產即可,故 PUF 需要是「唯一 / 獨特」的。 有個優點就是,若某晶片的 PUF 不幸被盜取,其他晶片也不會有危險。 而 PUF 可經由「Device Variations」產生: ![圖片](https://hackmd.io/_uploads/ry9ewyOC0.png =80%x) 如上圖 Chip1 / Chip2,由於每顆電晶體都有其不同的 Threshold Voltage,組合起來之後,使不同的晶片有各自獨特的 Pattern,可當作「chip-ID」來看待。 ### Circuit Implementation & Applications ![圖片](https://hackmd.io/_uploads/r1LTu1uC0.png =80%x) - 電路變異:SRAM / 震盪器 / 電路 Delay / ....(不同製程工藝有不同產生方式)。 - 應用:產生 Key / 設備認證 / 防衛機制 / 保護 IP / ...。 ### Two Main Design Methodologies ![圖片](https://hackmd.io/_uploads/BkWKKkuRR.png =80%x) - **Strong PUF**:Response 呈指數成長。 - **Weak PUF**:Response 呈線性成長。 ## PUF Properties ![圖片](https://hackmd.io/_uploads/Skpw51O00.png =70%x) ### Reliability 事實上,PUF 每次回應時,都可能因「不同時間」或「不同環境」,而產生不同結果。 測量 Reliability: ![圖片](https://hackmd.io/_uploads/HkW_j1uR0.png =80%x) - Short-term errors:短期使用 PUF 時,其回應「錯誤位元值」的機率,可使用 Bit Error Rate 作為指標量測。 - Long-term errors:使 PUF 運作好幾年,產生的「0->1 / 1->0 位元錯誤」的情況。需使用 Accelerated reliability tests 去加速測量。 故「High Reliability」的指標,即 PUF **沒有 Short-term errors 及 Long-term errors**。 ### Uniqueness ![圖片](https://hackmd.io/_uploads/By3-TkOAC.png =70%x) 如圖,Uniqueness 的定義即「兩同製程晶片的 response 有多不一樣」。 測量 Uniqueness: ![圖片](https://hackmd.io/_uploads/S1Jw0J_0R.png =50%x) 如上圖,主要測量兩 responses 的 Hamming distance。 - Hamming distance:HD(r1, r2)。 - Fractional-HD:HD(r1, r2) / n。 > n = #bits - 理想情況:Hamming distance **越接近預期的 Binomial distribution**,則 Uniqueness 越高。 > ![圖片](https://hackmd.io/_uploads/HJYSygOR0.png =30%x) ### Randomness ![圖片](https://hackmd.io/_uploads/B1vMxgO0R.png =80%x) 需透過「統計測試」,現已開發出許多不同方法。 ### Physical Unclonability 攻擊者無法產生類似的 PUF 出來。 ### Mathematical Unclonability 攻擊者大量讀取我們的 PUF 資料,並透過 Machine Learning 等方式,產生類似的 PUF responses。 ### Resistance Against Reverse Engineering 值得注意的是,weak PUF 由於不會產生大量的 responses,故較容易遭大量讀取並 modelling 出相似 PUF。因應此,其設計時通常不會有 External access。 但攻擊者仍可透過「切開晶片,以顯微鏡觀察」等逆向工程,重塑 PUF 出來。 故若某 PUF「不會遭攻擊者透過物理方式掃描出 PUF 資料」的話,其較安全。 ### Resistance Against Tampering ![圖片](https://hackmd.io/_uploads/rJ9hQxuAR.png =80%x) - Resistance:攻擊者無法竄改 PUF。 - Evidence:攻擊者可以竄改 PUF,但會跟原 PUF 相差很多。 ## PUF Implementations ### Aribiter PUF 如下圖,主要基於 Timing 的差異: ![圖片](https://hackmd.io/_uploads/Bkwwvg_0R.png =70%x) - **Strong PUF**:n-bit challenge 後,會產生 $2^n$ responses。 - 中間元件的實作:2 個 Multiplexer。 - Arbiter 實作:1 個 SR Latch。 Strong PUFs 主要應用場景如下圖,起初用來做 Entity Authentication: ![圖片](https://hackmd.io/_uploads/ryWTQA_RA.png =85%x) - 需要大量 Challenge-Response pairs(CRP;否則攻擊者容易複製)。 - 只有 Strong PUF 能實現。 其實,Aribiter PUF 不是一個理想的 PUF: ![圖片](https://hackmd.io/_uploads/rk7pVRdRR.png =70%x) - 若給相似的 Challenge,會得到「可預期」的相似 Response! - CRP 關聯性太高-Low entropy。 - 可受 Machine Learning 攻擊。 ### XOR Aribiter PUF ![圖片](https://hackmd.io/_uploads/SkKWUROCR.png =80%x) 可解決「易預測」問題,但仍有 **Reliability** 的問題。 ![圖片](https://hackmd.io/_uploads/BkCdUAdC0.png =70%x) BER 也會被加總起來,Reliability 會變超低! ### Ring-Oscillator (RO) PUF ![圖片](https://hackmd.io/_uploads/SyUiDRd0A.png =80%x) 然而,其 CRPs 沒有如 Arbiter PUF 那麼多,故也是個爛 Strong PUF。 :::info 2022: 還未有較信服人的 Strong PUF 實現方式。 ::: ### SRAM PUF ![圖片](https://hackmd.io/_uploads/SkZeqAuC0.png =80%x) - 6 個 transistors 的 SRAM Cell,將這些 cells 擺成 2D 陣列。 - 重要概念 **Mismatch**:於 cross-coupled inverters 之間隨機產生。 - 將 SRAM 上電之後,電路會自然因 mismatch 而產生不同 0/1 結果。 - Volatile:斷電後,PUF 資料就會消失。 Mismatch 概念如下: ![圖片](https://hackmd.io/_uploads/H1gQqAO0R.png =80%x) 問題在於,若有些 cells 的 mismatches 很小,則產生 0/1 的機率趨近於 50 %,那多次上電後,每次產生的 bit 就很常不同-**BER 高**! ### Monostable PUF ![圖片](https://hackmd.io/_uploads/SJjYnCuR0.png =30%x) - 不像 SRAM PUF 可能會 0/1,此種 PUF cell 總會有一種固定(0/1)的 stable state。 - 訊號較小的 mismatch,透過**類比放大**,來成為 0 或 1。 - 產生 PUF 時,較不受 noise 影響。 但是,當 mismatch 特別小時,類比放大後其實還是可能接近 0.5 值(Bit error),故 Reliability 仍低。 ### NAND chain based PUF ![圖片](https://hackmd.io/_uploads/HyQAh0ORR.png =50%x) 仍有 BER 高的問題。 ## PUF-based Applications ### Key Generation ![圖片](https://hackmd.io/_uploads/SJUPD1YCA.png =70%x) 用 KDF function (如 NIST 的 AES、Hash function)做出更多的 CRPs(更多 Keys);即輸入一 challenge,就能長出多把鑰匙。 而 PUF 在其中的角色,就是當作 KDF 的種子-透過有限的 Challenge,產出多樣的 Responses。 ### Secure Memory 用 static entropy 來保護記憶體。 ![圖片](https://hackmd.io/_uploads/SyUMiytA0.png) - **X-Y Scramble**:記憶體儲存時,會有 X-Y 位址(設 `a`)儲存資料,可透過 PUF 對座標作「映射」(設 `b`)的動作。則可對 `a`、`b` 作 XOR,若映射是一對一,就能儲存到不同地方(? 。 - **Shuffle**:假設資料(byte / word)要存在記憶體內,可用 static entropy 去 shuffle X-Y 和 IO 值,就會完全不知道會存到哪裡去。根據晶片不同,實體上儲存的位置都會不同。 - **Masking**:就是對資料作「隨機數混淆」。 ### Key Wrapping 金鑰注入(Key provision)的保存。 ![圖片](https://hackmd.io/_uploads/SkXuaJKRR.png =80%x) 傳統上是一對一的 efuse 儲存,不安全因 efuse 可被外界得知。 可用 PUF 去對金鑰作加密,存進來後,除非知道 PUF 確切的值,否則無法還原金鑰。 如下圖,在安全邊界外產生的金鑰,可用 PUF 對稱式加密保護後,再丟到較不安全的環境保存: ![圖片](https://hackmd.io/_uploads/ryVullY0C.png =80%x) ### Firmware Protection 用 PUF 對韌體作加密,來達到一對一的鎖定。 ![圖片](https://hackmd.io/_uploads/B1I6LlK00.png =70%x) 若攻擊者從快閃記憶體(eNVM 等)讀東西出來,除非持有韌體暗藏的金鑰(NeoPUF secrets),否則無法還原資料內容,達到智慧財產的維護。 ### Secure Boot 韌體有可能被改寫,整個產品會遭盜拷。 如下圖: ![圖片](https://hackmd.io/_uploads/SJ14c-KA0.png =50%x) 韌體能先透過 Hash 來算出 digest,並使用 PUF 產生的 $K_{pri}$ 來對該 digest 作簽章,此流程最後會保存以下兩資料: - $K_{pub}$:$K_{pri}$ 經由 ECC 或非對稱式的引擎,所計算出來的。 - Signature:由 $K_{pri}$ 對 digest 作簽章。 開機檢查動作: ![圖片](https://hackmd.io/_uploads/rJ3EsWK0C.png =50%x) - Digets_B:對該韌體作 Hash。 - Digets_A:先前存的 $K_{pub}$ 解開 Signature 所得出。 若兩者不同,表韌體遭改寫,開機動作就會停止。 ## PUF HRoT ![圖片](https://hackmd.io/_uploads/BkMLpZFA0.png =30%x) HRoT 的基本元素: - **OTP**(One-time Password) - **PUF** - **TRNG**(True Random Number Generator) ### PUFrt ![圖片](https://hackmd.io/_uploads/Sk0FCbK0C.png =80%x) - PUFuid:提供 static entropy 給 OTP 及 TRNG。 - PUFtrng:提供無窮的 dynamic entropy 來保護加密系統。 - PUFkeyst:執行「安全區域」。 :::danger 後面都針對 PUFrt 作深入介紹,有時間再回頭研究。 :::