IoT Security 17 · Arm のセキュリティアーキテクチャ

Chapter 17

Arm のセキュリティアーキテクチャ

この章がなぜ必要なのか——Arm が業界の共通語だから.

IoT 向け MCU の大多数が Arm コアを採用している。 そして各社の「独自機能」の多くは、Arm が定めた枠組みの上に載っている。

だから Arm の考え方(TrustZone-M、PSA、TF-M)を先に理解すると、 18 章〜21 章の各社の説明が「その会社流の実装」として整理できる。

注意: 以下は執筆時点の公開情報に基づく概観である。 具体的な対応状況は、必ず対象品種のデータシートと Arm の公式資料で確認すること。

この章で使う既出の用語(定義は各リンク先). セキュアブート(02 章 3 節)、PSA-RoT(04 章 2 節)、物理攻撃(04 章 6 節)、不可(06 章 1 節)、GTZC(07 章 3 節)、NSPE(07 章 4 節)、Non-secure(07 章 3 節)、SPU(07 章 3 節)、Secure(07 章 3 節)、TrustZone(07 章 2 節)、ポインタ検証(07 章 8 節)、両方(07 章 3 節)、CryptoCell(08 章 5 節)、キャッシュ(09 章 1 節)、必要(09 章 6 節)、消費電力(09 章 1 節)、ECDSA(10 章 2 節)、Nordic(11 章 4 節)、NXP(12 章 3 節)、Renesas(12 章 3 節)、認証付きデバッグ(14 章 3 節)、開発(14 章 5 節)、Rust(15 章 3 節)、要件(15 章 8 節)、RAM(16 章 3 節)、フラッシュ(16 章 3 節)、ポート(16 章 6 節)

1. Arm のセキュリティ製品群の地図

Arm のセキュリティ機能マップ

コアや機能を選ぶと、それが何を提供し、どの章の概念に対応するかが表示される。

層名称内容
アーキテクチャTrustZone-M(Armv8-M)Secure / Non-secure の分離(07 章)
アーキテクチャTrustZone-A(Armv7-A/v8-A)アプリケーションプロセッサ向けの分離
アーキテクチャPACBTI(Armv8.1-M)制御フロー保護(15 章)
アーキテクチャCCA / RME(Armv9-A)Realm による、ハイパーバイザからも隔離された実行環境
IPCryptoCell / CryptoIsland暗号サブシステム。ベンダが SoC に組み込む
仕様PSA(Platform Security Architecture)セキュリティ要件・API・認証の枠組み
実装Trusted Firmware-M / -A参照実装(オープンソース)
仕様ADAC認証付きデバッグ(11 章)
認証PSA Certified第三者評価プログラム(03 章)

2. Cortex-M のセキュリティ機能の世代

コアアーキテクチャTrustZone特記事項
Cortex-M0/M0+/M1Armv6-MなしMPU(オプション)
Cortex-M3/M4/M7Armv7-MなしMPU。現役だが新規設計では推奨しにくい
Cortex-M23Armv8-M Baselineあり低消費電力。TrustZone 入門
Cortex-M33Armv8-M Mainlineあり最も広く使われる。DSP / FPU オプション
Cortex-M35PArmv8-M Mainlineあり物理セキュリティ機能(耐タンパ、パリティ)を追加
Cortex-M55Armv8.1-MありHelium(MVE)。AI 向け。PACBTI 対応
Cortex-M85Armv8.1-Mあり高性能。PACBTI 対応

新規設計で TrustZone が欲しいなら、Cortex-M33 が現実的な第一候補である.

ほぼすべての主要ベンダが M33 ベースの品種を持っている。

Cortex-M35P の位置づけ

M33 に物理攻撃対策を加えたコアである。

機能内容
命令キャッシュのパリティビット反転の検出
アンチタンパリング機能物理攻撃の検出支援
(実装依存の追加機能)ベンダが組み合わせる

ただし「M35P を選べば物理攻撃に強い」わけではない.

コアだけでなく、メモリ・暗号エンジン・電源系まで含めた SoC 全体の設計が要る。 実際の耐性は、PSA Certified Level 3 や CC の取得状況で判断すること(03 章)。

PACBTI(Armv8.1-M)

15 章で触れた制御フロー保護である。

機能内容
PAC戻りアドレスに認証コードを付与。改ざんを検出
BTI間接分岐の飛び先が正当な landing pad かを検証

ROP / JOP 攻撃への直接的な対策であり、 メモリ安全性のバグを実際の攻撃に変換することを困難にする。

