信頼の起点とセキュアエンクレーブ ─ TPM・SGX・TrustZone
OSが乗っ取られても鍵と計算を守りたい。TPMの測定・封印、SGXのメモリ暗号化と証明、TrustZoneの世界分離を原理から押さえれば、ハードウェアルートオブトラストの設計が腑に落ちます。
- 1.TPMはPCRに起動コンポーネントのハッシュを連鎖(extend)して記録し、その値を条件に鍵を封印(seal)する。改ざんがあればPCRがずれ、封印した鍵は復号されない。
- 2.Intel SGXはEPCというメモリ暗号化領域にエンクレーブを置き、CPUパッケージの外(DRAM)では平文を残さない。MRENCLAVE等の測定値を使ったリモート証明で『正しいコードが本物のSGXで動いている』ことを遠隔検証する。
- 3.Arm TrustZoneはCPUのNSビット1本でセキュア/ノンセキュアの2世界を分離し、メモリ・割り込み・周辺機器までバス単位で隔離する。SMC命令とモニタを介してのみ世界をまたぐ。
信頼はどこから始まるのか
ソフトウェアのセキュリティには根本的な循環がある。OSを信頼するには、OSを起動したブートローダを信頼せねばならず、そのブートローダを信頼するには、さらに手前のファームウェアを信頼せねばならない。この連鎖をどこかで断ち切り、それ以上は疑わない最初の一点が必要になる。それがハードウェアルートオブトラストである。
ルートオブトラストは、書き換え不能なROM内のコード(ブートROM)や、製造時に焼き込まれた鍵といった、ソフトウェアでは改変できない要素で構成される。ここを起点に「次に実行するものを検証してから渡す」を繰り返すことで、信頼を上位層へ伝播させる。本稿では代表的な3つの仕組み ── TPMの測定と封印、Intel SGXのエンクレーブ、Arm TrustZoneの世界分離 ── を原理から見ていく。
TPMは「何が起動したかを記録・証明し、状態に鍵を縛る」受動的な観測者。SGXとTrustZoneは「特定のコードとデータを実行中も隔離する」能動的な実行環境(TEE)。TPMは隔離実行はせず、SGX/TrustZoneは起動測定の主体ではない。役割を混同しないことが理解の第一歩になる。
TPM ─ 測定と封印
TPM(Trusted Platform Module)は、独立したセキュリティチップ(または同等のファームウェア実装)で、鍵生成・ハッシュ・乱数生成と、PCR(Platform Configuration Register)という特殊なレジスタ群を持つ。
PCRの肝は、直接書き込めず「extend」操作でしか更新できない点にある。新しい測定値(コンポーネントのハッシュ)を取り込むとき、TPMは次のように現在値と連結して再ハッシュする。
PCR_new = Hash( PCR_old || measurement )
この連鎖(ハッシュチェーン)のおかげで、起動した各段(ファームウェア → ブートローダ → カーネル → 設定)を順に extend していくと、最終的なPCR値はそのブート経路全体を一意に要約する。途中で1ビットでも異なるコードが走れば、PCRは予測不能なまったく別の値になり、後から「正しい値だったことにする」改ざんは事実上不可能になる。これが測定ブート(measured boot)である。
ここで重要な区別がある。セキュアブートは「署名が検証できなければ起動を止める」強制であり、測定ブートは「何が起動したかをPCRに残す」記録に徹する。TPMが担うのは後者で、止めはせず証拠を積む。
| 観点 | セキュアブート | 測定ブート(TPM) |
|---|---|---|
| 目的 | 未署名コードの実行を阻止 | 起動したものを記録・証明 |
| 動作 | 検証失敗で起動停止 | ハッシュをPCRへ extend し続行 |
| 主体 | ファームウェア(UEFI) | TPMのPCR |
| 事後利用 | なし(起動可否のみ) | 封印・遠隔証明に使える |
測定値を活用する代表が封印(sealing)である。TPMは鍵やデータを暗号化する際、「復号を許す条件」として特定のPCR値を指定できる。封印された鍵は、後で**そのときPCRが同じ値であるときだけ復号(unseal)**される。
seal: 暗号化(秘密, 条件=PCR{0,2,4,7}が値Xであること)
unseal: 現在のPCR{0,2,4,7} == X なら復号、違えば拒否
つまり、ディスク暗号化鍵を「正規のファームウェアと正規のカーネルで起動したとき」のPCR値に封印しておけば、攻撃者がブートローダを差し替えた瞬間にPCRがずれ、鍵そのものが取り出せなくなる。鍵の保護を、平文の隠蔽ではなくプラットフォーム状態への束縛で実現する点がTPMの設計思想である。
封印が保証するのは「unseal した時点でPCRが期待値だった」ことであり、unseal 後に実行中のコードが攻撃される可能性まで防ぐわけではない。測定はあくまで起動時のスナップショットで、ランタイムの侵害は別の防御(後述のTEE等)が必要になる。
Intel SGX ─ メモリ暗号化と証明
TPMが起動状態の観測に徹するのに対し、SGX(Software Guard Extensions)は実行中のコードとデータを隔離する。アプリの一部をエンクレーブという保護領域に置き、OSやハイパーバイザといった特権ソフトすら中身を読めないようにする。
仕組みの核はEPC(Enclave Page Cache)と呼ぶ物理メモリ領域である。エンクレーブのページはここに置かれ、メモリ暗号化エンジン(MEE)によって、CPUパッケージから出る瞬間に暗号化される。
CPUコア内(オンチップ) : エンクレーブのデータは平文で処理
パッケージ境界 ────────── ここで暗号化・完全性タグ付与
DRAM(チップ外) : EPCの内容は暗号文。物理プローブでも平文は得られない
ポイントは脅威モデルが特権ソフトと物理攻撃の両方を含むこと。ページテーブルを握るOSでも、エンクレーブのメモリにアクセスしようとすればハードウェアが弾く。DRAMバスを物理的に覗いても暗号文しか流れていない。さらに完全性ツリーで改ざんとリプレイも検出する。
しかし「隔離されている」だけでは、リモートの利用者は自分が通信している相手が本物のエンクレーブなのかを確かめられない。そこで証明(attestation)が要る。
SGXはエンクレーブのコードとデータの初期状態をハッシュしたMRENCLAVE(測定値)と、署名者の身元を表すMRSIGNERを持つ。リモート証明では、これらを含む証明構造をハードウェア固有鍵で署名し、検証側へ送る。検証側は署名チェーンを辿り、**「期待したMRENCLAVEを持つコードが、本物のIntel SGX上で動いている」**ことを確認してから初めて秘密(鍵やデータ)をエンクレーブへ送り込む。
SGXはメモリの機密性は守るが、CPU内部の共有資源は守りきれない。キャッシュのアクセスパターン、分岐の挙動、投機実行の痕跡などから秘密を漏らす攻撃(Spectre系の派生やForeshadow、ZombieLoadなどの過渡実行攻撃)が相次いだ。エンクレーブの中でもキャッシュの仕組みや同時マルチスレッディング(SMT)の共有が観測の窓になり、定数時間実装などソフト側の対策が不可欠になる。
Arm TrustZone ─ 世界の二分割
TrustZoneは、SGXのように小さなエンクレーブを多数作るのではなく、システム全体をセキュアワールドとノンセキュアワールドという2つの実行環境に分ける。組み込み・モバイルで広く使われる。
実装の中心は、CPUの状態を表すたった1ビット ── NSビット(Non-Secure bit)である。プロセッサは常にどちらかの世界で動き、このビットがバスのトランザクションにも伝播する。
NS = 0 : セキュアワールド(信頼するOS/サービス。鍵管理、決済、DRM等)
NS = 1 : ノンセキュアワールド(通常のOSとアプリ。Android/Linux等)
NSビットはメモリ・割り込みコントローラ・周辺機器のアクセス制御まで貫く
-> ノンセキュア側からセキュア側のメモリ/デバイスは「存在しないも同然」
重要なのは、隔離がCPUだけでなくSoC全体に及ぶこと。メモリコントローラや周辺機器はNS属性を見て、ノンセキュアな要求がセキュアな領域へ届くのを物理的に遮断する。指紋センサや暗号鍵ストレージをセキュアワールド専用にすれば、通常OSが完全に乗っ取られても、これらへは手が届かない。
2つの世界を行き来する唯一の正規ルートがSMC命令(Secure Monitor Call)である。ノンセキュア側がSMCを発行すると、最上位特権のセキュアモニタへ制御が移り、モニタがコンテキストを切り替えてからセキュアワールドへ渡す。
通常OS --(SMC命令)--> セキュアモニタ(EL3) --(切替)--> セキュアOS
<--(復帰)------ <--(復帰)----
このモニタが両世界のレジスタ・状態を確実に分離保存することで、片方の世界からもう片方の内部状態を覗けないようにしている。割り込みも世界ごとに振り分けられ、セキュアな割り込みは通常OSをまたいで直接モニタ/セキュア側へ届けられる。世界切り替えの本質は、割り込みと例外の処理で扱う特権遷移を、機密性の軸でもう一段精緻にしたものと言える。
3方式の比較と共通原理
| 観点 | TPM | Intel SGX | Arm TrustZone |
|---|---|---|---|
| 主目的 | 起動の測定・封印・証明 | プロセス内エンクレーブの隔離 | システム全体の2世界分離 |
| 隔離の粒度 | なし(観測のみ) | アプリ内の小領域(多数可) | ワールド単位(粗いが全体) |
| 守る相手 | 改ざんされた起動経路 | 特権ソフト+物理攻撃 | ノンセキュアOSの侵害 |
| メモリ暗号化 | なし | あり(EPC/MEE) | 実装依存(多くはアクセス制御主体) |
| 証明の単位 | PCR(プラットフォーム状態) | MRENCLAVE(コード測定値) | 実装依存のブート測定 |
方式は違っても、貫く原理は共通している。第一に、信頼を一点(ROMや製造時鍵)に集約し、そこから連鎖で検証を伝播すること。第二に、測定値(ハッシュ)で状態を一意に要約し、その値を鍵や証明に結び付けること。第三に、境界(パッケージ、ワールド、PCR条件)を越える瞬間にだけ強制的な検査を挟むこと。SGXのパッケージ境界での暗号化も、TrustZoneのSMCゲートも、TPMの unseal 時のPCR照合も、すべて「境界での検査」という同じ発想の現れである。
「TPMはPCRに extend でハッシュ連鎖を積み、その値に鍵を封印(seal/unseal)する。測定ブートであって起動を止めるセキュアブートとは別物」「SGXはEPCをMEEで暗号化し特権ソフト+物理攻撃から守り、MRENCLAVEを使ったリモート証明で正当性を遠隔検証する」「TrustZoneはNSビットでセキュア/ノンセキュアの2世界をSoC全体で分離し、SMC命令とモニタ経由でのみ往来する」の3点が核心。SGXがマイクロアーキ側面チャネルに弱い理由(共有資源は隠せない)まで言えると強い。
まとめ
- TPMはPCRへの extend でブート経路をハッシュチェーンに要約し、その値に鍵を封印する。改ざんがあればPCRがずれ、封印した鍵は unseal できない。鍵を「状態への束縛」で守るのが本質。
- Intel SGXはEPCをMEEで暗号化し、CPUパッケージの外(DRAM)に平文を残さない。特権ソフトと物理攻撃の両方を脅威に含め、MRENCLAVE測定値による証明で遠隔検証を成立させる。一方でマイクロアーキ側面チャネルには弱い。
- Arm TrustZoneはNSビット1本でセキュア/ノンセキュアの2世界をSoC全体に分離し、SMC命令とセキュアモニタを唯一の往来路とする。SoCの周辺機器・割り込みまで貫く隔離が特徴。
3方式に共通するのは、信頼を一点に集約し、測定値で状態を要約し、境界越えに検査を挟むという設計原理である。デバイス直結を安全にするIOMMUとDMA保護や、放射線などによるソフトエラーと物理的擾乱への耐性と組み合わせて、初めて実運用に耐える信頼基盤になる。
CPU/メモリ/ディスク Article
信頼の起点とセキュアエンクレーブ ─ TPM・SGX・TrustZoneを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
セキュリティ
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
Intel SGXはEPCというメモリ暗号化領域にエンクレーブを置き、CPUパッケージの外(DRAM)では平文を残さない。MRENCLAVE等の測定値を使ったリモート証明で『正しいコードが本物のSGXで動いている』ことを遠隔検証する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「セキュリティ / TPM」に近いか確認する。
- 強みである「TPMはPCRに起動コンポーネントのハッシュを連鎖(extend)して記録し、その値を条件に鍵を封印(seal)する。改ざんがあればPCRがずれ、封印した鍵は復号されない。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。