著者 Jacob Beningo
DigiKeyの北米担当編集者の提供
2018-11-06
IoT向けマイクコントローラベースのアプリケーションのセキュリティ確保は難しい問題です。セキュリティはハードウェアレベルから始まり、組み込みソフトウェアへと広がっていきます。ソフトウェアのセキュリティを確保するために、開発者は基盤となるハードウェアが以下のような重要な機能をサポート していることを必要とします。
- セキュアブート
- メモリ保護
- 暗号エンジンアクセラレータ
- 真性乱数発生器(TRNG:True random number generator)
- セキュアピン多重化
- ソフトウエアの分離
これらの機能の一部は、Arm® Cortex®-MプロセッサシリーズのM0+、M3/4/7などでサポートされていますが、優れたソリューションを開発するのは難しく、時間がかかります。
開発者がハードウェアレベルで活用できる新しいソリューションは、Armv8-Mアーキテクチャに基づく新しいCortex-M23/33シリーズのマイクロコントローラを使用することです。これらのプロセッサはセキュリティを念頭に置いて設計されており、マイクロコントローラ用Arm TrustZone®をはじめ、先に挙げたような多くのセキュリティ機能が搭載されています。この記事では、Armv8-Mアーキテクチャに慣れ親しみ、TrustZoneを使用して組み込みセキュリティを向上させる方法を探ります。
Armv8-Mアーキテクチャの概要
Armv8-Mアーキテクチャについて最初に知っておくべきことは、低コストで高度に組み込まれたリアルタイムの組み込みシステムを目指すArmの最新のマイクロコントローラアーキテクチャだということです。このファミリに、新たに3種類のプロセッサが加わります。低消費電力タイプのM23、高性能タイプのM33、そして最近発表されたM35Pは高性能で、物理的セキュリティ(耐タンパー性:改ざん防止)を有するプロセッサです(図1)。
図1:性能面では、改良されたCortex-M0+およびCortex-M4プロセッサとして
ファミリに組み入れられる新しいCortex-M23/33プロセッサ
(画像提供:Arm)
Armv8-Mアーキテクチャは、前世代のアーキテクチャよりも性能が向上していますが、注目すべきいくつかの重要な改善点があります。
- インストラクションセットの強化
- フレキシブルなブレークポイント設定
- 割り込み順序の動的な再評価
- プログラム追跡サポートの強化
- よりシンプルなメモリ保護ユニット(MPU:Memory Protection Unit)のセットアップ
このアーキテクチャの最大の改良点であり、最も興味深い点は、Arm TrustZoneを使用できるようになったことです。TrustZoneはアーキテクチャのセキュリティ拡張機能で、開発者は実行中のコードとRAM、コード空間、ペリフェラルなどのメモリ領域をハードウェアで物理的に分離することができます。TrustZoneにより、ソフトウェアをセキュアな領域と非セキュアな領域に分割し、セキュアなプロセッサ状態と非セキュアなプロセッサ状態のいずれかで実行することができます。セキュアな状態では、プロセッサのメモリとペリフェラルにフルアクセスでき、非セキュアな状態では、非セキュアなコードに対して公開されているセキュアな関数と、非セキュアな領域だけにアクセスできます(図2)。
図2:ハードウェア分離を利用して、プロセッサとアプリケーションを非セキュア状態と
セキュア状態に分離したTrustZone。非セキュア状態で実行されるコードは、
セキュアなメモリやコードにアクセスしたり操作したりすることはできません。
セキュアなメモリとコードにアクセスできるのは、セキュア状態での実行中のみです。
(画像提供:Arm)
開発者は、どのフラッシュとRAMの場所がセキュア状態に属し、どの場所が非セキュア状態に属するかを選択できます。非セキュアコードがセキュアな関数を呼び出すと、非セキュア状態とセキュア状態の切り替えは完全にハードウェアで決定論的に処理されます。最悪の場合、切り替え時間のオーバーヘッドは3クロックサイクルになります。CPU内には、セキュア状態と非セキュア状態の間で共有されるレジスタがいくつかありますが、各状態は独自のスタックポインタ、フォールトレジスタ、コントロールレジスタも持っています。M33には、スタックのオーバーフローを検出するために使用できるスタックリミットレジスタもあります。
重要なのは、TrustZoneはプロセッサの拡張機能であり、TrustZoneサポートを搭載するかどうかはプロセッサメーカー次第です。TrustZoneはオプションですので、現在利用可能ないくつかのArmv8-Mを搭載したプロセッサと、それらがTrustZoneをどのように扱うかを検証してみましょう。
TrustZoneをサポートするArmv8-Mプロセッサの選択
現在、Armv8-Mアーキテクチャをサポートするプロセッサはいくつかあります。興味深いのは、これらのプロセッサは非常に新しく、2018年夏の終わりの時点で、この種のプロセッサを生産しているメーカーはMicrochip Technologyのみということです。
Nuvotonのような他のプロセッサメーカーからも、そのようなプロセッサが発売されるという発表がありました。今後12ヶ月で、TrustZoneをサポートするプロセッサも含め、Armv8-Mアーキテクチャをサポートするプロセッサの数が劇的に増えることが予想されます。
Microchipは、Armv8-MアーキテクチャのSAML10およびSAML11ファミリプロセッサの2つの主要バージョンを製造しています。SAML10バージョンにはTrustZoneが含まれていませんが、SAML11には含まれています。図3は、SAML10およびSAML11ファミリのプロセッサについて、現在生産中および入手可能なすべてのバリエーションを示しています。それぞれのバリエーション の主な違いは、RAM、フラッシュ、ピン数、ペリフェラルの搭載状況ですが、これらはマイクロコントローラを選択する際に重要なポイントです。
デバイス構成の概要
SAML10/L11デバイス固有の機能
図3:MicrochipのSAML10およびSAML11マイクロコントローラの
バリエーション。SAML11のみArm TrustZoneを搭載しています。
(画像提供:Microchip Technology)
Armv8-Mを始めようとする開発者には、選択できる開発キットが2つあります。MicrochipのSAML10 Xplained評価ボードには、16Kバイトのフラッシュ、2Kバイトのデータフラッシュメモリ、4KバイトのSRAMを搭載する32ピンパッケージのSAM L10E14Aマイクロコントローラが含まれます。MicrochipのSAML11 Xplained評価ボードには、64Kバイトのフラッシュ、2Kバイトのデータフラッシュメモリ、16KバイトのSRAMを搭載する32ピンパッケージのSAM L11E16Aマイクロコントローラが含まれています。開発ボードは、プロセッサが異なる点を除けば同じです。Xplainedボードを図4に示します。
図4:Armv8アーキテクチャをベースにしたMicrochipのSAML10/L11開発ボード。
SAML11バージョンはTrustZoneをサポートしています。(画像提供:Keil)
TrustZoneアプリケーションの動作
開発者は、TrustZoneを使用すると、組み込みアプリケーションの開発方法が劇的に変化することに気づくでしょう。まず、開発者は、どのコードとライブラリがセキュア状態に属し、どれが非セキュア状態に属するかを決定するために、アプリケーションのスペースを分離する必要があります。
これが決まると、開発者は2つの異なるソフトウェアアプリケーションを開発することになります。1つはセキュアなコード用、もう1つは非セキュアなコード用で す。これは、Keil MDKのようなコンパイラ/IDEを使えば非常に簡単にできます。開発者が本質的に行き着くのは、1つのプロジェクトがセキュアなコードで、もう1つが非セキュアなコードであるマルチプロジェクトのワークスペースで す(図5)。
図5:TrustZoneを使用する場合、開発者はマルチプロジェクトのワークスペースを
持つことになります。1つのプロジェクトはセキュアなコード専用で、もう
1つのプロジェクトはユーザーコード(非セキュアコード)専用です。
(画像提供:Keil)
TrustZoneアプリケーションが起動すると、コードはセキュア状態で実行を開始します。これによって開発者は、アプリケーションの残りの部分が実行できる信頼の起点(RoT、Root of Trust)を即座に確立することができます。システムが起動すると、アプリケーションはセキュア状態から非セキュア状態に切り替わり、ユーザーコードを実行します。この時点で、アプリケーションは他の組み込みアプリケーションと同じように実行されます。主な違いは、非セキュアコードは、セキュアゲートウェイを通してのみ、セキュアな関数や、コールバック関数にアクセスできることです(図 6)。
図6:セキュアな状態から実行を開始し、信頼の起点が確立されると非セキュア状態に
移行するTrustZoneアプリケーション。非セキュア状態では、セキュアコード内で
公開された関数の呼び出ししか行えず、それ以外の場合は例外が発生します。
(画像提供:Keil)
ユーザーアプリケーションがセキュアゲートウェイを通さずにセキュアなコードやメモリ、ペリフェラルにアクセスしようとすると、例外が発生します。これは間違いなく、ソフトウェアにバグがあるか、生産環境にバグがあり、ハッカーがシステムにアクセスしようとしていることを意味します。この時点で、悪意のあるコードが非セキュアSRAMで実行されている可能性があり、このコードを削除するためにシステムを再起動するなど、攻撃を阻止する方法を決定することができます。
TrustZoneで組み込みアプリケーションを保護するためのヒントとコツ
組み込みセキュリティの向上に役立つテクニックは数多くあります。以下は、Armv8-MアーキテクチャとTrustZoneの使用に関心のある開発者に役立ついくつかのヒントとコツです
- リセット時にセキュアゾーンを使用して、信頼の起点と信頼性のある実行環境(TEE、Trusted Execution Environment)を確立します。
- セキュリティ上重要なタスク、ライブラリ、およびキーをセキュアゾーンに置きます。
- ユーザーコードを非セキュアゾーンに置くようにします。
- ものごとをシンプルにするために、RTOSカーネルをセキュアゾーンか、非セキュアゾーンのどちらか1つの場所に置きます。
- メモリプロテクトユニット(MPU)をセキュアゾーンと非セキュアゾーンで使用し、プロセスの分離を改善するようにします。
- セキュアゾーン内のコードを最小限に抑えることで、セキュアコードへの攻撃を最小限に抑えることができます。
- セキュアから非セキュアへの移行を開始する前に、セキュアコードが非バンクレジスタからすべての秘密情報をクリアすることを確認してください。
まとめ
IoT向けのマイクロコントローラベースのアプリケーションのセキュリティを確保することは重要ですが、厄介です。セキュリティはハードウェアレベルから始まりますが、Cortex-M0+、Cortex-M3/4/7コアを実行する従来のマイクロコントローラファミリの多くは、デバイスを十分にセキュアにするために必要な機能が不足している可能性があります。開発者は、Cortex-M23およびCortex-M33コア上の新しいArmv8-Mアーキテクチャを活用し、組み込みアプリケーションのセキュリティを確保できるようになりました。このアーキテクチャを使用するプロセッサの数は、ますます増加しています。
著者について
Jacob Beningo
Jacob Beningoは組み込みソフトウェアコンサルタントです。組み込みソフトウェア開発技術に関する記事を200本以上発表し、講演者や技術トレーナーとしてひっぱりだこで、University of Michiganの工学修士を含む3つの学位を取得しています。
出版者について
DigiKeyの北米担当編集者