systemd v262:NvPCR 錨定改採簽章原則
systemd 官方 Release Notes · v262 · 2026-09-22
systemd v262 重新設計了 NvPCR(Non-Volatile PCR,寄存在 TPM 非揮發記憶體裡、功能類似 PCR 的暫存器)的錨定機制,把原本依賴一把「密封密鑰」的寫入授權,換成僅能在 initrd 階段以簽章 PCR policy 完成初始化的雙分支 policy。這項改動來自 PR #42796(合併於 commit f0f368770005),已隨 v262 於 2026 年 9 月 22 日正式發布。凡是用 systemd measured boot 或以 TPM 封裝磁碟金鑰的系統,都會受到這次錨定機制重寫影響。
背景:PCR 太少,systemd 才發明 NvPCR
標準 TPM 只有 24 個 PCR,多數早被保留用途占用:PCR 0-7 給韌體與 UEFI 開機量測、PCR 16 是可重設的除錯用途因此不可信、PCR 17-22 給 DRTM(動態信任根量測)、PCR 23 給應用層。真正留給作業系統自由使用的只剩 PCR 8-15,而開機過程中有許多事件雜訊大、數值不固定,不適合直接量測進會被用來封裝磁碟金鑰的 PCR,因為封裝政策要求數值可預期。systemd 因此在 v259 引進 NvPCR,把這類雜訊事件另外量測進 TPM NV 記憶體裡模擬出的暫存器,只在遠端證明時被讀取,不直接參與封裝政策。
問題出在 NvPCR 本身要如何被信任。v259 的作法是用一把「錨定密鑰」(anchor secret)密封在 TPM 裡、存放在 ESP 磁區,任何人只要能通過該密鑰的授權就能寫入 NvPCR。PR #42796 的說明指出這把密鑰只受 PCR 11 保護,攻擊者可以開機到另一個作業系統重放預期的 PCR 11 數值取得密鑰,或者在取得一次性高權限存取後,建立一份內容已知的憑證並讓它持久存在,兩種手法都能讓 NvPCR 的量測結果永久失去可信度。
核心改動:PolicyOR 取代密封密鑰
新設計把 NvPCR 的寫入政策換成 PolicyOR 底下的兩個分支。第一個分支 PolicyNvWritten(true) 允許 NvPCR 完成初始化之後、日常執行期間不受限制地繼續延伸(extend);第二個分支 PolicyAuthorize(pcrPubKey, "nvpcr-init") 則要求出示一份對 UKI 簽章金鑰負責、綁定在 initrd 開機階段的簽章 PCR policy,且僅在 initrd 環境下才能被滿足。這個組合的效果是:只要 NvPCR 已經被正常初始化過一次,之後想要「刪掉重建」就必須重新通過 initrd 階段的簽章驗證,無法像舊設計一樣直接用一把外洩的密鑰隨時重寫。
為了讓遠端證明能偵測到重建行為,NvPCR 的名稱(依其公開屬性雜湊而得)會連同控制代號一起,以 nvpcr-init:<name>:0x<handle>:<tpm-name> 的格式量測進 PCR 9。一旦有人用較弱的政策重建同一個 NvPCR,算出的名稱就會不同,PCR 9 的量測值也隨之改變,遠端證明端可以直接看出異常。systemd 官方 release notes 另外提到,UKI 的簽章金鑰若有更動,對應的 NvPCR 會被自動重新建立。
影響範圍:measured boot 與 TPM 磁碟加密都要檢查
受影響的是所有使用 systemd-based measured boot(UKI + systemd-boot/sd-stub)、以及透過 systemd-cryptenroll 把磁碟解密金鑰封裝在 TPM PCR/NvPCR 政策下的系統。官方 release notes 明確要求:NvPCR 定義檔 /usr/lib/nvpcr/*.nvpcr 現在必須內嵌在 UKI 裡,UKI 也必須附帶一份綁定 initrd 開機階段、政策參照為 initrd 的簽章 PCR policy,否則 NvPCR 無法完成初始化。需要檢查的項目包括:
- systemd 版本是否已升級到
v262或之後 - 建置流程是否已把 NvPCR 定義檔打包進 UKI
- UKI 簽章與簽章 PCR policy 是否綁定了 initrd 階段(policy reference 為
initrd)
至於既有以 v259 舊式錨定密鑰產生的 NvPCR,升級後是否需要重新註冊(re-enroll)已封裝的磁碟金鑰,release notes 未說明;同一批更新中,systemd-tpm2-setup 也開始建立並保存 TPM Endorsement Key,PCR bank 選擇邏輯則新增支援 SHA384 與 SHA512,這些細節同樣只在 release notes 中列出,未附加操作步驟。
| 項目 | v259 舊設計 | v262 新設計 |
|---|---|---|
| 寫入授權依據 | 密封在 TPM、存於 ESP 的錨定密鑰 | PolicyOR:PolicyNvWritten(true) 或 PolicyAuthorize |
| 初始寫入時機 | 持有密鑰即可,不限時機 | 僅限 initrd 階段,需 UKI 簽章 PCR policy |
| 已知弱點 | 重放 PCR 11 竊取密鑰;高權限者可植入已知密鑰並持久化 | release notes 未說明是否仍有殘餘攻擊面 |
| 重建偵測 | 無 | NvPCR 名稱與代號量測進 PCR 9,重建會被遠端證明偵測到 |
原始來源:systemd v262 Release Notes、PR #42796:tpm2: Improve how NvPCR protection works。延伸閱讀:Understanding NvPCRs in systemd v262