IoT Security 06 · 鍵の保管 — CPU に平文の鍵を見せない

Chapter 06

鍵の保管 — CPU に平文の鍵を見せない

この章がなぜ必要なのか——鍵が漏れたら、他の全部が無意味になる.

02 章で見たとおり、Information Disclosure(鍵の漏洩)が起きると、 Spoofing も Tampering も一気に成立する。

だから「鍵をどこに、どう置くか」は、 組み込みセキュリティで最も重要な単一の設計判断である。

この章で使う既出の用語(定義は各リンク先). Spoofing(02 章 3 節)、Tampering(02 章 3 節)、セキュアブート(02 章 3 節)、ハッシュ(04 章 4 節)、物理攻撃(04 章 6 節)、最も安全(05 章 4 節)

1. 鍵はどこに置けるか

鍵をどこに置くかフラッシュに平文ソースに直書き、または NVM に平文で保存論外OTP / eFuse焼き切り。読出保護をかければ CPU からも読めない◯ 基本PUF保存しない。起動のたびに再構成する◎ 強い鍵ラッピングHUK で暗号化してフラッシュに置く◎ 実用的セキュアエレメント別チップに隔離。耐タンパ設計(22 章)◎ 最強「どこに置くか」より「CPU から読めるか」で評価する。読めた時点で対策の意味が薄れる
保管場所そのものより、可視性が本質。読めない形にできているかを基準に選ぶ
置き場所読み出しの容易さ書き換え容量
ソースコード(ハードコード)極めて容易(strings で出る)——
通常のフラッシュ容易(SWD かフラッシュ剥がし)可能大
外付け EEPROM / SPI フラッシュ容易(バスを覗く)可能大
内部フラッシュ + 読み出し保護中(保護の実装次第)可能大
OTP / eFuse難(CPU からのみ、または不可)不可小(数百 B〜数 KB)
鍵ラッピング(HUK で暗号化)難(HUK が要る)可能大
PUF から導出非常に難(保存されていない)—小〜中
セキュアエレメント(別チップ)極めて難(EAL6+ の耐タンパ)可能中

鍵の保管方式を比較する

保管方式と攻撃者クラス(02 章)を選ぶと、どこまで守れるかが表示される。

「ハードコードしない」が第一原則である.

ETSI EN 303 645 の規定 4「セキュリティパラメータを安全に保管する」の中に、 「ハードコードされた重要なセキュリティパラメータを使わない」が明記されている。 UK PSTI も、EU の EN 18031 も同じことを要求する。

ソースコードに書かれた鍵は、

これだけは絶対にやってはいけない。

2. OTP と eFuse

何であるか

名称実体特徴
eFuseポリシリコンヒューズを電流で溶断する一度切ったら戻らない。顕微鏡で見える場合がある
アンチヒューズ絶縁膜を破壊して導通させるeFuse より観察されにくいとされる
OTP(一般)上記や、書き込み後にロックする不揮発メモリベンダによって実装が違う

用途:

用途内容
ROTPK ハッシュセキュアブートの公開鍵ハッシュ(05 章)
HUK / 機器固有鍵対称鍵の根
ライフサイクル状態開発/量産/ロックの状態(14 章)
設定ビットデバッグ無効化、ブートソース固定など
単調カウンタロールバック防止(13 章)

OTP の制約

制約内容
容量が小さい典型的に数百バイト〜数 KB。贅沢に使えない
書き換えられないミスするとそのチップは廃棄。量産時のリスク
ビット単位で 0→1 のみ多くの実装で、一方向にしか変えられない
読み出しの保護は実装依存「CPU からは読めるがデバッガからは読めない」など、粒度が製品ごとに違う

「eFuse は読めない」は正しくない.

多くの MCU で、eFuse の値はCPU から読める(そうでないと使えない)。 守っているのは「デバッガから読めない」「特定のマスタからしか読めない」という アクセス制御であって、物理的な読み出し困難性ではない。

物理攻撃者(クラス 4 以上)に対しては、 チップを開封して顕微鏡で観察する、プローブで信号を取るといった手段がある。 eFuse は「切れたヒューズ」が物理的に見えることがあるため、 高セキュリティ用途ではアンチヒューズや PUF が選ばれる。

OTP の使い方の設計

鍵は「読めない」ことが要件になる悪い設計OTPAES 鍵(平文)CPU鍵を読み出すCPU のメモリ平文の鍵が乗る脆弱性 1 個で鍵が漏れるデバッガでも読めるメモリダンプでも読める良い設計OTP鍵(読出禁止)専用配線暗号エンジンCPU「スロット 2 で暗号化して」と依頼するだけ平文の鍵が CPU バスに一度も出ないCPU が乗っ取られても、鍵は「使える」が「読めない」——これが不可視化
鍵を CPU に見せない。この一点だけで、ソフトウェア脆弱性による鍵漏洩をほぼ封じられる

これを 「鍵の不可視化」 または 「ハードウェア鍵スロット」 と呼ぶ。

ベンダ機構の名称章
NordicKMU(Key Management Unit)— 暗号エンジン(CryptoCell / CRACEN)に直結21
RenesasSCE / RSIP の鍵ラッピング。平文鍵を CPU に出さない21
Silicon LabsSecure Vault の Secure Key Management21
NXPPUF + 鍵ストア、暗号エンジン CAAM の Black Key / Blob19
EspressifeFuse の鍵ブロック + HMAC / DS ペリフェラル20
STSAES の鍵ハードウェア供給、HUK 由来鍵18

3. PUF — Physically Unclonable Function

原理

製造ばらつきを鍵として使う。

同じマスクで作った同じチップでも、トランジスタの閾値電圧やゲート遅延には 微細なばらつきがある。このばらつきは

