はじめに
IoT機器が増える中、IoT機器への不正操作が問題となっています。
IoT機器へのセキュリティ対策の1つとして有効な最新ArmアーキテクチャArmv8-Mのセキュリティ機能「TrustZone」を実際に使ったデモを作成したときの記録を備忘録を兼ねてまとめてみました。
デモでは外部との通信を行う部分(下図の非セキュア空間)がバッファオーバフローなどで不正プログラムが実行されても、カメラなどのデバイスを制御する部分(下図のセキュア空間)は守られるという使い方を想定しています。
Armv8-MのTrustZoneを実際に使ってみたい方のお役に立てればと思い公開しました。
Armv8-MやTrustZoneなどの説明は割愛します。
記事は数回に分けて連載する予定です。第一回は、動作環境とデモ構成について記述します。
動作環境
Armv8-MアーキテクチャのMCUとして、Cortex-M23をコアするNuvotonのM2351を使用しました。
以下の環境でデモを構築し動作させました。
項目 | 使用した環境 |
---|---|
MCU | Nuvoton M2351 (Cortex-M23) |
評価ボード | Nuvoton NuMicro M2351 v1.3 |
RTOS | 富士通コンピュータテクノロジーズ μT-Kernel |
IDE | IAR EWARM 8.40.1 |
ホストマシン | Microsoft Windows8.1 |
デモ構成
M2351内をセキュア空間と非セキュア空間に分け、セキュア空間にセキュア用カーネルを、非セキュア空間に非セキュア用カーネルをそれぞれ配置します。
以下の図がデモ構成のイメージです。
M2351では各デバイス毎に、セキュアモードで使用するのか、非セキュアモードで使用するのかを設定できます。
デモではセキュア空間に配置するカメラなどに相当するデバイスとしてLEDを使用し、非セキュア空間に配置する外部との通信デバイスとしてUSBを使用します。
LEDを制御するタスクとしてセキュア用カーネル内にLED制御タスクを設け、LED制御タスクは1秒毎にLEDの点滅を繰り返します。
USBを制御して通信を行うタスクとして非セキュア用カーネル内にUSB通信/制御タスクを設け、USB通信/制御タスクはパソコンからのコマンド受信およびその結果の送信を行います。
デモ構成のメモリマップ
セキュア用カーネルが内蔵FlashからXIPで起動し、SRAM上に非セキュア空間を割当て、その非セキュア空間に非セキュア用カーネルを内蔵Flashからロードする仕組みにしています。
M2351には512Kbytesの内蔵Flash, 96KbytesのSRAMが搭載されており、デモでは以下のようなメモリマップで構成します。
アドレス | 用途 |
---|---|
0x00000000-0x0000ffff | セキュアカーネルROM実行空間 |
0x00010000-0x0001ffff | 非セキュアカーネルのロードモジュール置場 |
0x20000000-0x20007fff | セキュアカーネルRAM空間 |
0x30008000-0x3000ffff | 非セキュアカーネルROM実行空間 |
0x30010000-0x300177ff | 非セキュアカーネルRAM空間 |
0x30017800-0x30017fff | 共有メモリ空間 |
次回(第二回)はセキュアカーネルの作成について記述します。
『各種製品名は、各社の製品名称、商標または登録商標です。本記事に記載されているシステム名、製品名には、必ずしも商標表示((R)、TM)を付記していません。』