セキュアブートと信頼の連鎖(UEFI・署名検証)
ブートキットがOSより先に居座る攻撃を、なぜUEFI Secure Bootが防げるのか。PK・KEK・db・dbxの鍵階層と各段の署名検証を原理から押さえれば、起動失敗の切り分けとブート段階の脅威評価ができるようになる。
- 1.Secure Boot は PK→KEK→db/dbx の鍵階層で署名を検証する。PK が KEK の更新を、KEK が db/dbx の更新を承認し、db の鍵で署名されたブートローダだけが起動を許可される。
- 2.信頼の連鎖は UEFI ファームウェア→shim→bootloader→カーネルと段ごとに次段の署名を検証して伸びる。一段でも未署名・無効署名・dbx 登録済みハッシュなら、そこで連鎖が切れて起動が止まる。
- 3.Secure Boot は「不正コードの起動を阻止」する強制機構、Measured Boot(TPM の PCR 拡張)は「起動した全コードを測定して証跡を残す」検知機構で、目的が異なり併用される。
なぜ「起動の最初」を守る必要があるのか
OS が起動する前のコードを乗っ取る攻撃を**ブートキット(bootkit)**と呼びます。ブートローダやカーネルが読み込まれる前に常駐すれば、後から立ち上がる OS のセキュリティ機構(アンチウイルス、コード署名検証、ディスク暗号化)をすべて下から無力化できます。「最初に動くものが最も強い」のがブートの世界の鉄則です。
そこで UEFI Secure Boot は、電源投入直後から OS カーネルまで、各段が次段の正当性を署名で確かめてから制御を渡すという「信頼の連鎖(chain of trust)」を構築します。連鎖の起点(信頼の根、root of trust)はファームウェア内の改ざん困難な領域に焼かれた検証ロジックと鍵で、ここから一段ずつ信頼を伝播させます。
PK / KEK / db / dbx:四つの鍵データベースの役割
Secure Boot の中核は、ファームウェアの不揮発メモリ(NVRAM)に保持される四つの署名データベースです。これらは単なる鍵の置き場ではなく、「誰が誰の更新を承認できるか」という階層的な権限構造をなします。
| 変数 | 正式名 | 役割 | 更新を承認する鍵 |
|---|---|---|---|
| PK | Platform Key | プラットフォーム所有者の唯一の鍵。Secure Boot 全体の最上位アンカー | PK 自身(自己署名で更新) |
| KEK | Key Exchange Key | db/dbx を更新する権限を持つ中間鍵(OS ベンダ等) | PK |
| db | Signature Database | 起動を許可する署名鍵・証明書・ハッシュの許可リスト | KEK |
| dbx | Forbidden Signatures DB | 起動を禁止する署名・ハッシュの拒否リスト(失効用) | KEK |
検証時の優先順位が重要です。あるブートイメージに対し、ファームウェアはまず dbx を先に確認します。dbx に一致(証明書・署名・イメージのハッシュのいずれか)があれば、たとえ db で許可されていても即座に拒否します。dbx は db に優先する拒否リストであり、これが「いったん許可した鍵やイメージを後から失効させる」唯一の手段です。脆弱性が見つかったブートローダのハッシュを dbx へ追加することで、世界中の端末でその版の起動を止められます。
PK が未設定の状態を「Setup Mode」と呼び、このとき各データベースは認証なしで書き換えられます。PK を書き込むと「User Mode」に遷移し、以後すべての更新は上位鍵による署名を要求されます。つまり PK の登録こそが Secure Boot を実運用状態にする操作です。db への鍵登録の信頼構造は PKI の証明書チェーンと同じ発想で、PK が自己署名ルート、KEK が中間 CA、db が末端の許可証に対応すると捉えると見通しが良くなります。
各ブート段階での署名検証フロー
電源投入から OS までの連鎖を順に追います。各段は「次に実行するコードの署名を db で検証し、合格したものにのみ制御を渡す」を繰り返します。
[1] SEC/PEI(ファームウェア初期段) ... 信頼の根。ハードウェアで保護
| (内部完全性は Boot Guard 等が担保)
[2] DXE / BDS(ブートデバイス選択) ... db/dbx を読み込み検証器を起動
| 検証: EFI ブートローダの署名を db と照合、dbx を確認
[3] ブートローダ(shim / GRUB / bootmgfw)
| 検証: 次段(GRUB やカーネル)の署名を確認
[4] OS カーネル
| 検証: カーネルモジュール・ドライバの署名を確認
[5] ユーザー空間
検証アルゴリズムの実体は、EFI 実行ファイル(PE/COFF 形式)に埋め込まれた Authenticode 署名の確認です。手順は (1) イメージの所定領域を除いてハッシュを計算、(2) 署名に付随する証明書チェーンを db のルートまでたどって検証、(3) 署名されたハッシュと実測ハッシュの一致を確認、です。署名検証の数学的な中身(RSA-PSS や ECDSA の検証式)は デジタル署名スキーム を参照してください。連鎖の各段が「上位の鍵で署名されたものだけを信頼する」点は、X.509 チェーン検証 のパス検証と本質的に同じ構造です。
shim:Microsoft の鍵と Linux の現実の橋渡し
ここで実務上の難所が現れます。ほとんどの PC のファームウェアの db には、Microsoft の鍵だけが初期登録されています(Microsoft UEFI CA)。Linux ディストリビュータが自分の鍵を全端末の db に入れるのは非現実的です。
この溝を埋めるのが shim です。shim は Microsoft によって署名された小さな第一段ローダで、db の検証を通過できます。shim 自身は二つ目の鍵ストア、**MOK(Machine Owner Key)**を持ち、ディストリビュータの鍵やユーザー独自の鍵を MOK に登録できます。
- 起動すると shim が読み込まれ、ファームウェアは shim を **db(Microsoft 鍵)**で検証して実行する。
- shim は次段(GRUB やカーネル)を、まず db、次に自前の MOKで検証する。db に無くても MOK にあれば通す。
- MOK の追加は再起動時の MokManager で物理操作(パスワード確認)を要求し、リモートからの勝手な鍵追加を防ぐ。
この設計により、ファームウェアの db を一切変更せずに、Microsoft 署名という単一の入口から各ディストリの信頼を分岐させられます。サプライチェーン攻撃の観点では、shim という単一の信頼点が侵害されると影響が広範になるため、shim 自体の脆弱性(過去に GRUB のパーサ経由で署名検証を回避する欠陥が複数報告された)は dbx 更新で迅速に失効させる対象になります。
近年のブートキット(例: BlackLotus)は Secure Boot を正面突破するのではなく、署名済みだが脆弱な正規コンポーネント(古い shim や bootloader、Windows の baton drop 脆弱性)を持ち込んで悪用しました。署名は正しいので db は通過し、その内部の検証バグで連鎖を乗っ取ります。だから防御は「dbx への迅速な失効登録」と、起動コードの確実な更新の両輪になります。署名機構があっても、署名済みコードの中の脆弱性は別問題だという点が要諦です。
Secure Boot と Measured Boot は目的が違う
混同されやすいのが Secure Boot と Measured Boot です。両者は補完関係にあり、片方が他方を代替しません。
| 観点 | Secure Boot | Measured Boot |
|---|---|---|
| 目的 | 不正なコードの起動を阻止(強制) | 起動した全コードを記録(検知) |
| 判断 | 署名が無効ならその場で停止 | 止めない。測定値を残すだけ |
| 仕組み | db/dbx と署名検証 | TPM の PCR にハッシュを拡張 |
| 検出対象 | 未署名・失効済みコード | 正規署名でも構成変化を捕捉 |
Measured Boot は各段が「次に実行するコードのハッシュ」を計算し、TPM の **PCR(Platform Configuration Register)**へ書き込みます。書き込みは上書きではなく **PCR 拡張(extend)**で、PCR_new = Hash(PCR_old || 測定値) という連鎖計算です。一度どこかの段で異なるコードが測定されれば、以降の PCR 値はすべて変わり、後から辻褄を合わせることができません。これは ハッシュの連結構造 と同じ一方向性に支えられています。
最終的な PCR 値は Remote Attestation(遠隔証明) に使えます。端末は TPM が署名した PCR 値(Quote)を検証サーバーへ送り、サーバーは期待値と照合して「正しい構成で起動したか」を判定します。Secure Boot が「その場で起動を止める」のに対し、Measured Boot は「起動は許すが証跡を残し、後で正当性を問える」点が決定的に異なります。なお、ディスク暗号化鍵を特定の PCR 値に**封印(seal)**しておけば、改ざんで PCR がずれた場合に鍵が解放されず、データを保護できます(TPM ベースの BitLocker / LUKS が典型)。
鍵階層は「PK が頂点、PK が KEK を、KEK が db/dbx を承認」と階層順で答えられること。検証順序は「dbx(拒否)が db(許可)に優先」が頻出です。shim は「Microsoft 署名で db を通り、MOK で各ディストリへ信頼を分岐」。Secure Boot(強制・阻止)と Measured Boot(測定・PCR・遠隔証明)の違い、PCR は extend で連鎖し改ざん不能、の三点が核心です。
まとめ
UEFI Secure Boot は PK→KEK→db/dbx の鍵階層を信頼の根とし、ブートの各段が次段の Authenticode 署名を db で検証して制御を渡す「信頼の連鎖」です。dbx は db に優先する拒否リストで、脆弱なブートコードを事後に失効させる唯一の手段になります。db に Microsoft 鍵しかない現実を埋めるのが shim と MOK で、単一の署名入口から各ディストリへ信頼を分岐させます。
ブートキットの多くは署名検証を破るのではなく、署名済みコードの脆弱性を突くため、防御は dbx 更新と確実な更新運用の両輪です。Secure Boot が「起動を阻止する強制機構」なのに対し、Measured Boot は TPM の PCR へ測定値を拡張して「起動構成を記録し遠隔証明できる検知機構」であり、目的が異なるため併用されます。信頼の根からの連鎖という発想は PKI や X.509 チェーン検証 と一本でつながります。
セキュリティ Article
セキュアブートと信頼の連鎖(UEFI・署名検証)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
セキュアブート
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 6
導入後に効く点
信頼の連鎖は UEFI ファームウェア→shim→bootloader→カーネルと段ごとに次段の署名を検証して伸びる。一段でも未署名・無効署名・dbx 登録済みハッシュなら、そこで連鎖が切れて起動が止まる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 6
判断チェックリスト
- 自社の用途が「セキュアブート / UEFI」に近いか確認する。
- 強みである「Secure Boot は PK→KEK→db/dbx の鍵階層で署名を検証する。PK が KEK の更新を、KEK が db/dbx の更新を承認し、db の鍵で署名されたブートローダだけが起動を許可される。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。