代表的な方式:

方式原理
SRAM PUF電源投入時に SRAM の各ビットが 0 か 1 のどちらに落ち着くかは、素子のばらつきで決まる
リングオシレータ PUF同一設計のリング発振器の周波数差を使う
アービタ PUF2 本の同一遅延経路のどちらが速いかを使う

SRAM PUF の動作

PUF — チップの個体差そのものを鍵にする電源投入SRAM の初期値を読む → 0101 1100 1011 …(このチップ固有のパターン)誤り訂正ヘルパーデータ(公開してよい)で数 % のビット反転を訂正する鍵導出安定したビット列を KDF に通して鍵を得る使い終わったら SRAM をクリアする電源を切ると鍵はどこにも存在しない。分解しても「読み出す場所」がない温度・電圧・経年で数 % 反転する
PUF は「鍵を保存しない」方式。ただしヘルパーデータの管理と、起動のたびに数 ms かかる点は設計に効く

生の PUF 出力は温度や電圧で毎回数 % 揺れるので、そのままでは鍵にならない。 そこで初回に、誤り訂正のための補助情報——ヘルパーデータ (ベンダによってはアクティベーションコードと呼ぶ)——を生成して普通のフラッシュに保存しておき、 以後の起動ではそれを使って毎回同じビット列を復元する。 ヘルパーデータだけからは鍵を計算できないので、読まれても問題ない。

PUF の最大の利点は「鍵が保存されていない」ことである.

電源が切れている間、チップのどこにも鍵は存在しない。 剥がして読み出そうにも、読むべきものがない。

しかも、チップを開封して観察しようとすると、その行為自体が 素子の特性を変えて PUF の出力を変えてしまうという性質がある (invasive attack への自然な耐性)。

これが「高セキュリティ品種は PUF を使う」理由である。

PUF の注意点

注意点内容
エンロールメントが要る初回にヘルパーデータを生成して保存する工程が必要
ヘルパーデータの保管公開してよいが、失うと鍵が復元できない
経年劣化数年〜十数年でビット反転率が上がる。誤り訂正の余裕が要る
温度範囲動作温度全域で安定するか、データシートで確認する
起動時間誤り訂正に時間がかかる(数 ms〜数十 ms)

採用例:

ベンダ内容
NXP LPC55S6x / i.MX RT600 等SRAM PUF(Intrinsic ID の IP)を搭載
Silicon Labs Secure Vault HighPUF ベースの鍵ラッピング
Microchip 一部品種—
Xilinx / AMD、Intel FPGAPUF による鍵保護

4. 鍵ラッピング(Key Wrapping)

OTP は小さい。だが守りたい鍵はたくさんある。 その解決策である。

鍵ラッピング — 鍵を平文のまま置かないHUKOTP か PUF に 1 個だけ。CPU から読めない各種の鍵を HUK で暗号化(ラップ)するWrapped Key(ラップ済み鍵)普通のフラッシュに置いてよい使うときは暗号エンジンに渡す暗号エンジンが内部でアンラップして、そのまま使う平文の鍵は一度も CPU バスに出ない。フラッシュを吸い出されても復号できない
鍵の本数が増えても、守るべきものは HUK 1 本に集約できる。これが階層設計の実利
利点内容
OTP を節約できるHUK 1 個だけで、無数の鍵を守れる
鍵をフラッシュに置けるラップ済みなので、読まれても使えない
鍵がチップに縛られる別のチップに移しても、HUK が違うのでアンラップできない
平文が CPU に出ないソフトウェアの脆弱性で鍵が漏れない

「鍵がチップに縛られる」の効果は大きい.

攻撃者がフラッシュをまるごとコピーして別のチップに書いても、 HUK が違うので鍵を使えない。

これはクローン品対策としても有効である。 「フラッシュの中身をコピーすれば同じ製品が作れる」を防げる。

各社の名称:

ベンダ名称
NXP (CAAM)Black Key / Blob(暗号化された鍵の形式)
Renesas鍵ラッピング(SCE / RSIP の「installed key」)
Silicon LabsWrapped Key(Secure Vault High)
Arm PSAInternal 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 を使う場合、バスが露出する。

オンザフライ暗号

ベンダ機構内容
STOTFDEC (On-The-Fly DECryption)外部メモリの読み出し時に AES-CTR で復号
NXPPRINCE(内部フラッシュ)/BEE・OTFAD(外部)AES ベースのオンザフライ暗号
EspressifFlash EncryptionAES-XTS(新しい世代)で SPI フラッシュを暗号化
Renesas—品種による

共通する仕組み:

オンザフライ復号 — 外部フラッシュを暗号のまま置く外部フラッシュ中身は暗号文SPI バスここをプローブしてもランダムに見えるオンザフライ復号AES-CTR / PRINCECPU平文が届く鍵:OTP / PUFCPU からは読めないXIP でそのまま実行
フラッシュを外して読まれても中身が分からない。ただし「暗号化」であって「認証」ではない点に注意する
守れるもの守れないもの
機密性 — バスを覗いても内容が分からない完全性 — 書き換えを検出できない
クローン対策 — 鍵がチップ固有なら、コピーしても動かないリプレイ — 古い有効な暗号文への差し替え

完全性が必要なら、別の手段が要る.

重要なコード(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(不可逆)の差は大きい。グリッチ耐性を確認する
オンザフライ暗号機密性は守るが完全性は守らない。重要部分は内部フラッシュへ
鍵の一生生成・注入・保管・使用・更新・失効・破棄。生成場所が最重要の判断

次章では、「壊れても被害を閉じ込める」ための仕組み—— 分離のアーキテクチャを扱う。