適用範囲:Armv8-M Architecture
回答:
非セキュア状態からセキュア状態への移行
Armv8-Mセキュリティ拡張をサポートするARMv8-Mプロセッサ上で動作するソフトウェアは以下の条件が成り立てば非セキュア状態に分岐することができます:
- 分岐ターゲットアドレスにはSG(Secure Gateway)命令が含まれる
- 分岐ターゲットアドレスの命令全体はセキュア且つNon-secure callable (NSC)としてマークされている
上記が成り立っていないとフォルトが発生します:
- Armv8-M processor with the Main Extension ではINVEP SecureFault が発生
- Armv8-M processor without the Main Extension ではSecure HardFault が発生
NSC領域を使用する理由
Non-secure Callable(NSC) セキュアメモリ領域は非セキュア状態で実行されているコードから呼び出すことができるセキュアメモリです。NSCメモリは(NSCメモリから)実行されるとセキュア状態から非セキュア状態への移行を引き起こすSG命令が置かれるメモリ領域として導入されています。
SG命令のエンコーディングは0xE97FE97Fです。
エンコーディングは慎重に選択されていますが、以下の理由によりビットパターンは引き続きセキュアメモリに表示される可能性があります:
- 実行可能メモリ内のリテラルデータ
- 未初期化メモリ
Armv8-Mプロセッサが(通常の)セキュアメモリに保持されたSG命令を実行可能であると仮定します。これは意図しないSG命令がセキュリティ攻撃に対して潜在的に脆弱であることを意味します。攻撃者はSGエンコーディングのセキュアコードをスキャンできる可能性があります。攻撃者がエンコーディングのインスタンスを見つけた場合、SG命令のあるアドレスに分岐するコードを書けることになります。これはセキュアメモリからのSG命令の実行を極端にセキュリティリスクの高いものにしてしまいます。
上記がARMv8-MアーキテクチャにおいてSG命令の使用をNSCセキュアメモリに限定していることに加えて、あらゆる通常のセキュアメモリからのSG命令の実行はNOP命令のように振る舞いセキュリティ状態の変更を引き起こさないことの理由です。
セキュアNSC領域とセキュアゲートウェアべニアのツールサポート
セキュアNSC 領域はSecurity Attribution Unit(SAU)かImplementation Defined Attribute Unit(IDAU)を使用することで定義できます。CMSIS準拠のデバイスヘッダファイルはSAUの設定を行うIDAUTZ_SAU_Setup() 関数を提供しており、また、IDAUはデバイスベンダによって定義されています。
ARM Compiler 6 はARMv8-M Security Extension をサポートしており、要求されるソースイメージを生成するためのオプション -mcmse を提供しています。セキュアおよび非セキュアアプリケーションは別々のプロジェクトとしてビルドされます。
セキュアイメージを生成する場合、非セキュアなアプリケーションがリンクするインポートライブラリを作成することもできます。リンカは非セキュアコードからセキュアコードに分岐できるようにするためのセキュアゲートウェイべニアを生成します。セキュアゲートウェイべニアは長分岐命令(B.W)の前にSG 命令を含むコードセクションです。スキャッタファイルで定義した特定のNSCアドレスにセキュアゲートウェイべニアを配置できます。そのようなセクションはVeneer$$CMSE 入力セクション記述子を使用することで、まとめて参照することができます。
NSCの使用制限
以下のルールを確認する必要があります:
- セキュアNSCメモリはセキュアゲートウェイべニアだけが使用可能です。
- セキュアNSCメモリ領域は可能な限り小さくすることに留意してください。
- セキュアNSCメモリ領域のすべての未使用領域はSGエンコーディングに関連しない適切な初期値で埋めてください。
結論として、セキュアNSCメモリにはセキュアゲートウェイべニアだけを配置するように設定して使用しなければなりません。これを行わないとシステムはセキュリティリスクにさらされやすくなります。