IoT Security 04 · Root of Trust — 「信じるしかないもの」を最小にする

Chapter 04

Root of Trust — 「信じるしかないもの」を最小にする

この章がなぜ必要なのか——ここが全体の土台だから.

セキュリティの議論は、突き詰めると「なぜそれを信じられるのか」の連鎖になる。

「このファームウェアは正規品だ」→ なぜ? →「署名を検証したから」 → その検証コードは正しいのか? →「それも署名を検証したから」 → …この連鎖はどこで止まるのか?

どこかで「これは無条件に信じる」と決めなければならない。 それが Root of Trust(信頼の基点)である。

この章で使う既出の用語(定義は各リンク先). セキュアブート(02 章 3 節)、検証時(02 章 7 節)

1. 定義と性質

信頼の連鎖 — 1 か所でも切れると全部が無効になるROM焼き切りブートローダ署名検証済アプリ署名検証済設定・データ★ 検証されるか?各段が「次の段を検証してから渡す」。どこか 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 つの「セキュリティサブシステム」にまとまっていることが多い。

ベンダ名前章
ArmPSA-RoT(TF-M が参照実装)17
STMicroelectronicsRSS(Root Security Services)/iRoT・uRoT18
NXPEdgeLock secure enclave、ROM の HAB/AHAB19
Espressifブート ROM + eFuse20
Silicon LabsSecure Element (HSE/VSE) サブシステム21
RenesasRSIP / SCE(Secure Crypto Engine)21
InfineonPSoC 64 のセキュアプロセッサ、OPTIGA21

3. Immutable RoT と Updatable RoT

「改変できない」ことは強みだが、弱みでもある。

ブート ROM にバグがあったら、直せない。

これは理論上の話ではない。実際に、複数のベンダのブート ROM に 脆弱性が見つかり、シリコンの改版でしか直せなかった事例がある。

そこで多くの設計では、RoT を 2 段に分ける。

2 段構えの Root of Trust第 1 段:Immutable RoT(変えられない)ブート ROM に焼かれた、ごく小さな検証コード。OTP の公開鍵ハッシュを読み、次段の署名を検証するだけ。数 KB検証して起動第 2 段:Updatable RoT(更新できる)フラッシュ上の本格的なセキュリティサービス。複数アルゴリズム対応の署名検証、鍵管理、暗号サービス、アテステーション、セキュア OTA の制御。数十〜数百 KB検証して起動第 3 段:アプリケーションファームウェア焼き切り更新可
第 1 段は絶対に更新できないので、極限まで小さくする。バグがあっても直せないから
Immutable RoTUpdatable RoT
置き場所ブート ROM(マスク ROM)フラッシュ
大きさ数 KB数十〜数百 KB
バグの修正不可能OTA で可能
暗号アジリティなしあり
検証する相手Updatable RoTアプリケーション

この 2 段構成が、01 章で述べた「暗号アジリティ」への答えである.

Immutable RoT が使う署名アルゴリズムは変えられない。 だが、Updatable RoT が使うアルゴリズムは後から変えられる。

だから 20 年使う機器でも、耐量子暗号への移行が(少なくとも部分的には)できる。 Immutable RoT の検証アルゴリズムだけは、慎重に選ぶ必要がある。

4. 鍵の階層

RoT には鍵が必要である。だが使う鍵を 1 本ずつ OTP に保存するわけにはいかない (OTP は数百バイト〜数 KB しかない)。

そこで鍵を階層化する。根になる 1 本だけをハードウェアに持たせ、 それ以外は必要になるたびに導出する。

鍵の階層 — 1 個の HUK からすべてを導出するHUK の実体は品種による製造時に乱数を OTP に焼き込むまたはPUF から起動のたびに再生成するどちらでも以降は同じHUK(Hardware Unique Key)機器ごとに固有の秘密。CPU から読めないKDF(鍵導出関数)に通す派生鍵ストレージ暗号鍵フラッシュ/NVM の暗号化に使うアプリごとの鍵アプリ別・パーティション別に分けるアテステーション鍵の保護鍵証明用の鍵(IAK、次節)を包む以下は HUK の派生ではない(別系統で持つもの)ROTPK のハッシュOTP に焼く。署名検証用の公開鍵情報なので秘密ではない機器 ID(IAK / DevID)機器固有の秘密鍵と証明書(12 章)使う鍵は 1 本ずつ保存するのではなく、必要になるたびに HUK から KDF で導出するHUK さえ読めなければ派生鍵も再現できない——だから「HUK を CPU から読めなくする」ことが最優先になる
OTP か PUF かは HUK の置き場所の違いにすぎず、どちらの品種でも派生の仕組みは同じ。守るべき根は HUK の 1 点に集約される

