Chapter 06
鍵の保管 — CPU に平文の鍵を見せない
この章がなぜ必要なのか——鍵が漏れたら、他の全部が無意味になる.
02 章で見たとおり、Information Disclosure(鍵の漏洩)が起きると、 Spoofing も Tampering も一気に成立する。
だから「鍵をどこに、どう置くか」は、 組み込みセキュリティで最も重要な単一の設計判断である。
この章で使う既出の用語(定義は各リンク先). Spoofing(02 章 3 節)、Tampering(02 章 3 節)、セキュアブート(02 章 3 節)、ハッシュ(04 章 4 節)、物理攻撃(04 章 6 節)、最も安全(05 章 4 節)
1. 鍵はどこに置けるか
| 置き場所 | 読み出しの容易さ | 書き換え | 容量 |
|---|---|---|---|
| ソースコード(ハードコード) | 極めて容易(strings で出る) | — | — |
| 通常のフラッシュ | 容易(SWD かフラッシュ剥がし) | 可能 | 大 |
| 外付け EEPROM / SPI フラッシュ | 容易(バスを覗く) | 可能 | 大 |
| 内部フラッシュ + 読み出し保護 | 中(保護の実装次第) | 可能 | 大 |
| OTP / eFuse | 難(CPU からのみ、または不可) | 不可 | 小(数百 B〜数 KB) |
| 鍵ラッピング(HUK で暗号化) | 難(HUK が要る) | 可能 | 大 |
| PUF から導出 | 非常に難(保存されていない) | — | 小〜中 |
| セキュアエレメント(別チップ) | 極めて難(EAL6+ の耐タンパ) | 可能 | 中 |
鍵の保管方式を比較する
保管方式と攻撃者クラス(02 章)を選ぶと、どこまで守れるかが表示される。
「ハードコードしない」が第一原則である.
ETSI EN 303 645 の規定 4「セキュリティパラメータを安全に保管する」の中に、 「ハードコードされた重要なセキュリティパラメータを使わない」が明記されている。 UK PSTI も、EU の EN 18031 も同じことを要求する。
ソースコードに書かれた鍵は、
- ファームウェアを吸い出せば
stringsで見つかる- Git リポジトリに残る
- 全台同じ鍵になる(02 章のクラス 3 攻撃が成立する)
これだけは絶対にやってはいけない。
2. OTP と eFuse
何であるか
| 名称 | 実体 | 特徴 |
|---|---|---|
| eFuse | ポリシリコンヒューズを電流で溶断する | 一度切ったら戻らない。顕微鏡で見える場合がある |
| アンチヒューズ | 絶縁膜を破壊して導通させる | eFuse より観察されにくいとされる |
| OTP(一般) | 上記や、書き込み後にロックする不揮発メモリ | ベンダによって実装が違う |
用途:
| 用途 | 内容 |
|---|---|
| ROTPK ハッシュ | セキュアブートの公開鍵ハッシュ(05 章) |
| HUK / 機器固有鍵 | 対称鍵の根 |
| ライフサイクル状態 | 開発/量産/ロックの状態(14 章) |
| 設定ビット | デバッグ無効化、ブートソース固定など |
| 単調カウンタ | ロールバック防止(13 章) |
OTP の制約
| 制約 | 内容 |
|---|---|
| 容量が小さい | 典型的に数百バイト〜数 KB。贅沢に使えない |
| 書き換えられない | ミスするとそのチップは廃棄。量産時のリスク |
| ビット単位で 0→1 のみ | 多くの実装で、一方向にしか変えられない |
| 読み出しの保護は実装依存 | 「CPU からは読めるがデバッガからは読めない」など、粒度が製品ごとに違う |
「eFuse は読めない」は正しくない.
多くの MCU で、eFuse の値はCPU から読める(そうでないと使えない)。 守っているのは「デバッガから読めない」「特定のマスタからしか読めない」という アクセス制御であって、物理的な読み出し困難性ではない。
物理攻撃者(クラス 4 以上)に対しては、 チップを開封して顕微鏡で観察する、プローブで信号を取るといった手段がある。 eFuse は「切れたヒューズ」が物理的に見えることがあるため、 高セキュリティ用途ではアンチヒューズや PUF が選ばれる。
OTP の使い方の設計
これを 「鍵の不可視化」 または 「ハードウェア鍵スロット」 と呼ぶ。
| ベンダ | 機構の名称 | 章 |
|---|---|---|
| Nordic | KMU(Key Management Unit)— 暗号エンジン(CryptoCell / CRACEN)に直結 | 21 |
| Renesas | SCE / RSIP の鍵ラッピング。平文鍵を CPU に出さない | 21 |
| Silicon Labs | Secure Vault の Secure Key Management | 21 |
| NXP | PUF + 鍵ストア、暗号エンジン CAAM の Black Key / Blob | 19 |
| Espressif | eFuse の鍵ブロック + HMAC / DS ペリフェラル | 20 |
| ST | SAES の鍵ハードウェア供給、HUK 由来鍵 | 18 |
3. PUF — Physically Unclonable Function
原理
製造ばらつきを鍵として使う。
同じマスクで作った同じチップでも、トランジスタの閾値電圧やゲート遅延には 微細なばらつきがある。このばらつきは
- チップごとに違う(固有性)
- 同じチップでは再現する(再現性)
- 設計者にも予測できない(予測不能性)
代表的な方式:
| 方式 | 原理 |
|---|---|
| SRAM PUF | 電源投入時に SRAM の各ビットが 0 か 1 のどちらに落ち着くかは、素子のばらつきで決まる |
| リングオシレータ PUF | 同一設計のリング発振器の周波数差を使う |
| アービタ PUF | 2 本の同一遅延経路のどちらが速いかを使う |
SRAM PUF の動作
生の PUF 出力は温度や電圧で毎回数 % 揺れるので、そのままでは鍵にならない。 そこで初回に、誤り訂正のための補助情報——ヘルパーデータ (ベンダによってはアクティベーションコードと呼ぶ)——を生成して普通のフラッシュに保存しておき、 以後の起動ではそれを使って毎回同じビット列を復元する。 ヘルパーデータだけからは鍵を計算できないので、読まれても問題ない。
PUF の最大の利点は「鍵が保存されていない」ことである.
電源が切れている間、チップのどこにも鍵は存在しない。 剥がして読み出そうにも、読むべきものがない。
しかも、チップを開封して観察しようとすると、その行為自体が 素子の特性を変えて PUF の出力を変えてしまうという性質がある (invasive attack への自然な耐性)。
これが「高セキュリティ品種は PUF を使う」理由である。
PUF の注意点
| 注意点 | 内容 |
|---|---|
| エンロールメントが要る | 初回にヘルパーデータを生成して保存する工程が必要 |
| ヘルパーデータの保管 | 公開してよいが、失うと鍵が復元できない |
| 経年劣化 | 数年〜十数年でビット反転率が上がる。誤り訂正の余裕が要る |
| 温度範囲 | 動作温度全域で安定するか、データシートで確認する |
| 起動時間 | 誤り訂正に時間がかかる(数 ms〜数十 ms) |
採用例:
| ベンダ | 内容 |
|---|---|
| NXP LPC55S6x / i.MX RT600 等 | SRAM PUF(Intrinsic ID の IP)を搭載 |
| Silicon Labs Secure Vault High | PUF ベースの鍵ラッピング |
| Microchip 一部品種 | — |
| Xilinx / AMD、Intel FPGA | PUF による鍵保護 |
4. 鍵ラッピング(Key Wrapping)
OTP は小さい。だが守りたい鍵はたくさんある。 その解決策である。
| 利点 | 内容 |
|---|---|
| OTP を節約できる | HUK 1 個だけで、無数の鍵を守れる |
| 鍵をフラッシュに置ける | ラップ済みなので、読まれても使えない |
| 鍵がチップに縛られる | 別のチップに移しても、HUK が違うのでアンラップできない |
| 平文が CPU に出ない | ソフトウェアの脆弱性で鍵が漏れない |
「鍵がチップに縛られる」の効果は大きい.
攻撃者がフラッシュをまるごとコピーして別のチップに書いても、 HUK が違うので鍵を使えない。
これはクローン品対策としても有効である。 「フラッシュの中身をコピーすれば同じ製品が作れる」を防げる。
各社の名称:
| ベンダ | 名称 |
|---|---|
| NXP (CAAM) | Black Key / Blob(暗号化された鍵の形式) |
| Renesas | 鍵ラッピング(SCE / RSIP の「installed key」) |
| Silicon Labs | Wrapped Key(Secure Vault High) |
| Arm PSA | Internal Trusted Storage / Protected Storage の API で抽象化 |
5. 内部フラッシュの読み出し保護
多くの MCU が「読み出し保護(RDP / CRP / FSEC など)」を持っている。
| 典型的なレベル | 内容 |
|---|---|
| レベル 0 | 保護なし。開発中 |
| レベル 1 | デバッガ接続時にフラッシュ読み出し不可。ただし全消去すれば レベル 0 に戻せる |
| レベル 2 | デバッグ完全無効化。不可逆。以後デバッグできない |
レベル 1 と 2 の差は決定的である.
レベル 1 は「読めないが、消せる」。だから鍵は守られるが、機器は再利用できる。 レベル 2 は「二度とデバッグできない」。RMA(返品分析)ができなくなる。
ここが実務上の悩みどころで、14 章のライフサイクル管理で詳しく扱う。
そして重要な注意:
読み出し保護は、フォールトインジェクションで破られた実例がある.
複数のベンダの MCU で、電圧グリッチによる読み出し保護のバイパスが 公開実証されている(10 章・11 章)。
保護レベルの判定は、多くの場合「起動時にオプションバイトを読んで、 保護されていたらデバッグポートを閉じる」というソフトウェア的な分岐である。 その分岐をグリッチで飛ばせば、保護は解除される。
新しい世代のチップでは、この判定を冗長化したり、 ハードウェアラッチにしたりして対策している。 「保護機能がある」だけでなく「フォールト耐性があるか」を確認すること。
6. 外部メモリの保護
外付け SPI フラッシュや外部 RAM を使う場合、バスが露出する。
オンザフライ暗号
| ベンダ | 機構 | 内容 |
|---|---|---|
| ST | OTFDEC (On-The-Fly DECryption) | 外部メモリの読み出し時に AES-CTR で復号 |
| NXP | PRINCE(内部フラッシュ)/BEE・OTFAD(外部) | AES ベースのオンザフライ暗号 |
| Espressif | Flash Encryption | AES-XTS(新しい世代)で SPI フラッシュを暗号化 |
| Renesas | — | 品種による |
共通する仕組み:
| 守れるもの | 守れないもの |
|---|---|
| 機密性 — バスを覗いても内容が分からない | 完全性 — 書き換えを検出できない |
| クローン対策 — 鍵がチップ固有なら、コピーしても動かない | リプレイ — 古い有効な暗号文への差し替え |
完全性が必要なら、別の手段が要る.
- 起動時に全体をハッシュして検証する(XIP では実行中の変更を検出できない)
- オンザフライ認証に対応した SoC を選ぶ(対応品種は限られる)
- 内部フラッシュに重要な部分を置く(最も確実)
重要なコード(RoT、鍵を扱う部分)は、 できるだけ内部フラッシュに置くのが設計の基本である。
外部 DRAM の暗号化
Cortex-A クラスのアプリケーションプロセッサでは、外部 DDR が使われる。
| 対策 | 内容 |
|---|---|
| インラインメモリ暗号化 | メモリコントローラで DDR を暗号化する(一部の SoC が対応) |
| 重要データは内部 SRAM に | 鍵や秘密は on-chip SRAM でのみ扱う |
| コールドブート攻撃対策 | 電源断後も DRAM の内容が短時間残る。電源断時にクリアする |
7. 鍵の一生
鍵は「入れて終わり」ではない。ライフサイクル全体を設計する必要がある。
| 段階 | やること | 章 |
|---|---|---|
| 生成 (Generation) | 良質な乱数から生成する。どこで生成するかが重要 | 08, 12 |
| 注入 (Provisioning) | 工場でチップに入れる。平文で扱わない工夫が要る | 12 |
| 保管 (Storage) | OTP / ラップ / PUF。CPU に平文を出さない | 本章 |
| 使用 (Usage) | ハードウェア鍵スロット経由で使う | 本章 |
| 更新 (Rotation) | 期限切れや漏洩時に入れ替える | 12, 13 |
| 失効 (Revocation) | 漏洩した鍵を無効にする。単調カウンタなどで | 13 |
| 破棄 (Destruction) | 廃棄時に消す。所有権移転時にも | 14 |
「鍵をどこで生成するか」は見落とされやすい重要な判断である.
方式 秘密鍵が外に出るか 難しさ チップ内で生成(オンチップ鍵生成) 出ない(最も安全) 良質な TRNG(真性乱数生成器、08 章)が要る 工場の HSM で生成して注入 HSM から注入経路に出る 注入経路の保護が要る 開発 PC で生成してコピー 平文で流通する(危険) 楽だが避けるべき 理想はチップ内生成である。 秘密鍵が一度も外に出ないので、 工場の従業員も、製造委託先も、鍵を知りようがない。
ただしその場合、公開鍵を取り出して CA に署名してもらうという 工程が必要になる(公開鍵を CA に送って証明書にしてもらう依頼書を CSR=Certificate Signing Request・証明書署名要求と呼ぶ。12 章)。
8. この章のまとめ
| ポイント | 内容 |
|---|---|
| 第一原則 | ハードコードしない。規制でも明示的に禁止されている |
| OTP / eFuse | 小容量・不可逆。ROTPK ハッシュ・HUK・ライフサイクル状態(LCS、14 章)・単調カウンタに使う |
| 鍵の不可視化 | 暗号エンジンだけが鍵を読める構成にする。CPU バスに平文を出さない |
| PUF | 鍵が保存されていない。剥がしても読むものがない。開封で壊れる |
| 鍵ラッピング | HUK 1 個で無数の鍵を守る。鍵がチップに縛られる(クローン対策) |
| 読み出し保護 | レベル 1(消せる)と 2(不可逆)の差は大きい。グリッチ耐性を確認する |
| オンザフライ暗号 | 機密性は守るが完全性は守らない。重要部分は内部フラッシュへ |
| 鍵の一生 | 生成・注入・保管・使用・更新・失効・破棄。生成場所が最重要の判断 |
次章では、「壊れても被害を閉じ込める」ための仕組み—— 分離のアーキテクチャを扱う。