Chapter 04
Root of Trust — 「信じるしかないもの」を最小にする
この章がなぜ必要なのか——ここが全体の土台だから.
セキュリティの議論は、突き詰めると「なぜそれを信じられるのか」の連鎖になる。
「このファームウェアは正規品だ」→ なぜ? →「署名を検証したから」 → その検証コードは正しいのか? →「それも署名を検証したから」 → …この連鎖はどこで止まるのか?
どこかで「これは無条件に信じる」と決めなければならない。 それが Root of Trust(信頼の基点)である。
1. 定義と性質
Root of Trust とは、 「検証できないので、無条件に信じるしかないもの」である。
だからこそ、次の 2 つの性質が必要になる。
| 性質 | 理由 |
|---|---|
| 改変できないこと (immutable) | 書き換えられたら、その上の全部が崩れる |
| できるだけ小さいこと (minimal) | 検証できない部分は、小さければ小さいほどよい |
「小さいこと」が特に重要である。 検証できないものが大きいほど、そこにバグがある確率が上がり、 バグがあってもそれを検出する手段がない。
RoT の実体は、ふつう次の 3 つの組み合わせである.
要素 実体 なぜ改変できないか 不変のコード ブート ROM(マスク ROM) シリコンに焼かれている。物理的に書き換えられない 不変の鍵 OTP / eFuse に焼いた公開鍵のハッシュ 一度書いたら消せない(06 章) 不変のハードウェア 暗号エンジン、乱数生成器 回路そのもの
RoT の階層を見る
各層をクリックすると、その層が何を信じ、何を保証し、どこが弱点かが表示される。
2. 4 つの Root of Trust
RoT は 1 つではない。役割ごとに分けて考えるのが標準的である。
| RoT | 役割 | 実体の例 |
|---|---|---|
| RTM — Root of Trust for Measurement | 起動時のコードを測定(ハッシュ)する | ブート ROM の最初のコード |
| RTV — Root of Trust for Verification | 署名を検証する | ブート ROM の検証コード + OTP の公開鍵ハッシュ |
| RTS — Root of Trust for Storage | 鍵やデータを安全に保管する | OTP、鍵ラッピング機構、PUF |
| RTR — Root of Trust for Reporting | 状態を外部に証明する(アテステーション) | 機器固有鍵で署名する機構、TPM の PCR(測定値の記録レジスタ、05 章) |
実装では、これらが 1 つの「セキュリティサブシステム」にまとまっていることが多い。
| ベンダ | 名前 | 章 |
|---|---|---|
| Arm | PSA-RoT(TF-M が参照実装) | 17 |
| STMicroelectronics | RSS(Root Security Services)/iRoT・uRoT | 18 |
| NXP | EdgeLock secure enclave、ROM の HAB/AHAB | 19 |
| Espressif | ブート ROM + eFuse | 20 |
| Silicon Labs | Secure Element (HSE/VSE) サブシステム | 21 |
| Renesas | RSIP / SCE(Secure Crypto Engine) | 21 |
| Infineon | PSoC 64 のセキュアプロセッサ、OPTIGA | 21 |
3. Immutable RoT と Updatable RoT
「改変できない」ことは強みだが、弱みでもある。
ブート ROM にバグがあったら、直せない。
これは理論上の話ではない。実際に、複数のベンダのブート ROM に 脆弱性が見つかり、シリコンの改版でしか直せなかった事例がある。
そこで多くの設計では、RoT を 2 段に分ける。
| Immutable RoT | Updatable RoT | |
|---|---|---|
| 置き場所 | ブート ROM(マスク ROM) | フラッシュ |
| 大きさ | 数 KB | 数十〜数百 KB |
| バグの修正 | 不可能 | OTA で可能 |
| 暗号アジリティ | なし | あり |
| 検証する相手 | Updatable RoT | アプリケーション |
この 2 段構成が、01 章で述べた「暗号アジリティ」への答えである.
Immutable RoT が使う署名アルゴリズムは変えられない。 だが、Updatable RoT が使うアルゴリズムは後から変えられる。
だから 20 年使う機器でも、耐量子暗号への移行が(少なくとも部分的には)できる。 Immutable RoT の検証アルゴリズムだけは、慎重に選ぶ必要がある。
4. 鍵の階層
RoT には鍵が必要である。だが使う鍵を 1 本ずつ OTP に保存するわけにはいかない (OTP は数百バイト〜数 KB しかない)。
そこで鍵を階層化する。根になる 1 本だけをハードウェアに持たせ、 それ以外は必要になるたびに導出する。
- 根になる鍵を HUK(Hardware Unique Key) と呼ぶ。機器ごとに異なる秘密で、CPU からは読めない
- HUK の実体は品種によって 2 通りある。製造時に乱数を OTP に焼き込むか、 PUF(06 章)から起動のたびに再生成するか。どちらでも以降の使い方は同じである
- 使う鍵(ストレージ暗号鍵、アプリごとの鍵など)は、HUK を KDF(鍵導出関数) に 通して導出する。保存しないので、HUK が読めない限り再現できない
重要な区別: 秘密鍵と公開鍵ハッシュ
署名検証の根になる公開鍵を ROTPK(Root of Trust Public Key) と呼ぶ。 OTP に入れるのは公開鍵そのものではなく、そのハッシュである。
| 用途 | OTP に何を入れるか | 大きさ | 漏洩したら |
|---|---|---|---|
| 署名検証 | ROTPK のハッシュ(SHA-256) | 32 バイト | 問題なし(公開情報) |
| 機器固有の秘密 | HUK / DevID の秘密鍵 | 16〜32 バイト | その機器が破られる |
公開鍵そのものではなく、ハッシュを焼くのはなぜか.
RSA-3072 の公開鍵は 384 バイト、ECC P-256 でも 64 バイト。 OTP は貴重な資源なので、32 バイトのハッシュだけを焼き、 公開鍵本体はファームウェアイメージに添付する。
検証時は「添付された公開鍵をハッシュして、OTP の値と一致するか」を確認してから使う。 これで OTP の消費を 1/2〜1/12 に減らせる。
鍵の階層を組み立てる
鍵の役割を選ぶと、どこに保管し、どう派生させ、漏れたらどうなるかが表示される。
5. アテステーション(証明)
RTR(Root of Trust for Reporting)の役割である。
アテステーションとは、 「私はこういう機器で、こういうソフトウェアが動いている」を、 暗号学的に証明することである。
この証明の署名に使う機器固有の鍵を IAK(Initial Attestation Key) と呼ぶ (前節の鍵の階層図に出てきたのはこれである)。
| 用途 | 内容 |
|---|---|
| クラウド接続時の健全性確認 | 改ざんされた機器を接続させない |
| ゼロトラストの実現 | 「ネットワークにいる」だけでは信用しない |
| OTA の前提確認 | 更新前に、機器の状態を確認する |
| 保守・保証 | 「改造されていない」ことの証明 |
標準化されている形式:
| 標準 | 内容 |
|---|---|
| PSA Attestation Token | Arm PSA。CBOR/COSE 形式のトークン(17 章) |
| IETF EAT (Entity Attestation Token) | RFC 9711。汎用のアテステーショントークン形式 |
| TCG DICE | Device Identifier Composition Engine。層ごとに鍵を派生させる方式 |
| TPM Quote | TPM の PCR 値に署名したもの(22 章) |
DICE — 小さな機器向けの巧い方式
TPM を積めない機器向けに、TCG が定めた軽量な方式である。
DICE の美点は、「鍵がコードに縛られる」ことである.
ファームウェアを 1 ビットでも書き換えると、ハッシュが変わり、 派生される鍵が変わる。すると——
- 暗号化していたデータが復号できなくなる
- サーバが期待する公開鍵と一致しなくなる
改ざんを「検出する」のではなく、「改ざんすると使えなくなる」構造にしている。 検証コードのバグで見逃す、ということが起きない。非常にエレガントである。
加えて、UDS を読めるのは第 1 段の ROM だけにして、 CDI を計算したら UDS へのアクセスをハードウェアでロックする(ラッチする)。 こうすると、後段のコードに脆弱性があっても UDS は漏れない。
6. RoT が守れないもの
RoT は万能ではない。限界を正しく理解しておく必要がある。
| 守れないもの | 理由 | 対策 |
|---|---|---|
| 起動後の脆弱性 | セキュアブートは「起動時」しか検証しない | ランタイム保護、MPU、分離(07 章・15 章) |
| 物理攻撃 | OTP の値も、条件次第で読める/書ける | 耐タンパ設計、セキュアエレメント(09 章・10 章・22 章) |
| サプライチェーンの汚染 | 工場で不正なコードが署名されたら検出できない | 署名鍵の管理、プロビジョニング設計(12 章) |
| 設計上の欠陥 | 「正規に署名された脆弱なファームウェア」は通る | 脆弱性管理、SBOM(15 章) |
| 秘密鍵の流出 | 署名鍵が漏れたら、攻撃者が正規の署名を作れる | HSM での鍵管理、鍵の失効機構 |
最後の 2 つが本質的に重い.
「セキュアブートは、正しく署名されたファームウェアなら、 脆弱でも喜んで起動する。」
セキュアブートが守るのは完全性(正規のものか)であって、 安全性(脆弱でないか)ではない。この 2 つは別物である。
7. 「Time of Check to Time of Use」問題
セキュアブートには構造的な弱点がある。
t1 と t2 の間に、内容が変わっていたら?
| 状況 | リスク |
|---|---|
| フラッシュから RAM にコピーしてから実行 | コピー中に外部から書き換えられうる |
| 外部フラッシュから XIP(直接実行) | 実行中ずっと、外部バスが露出している |
| DMA が動いている | 検証済み領域を DMA で上書きできる |
対策:
| 対策 | 内容 | 章 |
|---|---|---|
| 検証後にメモリを保護 | 検証したら、その領域を書き込み禁止にする | 07 |
| オンザフライ認証 | 実行中も、キャッシュライン単位で完全性を確認する | 06, 18, 19 |
| 内部フラッシュを使う | 外部バスをなくす。最も確実 | — |
| DMA を制限する | セキュア領域への DMA アクセスを禁止する | 07 |
外付けフラッシュの XIP は、構造的に難しい.
だから多くの SoC が OTFDEC / PRINCE / BEE / Flash Encryption といった「オンザフライ暗号/復号」機構を持っている(18 章〜20 章)。
ただし——暗号化は機密性を守るが、完全性は守らない。 攻撃者は内容を読めなくても、ランダムに書き換えて動作を狂わせることはできる。 完全性まで守るには、認証付き暗号(AES-GCM など)か MAC が必要になる。 ここに対応しているかどうかは、SoC によって差が大きい。
8. この章のまとめ
| ポイント | 内容 |
|---|---|
| RoT の定義 | 検証できないので、無条件に信じるしかないもの |
| 必要な性質 | 改変できないこと、できるだけ小さいこと |
| 4 つの RoT | 測定 (RTM)・検証 (RTV)・保管 (RTS)・報告 (RTR) |
| 2 段構成 | Immutable RoT(ROM・小)+ Updatable RoT(フラッシュ・更新可) |
| 暗号アジリティ | Updatable RoT があることで、アルゴリズムを後から変えられる |
| 鍵の階層 | HUK から KDF で派生。OTP には公開鍵のハッシュ(32 B)だけ焼く |
| DICE | 鍵をコードのハッシュに縛る。改ざんすると鍵が変わって使えなくなる |
| RoT の限界 | 正規に署名された脆弱なファームウェアは通る。完全性 ≠ 安全性 |
| TOCTOU | 検証時と実行時のずれ。外付けフラッシュの XIP が特に難しい |
次章では、この RoT から始まる検証の連鎖—— セキュアブートの実際を見る。