コンパイラの -mbranch-protection=standard で有効化する。

3. TrustZone-M の実装詳細

07 章で概念を扱ったので、ここでは実装に関わる点を補う。

SAU と IDAU の関係

SAU と IDAU — アドレスの属性はどう決まるかアドレス X へのアクセスIDAUシリコンで固定。変更不可SAUソフトウェアで設定できるより制限の強いほうが勝つSecure / NSC / Non-secureSAU で緩めてもIDAU の制限は外せない
SAU の設定を間違えても、IDAU より緩くはできない。安全側に倒れる設計になっている
ユニット誰が決めるか変更
IDAUチップベンダがシリコンに実装不可
SAUソフトウェア(Secure 側のみ)可能(起動時に設定)

IDAU の設計はベンダごとに大きく違う.

よくあるのは、アドレスのビット 28(0x1000_0000)で Secure / Non-secure を分ける方式である。

同じフラッシュが 2 つのアドレスに見える(エイリアス)0x0800_0000Non-secure から見たフラッシュ0x0C00_0000Secure から見た同じフラッシュ物理的には同じ領域リンカスクリプトとデバッガでアドレスが食い違うのは、たいていこれが原因
bit 28 が属性を表す。同じ内容が別アドレスで見えるので、慣れるまでは混乱の元になる

つまり同じ物理メモリが 2 つのアドレスに見える。 この「エイリアス」の理解が、TrustZone-M 開発の最初の壁になる。

どのアドレスが何にマップされるかは、必ずベンダのリファレンスマニュアルで確認すること。

開発ツールの対応

項目内容
プロジェクトの分割Secure プロジェクトと Non-secure プロジェクトを別々にビルドする
インポートライブラリSecure 側が --out-implib で生成し、Non-secure 側がリンクする
CMSE の属性__attribute__((cmse_nonsecure_entry)) で入口関数を宣言
ベニア (veneer)コンパイラが NSC 領域に自動生成する
デバッグ両方のプロジェクトを同時にデバッグできる環境が必要
/* Secure 側: Non-secure から呼べる関数 */
#include <arm_cmse.h>

int32_t __attribute__((cmse_nonsecure_entry))
secure_get_random(uint8_t *buf, size_t len)
{
    /* ★ ポインタ検証([07 章](07_分離.md#越境時の注意点)) */
    if (cmse_check_address_range(buf, len,
            CMSE_NONSECURE | CMSE_MPU_READWRITE) == NULL) {
        return -1;
    }
    return trng_read(buf, len);
}
/* Non-secure 側: 生成されたヘッダをインクルードして普通に呼ぶ */
#include "secure_interface.h"

uint8_t buf[32];
if (secure_get_random(buf, sizeof(buf)) != 0) { /* エラー処理 */ }

4. PSA — Platform Security Architecture

Arm が定めた、IoT セキュリティの包括的な枠組みである。

4 つの段階

段階内容
Analyze脅威モデル(Threat Model and Security Analysis, TMSA)を作る(02 章)
Architectセキュリティ要件を満たすアーキテクチャを設計する
ImplementTF-M などで実装する
CertifyPSA Certified で第三者評価を受ける(03 章)

PSA の 10 のセキュリティ目標

PSA Certified Level 1 の質問票は、次の目標に沿っている。

#目標
1一意の識別(Unique Identification)
2セキュリティライフサイクル(14 章)
3アテステーション(04 章)
4セキュアブート(05 章)
5セキュア更新(13 章)
6アンチロールバック(13 章)
7分離(07 章)
8インタラクション(分離間の安全な通信)
9暗号サービス(08 章)
10セキュアストレージ(06 章)

この 10 項目が、本シリーズの第 II 部〜第 IV 部とほぼ一致する.

偶然ではない。PSA は、組み込みセキュリティの合意された要件集として 広く参照されており、業界の共通認識になっている。

自社の設計をレビューするとき、この 10 項目でチェックするのは有効である。

PSA-RoT と ARoT

PSA の階層構造NSPE(Non-secure Processing Environment)アプリケーション、RTOS、通信スタックPSA Functional APISPE(Secure Processing Environment)ARoT(Application Root of Trust)アプリ固有のセキュアサービス。ベンダや顧客が追加するPSA-RoT(PSA Root of Trust)Crypto・ITS・Attestation・Firmware Update。最も特権が高いので最小限に保つ特権の高い層ほど小さくする——RoT 設計の一般原則がそのまま構造になっている
PSA-RoT に何でも入れてはいけない。追加したいものは ARoT に置き、PSA-RoT は薄いままにする

