Chapter 18
STMicroelectronics — STM32
この章の位置づけ.
STM32 は組み込み市場で最も広く使われるファミリの 1 つであり、 セキュリティ機能の世代差が大きい。
「STM32 だから安全」でも「STM32 だから駄目」でもない。 品種ごとに何を持っているかを見分けられるようになることが、この章の目的である。
注意: 以下は執筆時点の公開情報に基づく概観である。 必ず対象品種のリファレンスマニュアル、 および ST の「Security guidance for STM32」系のアプリケーションノートで確認すること。
この章で使う既出の用語(定義は各リンク先). セキュアブート(02 章 3 節)、物理攻撃(04 章 6 節)、不可(06 章 1 節)、完全性(06 章 6 節)、GTZC(07 章 3 節)、Non-secure(07 章 3 節)、SAU(07 章 3 節)、Secure(07 章 3 節)、TrustZone(07 章 2 節)、割り込み(07 章 3 節)、TRNG(08 章 8 節)、乱数(08 章 5 節)、必要(09 章 6 節)、AES-128(10 章 2 節)、ECDSA(10 章 2 節)、NXP(12 章 3 節)、Renesas(12 章 3 節)、ライフサイクル状態(12 章 1 節)、NSECSD(14 章 2 節)、市場(14 章 5 節)、機器固有鍵(14 章 6 節)、開発(14 章 5 節)、運用(15 章 8 節)、RAM(16 章 3 節)、フラッシュ(16 章 3 節)、Cortex-M33(17 章 2 節)、PSA(17 章 1 節)、デバッグ(17 章 3 節)
1. STM32 ファミリのセキュリティ世代
STM32 のセキュリティ機能を調べる
シリーズを選ぶと、そのシリーズが持つ機能と、本シリーズのどの概念に対応するかが表示される。
大まかに 3 世代に分けて考えると整理しやすい。
| 世代 | 代表シリーズ | コア | 主なセキュリティ機能 |
|---|---|---|---|
| 第 1 世代 | F0/F1/F3/F4/L0/L1/L4 | Cortex-M0/M3/M4 | RDP、WRP、PCROP。TrustZone なし |
| 第 2 世代 | F7/H7 | Cortex-M7 | 上記 + セキュアメモリ、OTFDEC(H7 の一部) |
| 第 3 世代 | L5 / U5 / H5 / WBA / N6 | Cortex-M33 | TrustZone、GTZC、製品状態、RSS、SAES など |
新規設計でセキュリティを重視するなら、第 3 世代を選ぶこと.
第 1・第 2 世代の RDP レベル 2 は フォールトインジェクションによる突破が公開実証された事例がある(10 章)。 世代が進むにつれて、保護機構の冗長化やライフサイクル状態の厳密化が進んでいる。
2. 保護機能(全世代に共通する基礎)
| 機能 | 正式名 | 内容 |
|---|---|---|
| RDP | Readout Protection | フラッシュの読み出し保護 |
| WRP | Write Protection | 書き込み・消去の保護 |
| PCROP | Proprietary Code Read-Out Protection | 実行はできるが読めない領域 |
| HDP / Secure hide protection | Hide Protection | 起動後にアクセスを封じる領域 |
| MPU | Memory Protection Unit | Arm 標準の特権分離 |
RDP のレベル
| レベル | 内容 | 戻せるか |
|---|---|---|
| Level 0 | 保護なし。開発中 | — |
| Level 1 | デバッガ接続時にフラッシュ読み出し不可 | Level 0 に戻せる(ただし全消去される) |
| Level 2 | デバッグ完全無効化 | 不可逆。以後デバッグできない |
Level 1 の「戻せる」性質は、意図された機能である.
「読めないが、消せる」——つまり フラッシュの内容(IP と秘密)は守られるが、機器は再利用できる。
RMA(返品分析)では、消去して再書き込みすれば動作確認ができる。 ただし元のファームウェアの状態は失われるので、 「現象を再現している状態のまま調べる」ことはできない。
第 3 世代の製品状態(Product State)と Debug Authentication が、 この問題への回答である(本章 5 節)。
PCROP — 「実行できるが読めない」
知的財産の保護(01 章の 4 分類のうちの 1 つ)に特化した機能である。
PCROP には制約がある.
- 定数データを同じ領域に置けない(読めないので) → 文字列やルックアップテーブルは別領域に置く必要がある
- リテラルプールを分離するコンパイラ設定が必要
- デバッグが難しくなる
ST は関連するアプリケーションノートを提供しているので、必ず参照すること。
HDP(Hide Protection)
「起動時に使い、その後は誰にも触らせない」領域を作る。
これは 06 章の「鍵をラッチする」の実装である.
DICE の「UDS を読んだらアクセスをロックする」(04 章)と同じ考え方で、 後段のコードに脆弱性があっても、初期化用の秘密は漏れない。
非常に有用な機能なので、使える品種では積極的に使うこと。
3. 第 3 世代の TrustZone 実装 — GTZC
STM32L5 / U5 / H5 / WBA などが持つ、TrustZone の周辺実装である。
| コンポーネント | 役割 |
|---|---|
| TZSC(TrustZone Security Controller) | 周辺回路ごとに Secure / Non-secure、特権 / 非特権を割り当てる |
| MPCBB(Block-Based Memory Protection Controller) | SRAM をブロック単位で Secure / Non-secure に分ける |
| MPCWM(Watermark Memory Protection Controller) | 外部メモリや一部の内部メモリを、境界(ウォーターマーク)で分ける |
| TZIC(TrustZone Illegal access Controller) | 不正アクセスを検出して割り込みを上げる |
TZIC の存在が実務的に重要である.
Non-secure 側が Secure 領域に触れようとしたとき、 単に Fault になるだけでなく、Secure 側に通知される。
これを使うと——
- 攻撃の試行を検知してログに残せる
- 一定回数を超えたら機器をロックする
- サーバにアラートを送る
侵入検知の材料になる。 07 章の分離を「検知」まで広げられる。
07 章との対応
| 07 章の概念 | STM32 の実装 |
|---|---|
| メモリの Secure / Non-secure | SAU(Arm 標準)+ MPCBB / MPCWM |
| 周辺の割り当て | TZSC |
| DMA の分離 | TZSC で DMA を Secure に割り当て、チャネルごとに設定 |
| 割り込みの分離 | NVIC(Arm 標準)+ 一部 TZIC |
| 不正アクセスの検出 | TZIC(Arm 標準にはない付加価値) |
4. 暗号エンジンと乱数
| 機能 | 内容 |
|---|---|
| AES / CRYP | AES-128/192/256。モードは品種による(ECB/CBC/CTR/GCM/CCM) |
| SAES(Secure AES) | サイドチャネル対策を施した AES(09 章)。鍵をハードウェアから直接供給できる |
| HASH | SHA-1/224/256(品種により SHA-384/512、HMAC) |
| PKA(Public Key Accelerator) | RSA、ECDSA、ECDH のモジュラ演算支援 |
| RNG | TRNG。NIST SP 800-90B 準拠を謳う品種がある(08 章) |
| OTFDEC | 外部メモリのオンザフライ復号(06 章) |
SAES と通常の AES の使い分けが重要である.
- SAES: 長期鍵、機器固有鍵、ブート関連 → サイドチャネル対策が必要
- AES(CRYP): 大量データの暗号化 → 速度優先
鍵を扱う処理では必ず SAES を使うこと。 「AES がある」からといって、どちらでも同じではない(08 章)。
また SAES は、HUK から派生した鍵をハードウェア経路で直接受け取れる 構成を持つ品種がある。この場合、CPU が平文の鍵に触れない(06 章)。
OTFDEC
| 特徴 | 内容 |
|---|---|
| 領域ごとに鍵を設定できる | 複数の領域を別々の鍵で暗号化できる |
| XIP のまま使える | 外部フラッシュから直接実行できる |
| 機密性のみ | 完全性は守らない(06 章の注意) |
5. 製品状態(Product State)と Debug Authentication
第 3 世代(STM32H5 など)で導入された、より厳密なライフサイクル管理である。
| 状態 | 内容 |
|---|---|
| OPEN | 全部開いている。開発中 |
| PROVISIONING | プロビジョニング作業中 |
| iROT_PROVISIONED | 不変 RoT のプロビジョニング済み |
| TZ_CLOSED | TrustZone が有効化され、Secure 側が保護されている |
| CLOSED | 通常の運用状態。デバッグは Debug Authentication が必要 |
| LOCKED | 恒久的にロック。デバッグ不可 |
14 章のライフサイクル状態が、そのままここに現れる.
重要なのは CLOSED と LOCKED の違いである。
- CLOSED: 認証すればデバッグを開けられる → RMA に対応できる
- LOCKED: 二度と開けられない → 最高の安全性、だが解析不能
多くの製品では CLOSED が最適解である。
Debug Authentication
| 権限の設計 | 内容 |
|---|---|
| 完全デバッグ | すべてにアクセスできる |
| Non-secure のみデバッグ | Secure 領域は保護されたまま(Renesas の NSECSD 相当) |
| 再生成(regression) | チップを消去して OPEN に戻す。鍵も消える |
「Non-secure のみデバッグ」の権限が実務で有用である.
セキュリティ機能の開発が終わった後、 アプリ開発チームには通常どおりデバッグさせながら、鍵は保護できる(14 章)。
6. SFI — Secure Firmware Install
12 章で触れた、工場に平文を渡さないプロビジョニングの仕組みである。
| 得られるもの | 内容 |
|---|---|
| 知的財産の保護 | 委託先がファームウェアを解析できない |
| オーバービルド対策 | HSM のカウンタで台数を制御(12 章) |
| 鍵の保護 | 工場に平文の鍵を渡さない |
関連する仕組み:
| 名称 | 内容 |
|---|---|
| SFI | 完成したファームウェア全体をセキュアに書き込む |
| SMI(Secure Module Install) | サードパーティのモジュールを、その提供元の鍵で保護したまま組み込む |
| SFIx | 外部フラッシュを含む構成に対応 |
SMI の使いどころ.
「A 社のモータ制御ライブラリと、B 社の通信スタックと、自社アプリを 1 つのイメージにするが、A 社も B 社も互いにコードを見せたくない」
という状況を解決する。サプライチェーンが長い場合に有用である(01 章)。
7. STM32Trust とソフトウェア
| 名称 | 内容 |
|---|---|
| STM32Trust | ST のセキュリティ関連の総称。設計手法・ツール・ドキュメントの体系 |
| STM32TRUSTEE | セキュアサービス(サブスクリプション型の支援を含む) |
| SBSFU | Secure Boot and Secure Firmware Update。第 1・2 世代向けのリファレンス実装 |
| TF-M ポート | 第 3 世代(L5/U5/H5/WBA)向け。PSA 準拠(17 章) |
| RSS(Root Security Services) | システムフラッシュに置かれた、ST 提供の RoT サービス |
| X-CUBE-SBSFU / STM32CubeMX | 設定・生成ツール |
どれを使うかは世代で決まる.
世代 推奨 第 1・2 世代(TrustZone なし) SBSFU 第 3 世代(TrustZone あり) TF-M(PSA 認証を目指すなら特に) TF-M を使うと、17 章で述べたとおり PSA Functional API で書けるので、移植性が上がる。
8. STSAFE — 外付けセキュアエレメント
MCU の機能を補完する、独立したチップである(22 章で詳しく扱う)。
| 製品 | 用途 |
|---|---|
| STSAFE-A シリーズ | 汎用の認証・鍵保管。ECC P-256/384、I2C 接続 |
| STSAFE-TPM | TPM 2.0 準拠 |
| ST33 シリーズ | セキュアマイクロコントローラ(スマートカード系) |
MCU 内蔵機能と外付け SE の使い分け.
用途 選択 ファームウェアの完全性 MCU 内蔵(セキュアブート) 大量データの暗号化 MCU 内蔵(AES アクセラレータ) 機器の長期秘密鍵 外付け SE(物理攻撃耐性が必要なら) クラウド認証の証明書 外付け SE(プロビジョニング済み品が使える) 09 章で述べたとおり、 物理攻撃(クラス 4 以上)を想定するなら、長期鍵は SE に置くのが定石である。
9. STM32 を選ぶときのチェックリスト
| # | 確認項目 |
|---|---|
| 1 | TrustZone が必要か → 必要なら L5/U5/H5/WBA/N6 系(Cortex-M33) |
| 2 | フラッシュ容量は A/B 面 + ブートローダ + TF-M に足りるか(13 章・17 章) |
| 3 | SAES(DPA 対策 AES)を持つか(09 章) |
| 4 | RNG が NIST SP 800-90B 準拠か(08 章) |
| 5 | PKA の性能は起動時間要件を満たすか(05 章・08 章) |
| 6 | OTFDEC が必要か(外部フラッシュを使うか)(06 章) |
| 7 | Debug Authentication に対応しているか(RMA 対応)(14 章) |
| 8 | 製品状態(または RDP)の遷移が量産手順に組み込めるか(14 章) |
| 9 | SFI が使えるか(製造委託する場合)(12 章) |
| 10 | PSA Certified のレベルは(03 章・17 章) |
| 11 | HDP を使って初期化用の秘密を隠せるか(06 章) |
| 12 | TZIC による不正アクセス検出を活用できるか |
10. この章のまとめ
| ポイント | 内容 |
|---|---|
| 世代差 | 第 3 世代(L5/U5/H5/WBA/N6、Cortex-M33)が TrustZone 世代 |
| RDP | Level 1(消せる)と Level 2(不可逆)。古い世代はグリッチ突破の事例あり |
| PCROP | 実行できるが読めない。IP 保護用。定数データを同居させられない |
| HDP | 起動後にアクセスを封じる。初期化用の秘密を隠す(DICE と同じ発想) |
| GTZC | TZSC(周辺)・MPCBB(SRAM)・TZIC(不正アクセス検出) |
| TZIC | Arm 標準にない付加価値。攻撃の検知に使える |
| SAES | サイドチャネル対策 AES。鍵を扱う処理では必ずこちらを使う |
| OTFDEC | 外部フラッシュのオンザフライ復号。完全性は守らない |
| 製品状態 | OPEN → … → CLOSED → LOCKED。CLOSED が多くの製品の最適解 |
| Debug Authentication | 認証すれば開く。Non-secure のみデバッグの権限が実務で有用 |
| SFI / SMI | 工場に平文を渡さない。オーバービルド対策にもなる |
| ソフトウェア | 第 1・2 世代は SBSFU、第 3 世代は TF-M(PSA 準拠) |
次章は NXP を見る。PUF と HAB という、ST とは違う特徴がある。