重要な区別: 秘密鍵と公開鍵ハッシュ

署名検証の根になる公開鍵を 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) と呼ぶ (前節の鍵の階層図に出てきたのはこれである)。

リモートアテステーション — 「本当に正規のコードが動いているか」機器サーバ① 起動時に各段のコードを測定して記録する② チャレンジ(乱数)リプレイを防ぐため毎回変える③ 「チャレンジ + 測定値 + 機器 ID」を機器固有の秘密鍵で署名④ 署名を返す⑤ 証明書チェーンで署名を検証⑥ 測定値が期待値と一致するか確認一致 → 正規のファームウェアが動いていると判断してサービスを許可不一致 → 隔離・更新の強制・アラート
セキュアブートは機器の中で完結する。アテステーションは、その結果を外から確認できるようにする
用途内容
クラウド接続時の健全性確認改ざんされた機器を接続させない
ゼロトラストの実現「ネットワークにいる」だけでは信用しない
OTA の前提確認更新前に、機器の状態を確認する
保守・保証「改造されていない」ことの証明

標準化されている形式:

標準内容
PSA Attestation TokenArm PSA。CBOR/COSE 形式のトークン(17 章)
IETF EAT (Entity Attestation Token)RFC 9711。汎用のアテステーショントークン形式
TCG DICEDevice Identifier Composition Engine。層ごとに鍵を派生させる方式
TPM QuoteTPM の PCR 値に署名したもの(22 章)

DICE — 小さな機器向けの巧い方式

TPM を積めない機器向けに、TCG が定めた軽量な方式である。

DICE — コードのハッシュを混ぜながら鍵を派生させるUDS(Unique Device Secret)OTP に焼く。第 1 段の ROM だけが読めるCDI = KDF( UDS, Hash(第 1 段のコード) )CDI(Compound Device Identifier)第 1 段のコードに依存する秘密さらに次段のハッシュと合成次段の CDI …コードが 1 ビットでも変わると、派生する鍵が全部変わる=改ざんが鍵の不一致として現れる
測定と鍵導出を一体にしてしまう考え方。改ざんされた機器は「正しい鍵を作れない」ので自動的に締め出される

DICE の美点は、「鍵がコードに縛られる」ことである.

ファームウェアを 1 ビットでも書き換えると、ハッシュが変わり、 派生される鍵が変わる。すると——

改ざんを「検出する」のではなく、「改ざんすると使えなくなる」構造にしている。 検証コードのバグで見逃す、ということが起きない。非常にエレガントである。

加えて、UDS を読めるのは第 1 段の ROM だけにして、 CDI を計算したら UDS へのアクセスをハードウェアでロックする(ラッチする)。 こうすると、後段のコードに脆弱性があっても UDS は漏れない。

6. RoT が守れないもの

RoT は万能ではない。限界を正しく理解しておく必要がある。

守れないもの理由対策
起動後の脆弱性セキュアブートは「起動時」しか検証しないランタイム保護、MPU、分離(07 章・15 章)
物理攻撃OTP の値も、条件次第で読める/書ける耐タンパ設計、セキュアエレメント(09 章・10 章・22 章)
サプライチェーンの汚染工場で不正なコードが署名されたら検出できない署名鍵の管理、プロビジョニング設計(12 章)
設計上の欠陥「正規に署名された脆弱なファームウェア」は通る脆弱性管理、SBOM(15 章)
秘密鍵の流出署名鍵が漏れたら、攻撃者が正規の署名を作れるHSM での鍵管理、鍵の失効機構

最後の 2 つが本質的に重い.

「セキュアブートは、正しく署名されたファームウェアなら、 脆弱でも喜んで起動する。」

セキュアブートが守るのは完全性(正規のものか)であって、 安全性(脆弱でないか)ではない。この 2 つは別物である。

だから 15 章(脆弱性管理)と 13 章(更新)が必要になる。

7. 「Time of Check to Time of Use」問題

セキュアブートには構造的な弱点がある。

検証したもの ≠ 実行したもの(TOCTOU)t1ファームウェアを検証する → OKt2ファームウェアを実行するこの間に書き換えられたら?外部フラッシュから実行する構成では現実的な脅威になる。対策:内部フラッシュへコピーしてから検証する/オンザフライ復号と認証(06 章)
「検証した瞬間」と「実行する瞬間」が離れていると、その隙間が攻撃面になる

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 から始まる検証の連鎖—— セキュアブートの実際を見る。