PSA-RoT と ARoT を分けるのは、07 章の「Secure 側を小さく保つ」の実装である。

5. PSA Functional API

Arm が定めた、移植性のあるセキュリティ API 群である。

API用途
PSA Crypto API暗号処理全般。鍵はハンドルで管理
PSA Internal Trusted Storage (ITS)チップ内蔵の保護ストレージ
PSA Protected Storage (PS)外部メモリでも使えるよう暗号化して保存
PSA Initial Attestation APIアテステーショントークンの生成
PSA Firmware Update APIセキュア OTA の制御

PSA Crypto API の設計

#include "psa/crypto.h"

psa_crypto_init();

/* 鍵の属性を設定 */
psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_HASH);
psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
psa_set_key_bits(&attr, 256);
psa_set_key_lifetime(&attr, PSA_KEY_LIFETIME_PERSISTENT);   /* 不揮発に保存 */

/* ★ チップ内で鍵を生成する([12 章](12_プロビジョニング.md#方式-b-機器の中で生成する-推奨)の方式 B) */
psa_key_id_t key_id;
psa_generate_key(&attr, &key_id);

/* 使う: 鍵の値は返ってこない */
uint8_t sig[64]; size_t sig_len;
psa_sign_hash(key_id, PSA_ALG_ECDSA(PSA_ALG_SHA_256),
              hash, 32, sig, sizeof(sig), &sig_len);

この API の優れた点を整理しておく.

点内容
鍵をハンドルで扱う平文の鍵がアプリケーションのメモリに現れない(06 章)
用途を宣言するPSA_KEY_USAGE_SIGN_HASH だけなら、暗号化には使えない
アルゴリズムを固定する鍵ごとに 1 つ。アルゴリズム混同攻撃を防ぐ
ハードウェアに透過的実装がアクセラレータを使うかは API に現れない
セキュアエレメントも同じ APIドライバを差し替えるだけ(22 章)

「危険な使い方ができない API」を設計することが、最良の防御である。

PSA Crypto API と移植性

PSA Crypto API は Mbed TLS の標準 API になった(Mbed TLS 3.x 以降)。 つまり TrustZone がないチップでも、同じ API で書ける。

PSA API で書いておくと移行できる今:Cortex-M4 + Mbed TLSPSA Crypto API で書く。実装はソフトウェア移行後:Cortex-M33 + TF-M同じ API のまま、実装が SPE 側に移る★ アプリケーションコードを変えずに移行できる自前の暗号ラッパを書いてしまうと、この道が閉じる
TrustZone がないチップでも、最初から PSA Crypto API で書いておく。将来の移行コストがほぼゼロになる

これは実務上、非常に大きな利点である。

6. Trusted Firmware-M(TF-M)

PSA の参照実装であり、事実上の標準になりつつある。

構成要素役割
SPM(Secure Partition Manager)セキュアパーティションの管理、IPC
BL1 / BL2(MCUboot ベース)セキュアブート(05 章)
Crypto ServiceMbed TLS ベースの暗号サービス
ITS / PSセキュアストレージ
Initial AttestationPSA トークンの生成
Firmware UpdateOTA の制御
Platform Serviceベンダ固有の機能(リセット理由、NV カウンタなど)

分離レベル

レベル内容
Isolation Level 1SPE と NSPE の分離のみ
Isolation Level 2+ PSA-RoT と ARoT の分離
Isolation Level 3+ 各セキュアパーティション同士も分離

PSA Certified Level 2 以上では、Isolation Level 2 以上が要求される.

Level 3 は、Secure 側のパーティション同士も MPU で隔離するので、 「あるセキュアサービスの脆弱性が、他に波及しない」。 その分、実装と設定が複雑になり、性能オーバーヘッドも増える。

TF-M を使うか、自作するか

選択評価
TF-M を使う認証取得が楽。移植性が高い。推奨
ベンダの独自 SPEベンダの機能に最適化されている。移植性は低い
自作強く非推奨。TrustZone の落とし穴が多すぎる(07 章)

TF-M のコストも認識しておくこと.

小さなセンサノードには重すぎることがある。 その場合は「TrustZone は使うが TF-M は使わず、最小限の Secure 側を書く」 という選択もありうる。ただし認証取得は難しくなる。

7. Cortex-A のセキュリティ

IoT ゲートウェイやエッジ AI 機器では Cortex-A が使われる。

機能内容
TrustZone-ASecure World / Normal World。EL3 のモニタが切り替える(07 章)
OP-TEE代表的な TEE OS。GlobalPlatform API に準拠
TF-A(Trusted Firmware-A)EL3 のファームウェア。BL1/BL2/BL31 の構成
PAC / BTI(Armv8.3/8.5-A)制御フロー保護
MTE(Memory Tagging、Armv8.5-A)メモリ安全性のハードウェア支援
CCA / RME(Armv9-A)Realm。ハイパーバイザからも隔離される

MTE — メモリ安全性への画期的なアプローチ

MTE — メモリにタグを付けて不正アクセスを検出する16 バイトタグ 316 バイトタグ 316 バイトタグ 716 バイトタグ 316 バイトタグ 316 バイトタグ 3ポインタの上位ビット:タグ 3タグが一致しなければ FaultUse-after-free とバッファオーバーフローが、実行時に確率的に検出される
ソフトウェアの書き換えなしにメモリ安全性を上げる仕組み。Cortex-A 系で先行し、組み込みにも降りてきつつある

MTE は、C/C++ のメモリ安全性問題への現実的な緩和策である.

Rust への全面移行が難しい既存コードベースに対して、 再コンパイルだけで(ほぼ)メモリ安全性を得られる。

現時点では主に高性能な Cortex-A で利用可能だが、 将来的に組み込み向けに降りてくる可能性がある技術として、押さえておく価値がある。

Armv9-A CCA

Arm CCA — Realm World の追加従来Normal Worldハイパーバイザ / ゲスト VMSecure WorldTEEハイパーバイザはゲストの中身を見られるCCANormal Worldハイパーバイザ / ゲスト VMSecure WorldTEERealm World ★ 新設ハイパーバイザからも見えないクラウド事業者からも中身を守る
「インフラ提供者すら信頼しない」方向への拡張。組み込み単体よりは、エッジ/クラウド寄りの話

クラウドやエッジで、「インフラ提供者からもデータを守る」ための機構である。 IoT ゲートウェイでも、マルチテナントのワークロード分離に使える可能性がある。

8. Arm 系を選ぶときの確認事項

確認項目見るところ
コアの世代TrustZone が要るなら Armv8-M(M23/M33/M55/M85)
PACBTIArmv8.1-M(M55/M85)が必要
IDAU の設計ベンダのリファレンスマニュアル。エイリアスアドレスの構成
周辺・DMA の分離ベンダ独自のコントローラ(GTZC / SPU / AHB Secure Controller など)
TF-M の対応ベンダが公式にポートを提供しているか。バージョンの追従状況
PSA CertifiedLevel 1 / 2 / 3 のどれを取得しているか(03 章)
PSA Functional API 認証Crypto API などの適合試験に通っているか
暗号 IPCryptoCell か、ベンダ独自か。DPA 対策の有無
ADAC認証付きデバッグに対応しているか(11 章・14 章)

PSA Certified の取得レベルは、必ず PSA Certified の Web サイトで確認すること.

ベンダの資料に「PSA Certified」とだけ書かれていても、 Level 1 なのか Level 3 なのかで意味がまったく違う。

また、「チップが認証されている」ことと「あなたの製品が認証される」ことは別である。 チップの認証は土台であって、その上のソフトウェアは別途評価される。

9. この章のまとめ

ポイント内容
なぜ Arm から業界の共通語。各社の独自機能はこの枠組みの上に載る
TrustZone-MArmv8-M(M23/M33/M35P/M55/M85)。新規設計なら M33 が第一候補
M35P物理セキュリティ機能を追加。ただしSoC 全体の設計と認証で判断する
PACBTIArmv8.1-M(M55/M85)。ROP 攻撃への直接的な対策
IDAUベンダ固定。エイリアスアドレスの理解が最初の壁
PSA の 10 目標本シリーズの第 II〜IV 部とほぼ一致。設計レビューのチェックリストに使える
PSA Crypto API鍵をハンドルで扱う。危険な使い方ができない API 設計
移植性Mbed TLS 3.x も PSA Crypto API。TrustZone なしから移行できる
TF-M参照実装。認証取得が楽だが、フラッシュと RAM を相応に消費する
Cortex-ATrustZone-A + OP-TEE。MTE はメモリ安全性の画期的な緩和策
確認事項PSA Certified のレベルを必ず公式サイトで確認する

次章から、具体的なベンダの実装を見ていく。まず STMicroelectronics。