後藤弘茂のWeekly海外ニュース

ARMの新セキュリティアーキテクチャ「ARMv8-M TrustZone」

IoT時代に向けたセキュリティアーキテクチャ

 ARMは、IoT(The Internet of Things)時代に向けて、組み込み用のMCU(Microcontroller)にもセキュリティ機能を組み込んだ。IoTデバイスからクラウドまで、エンドツーエンドのセキュアなプラットフォームを実現するためだ。ARMがもっとも気を配ったことは、組み込みMCUのコストと電力、メモリの枠内で、簡単に扱うことができるセキュリティ機能を実装すること。そのために、新命令セット「ARMv8-M」に、MCUに最適化したバージョンのセキュリティアーキテクチャ「TrustZone」を組み込んだ。

 ARMが10月に発表した、新世代のCortex-Mプロセッサファミリ「Cortex-M23」と「Cortex-M33」は、ARMv8-Mの初のプロセッサIPだ。Cortex-M23/33では、オプションでTrustZone for ARMv8-Mを実装することができる。また、ARMはTrustZoneに対応できるCortex-M23/33プロセッサコアIPだけでなく、さまざまなTrustZone対応システムIPも提供する。SoC(System on a Chip)全体のシステムとしてTrustZoneソリューションを提供する。

ARMはTrustZone対応のCortex-Mコアだけでなく、システムIPを含めて提供する
ARMは統合的なソリューションとしてTrustZoneをCortex-Mに提供する
Cortex-MのTrustZoneによってIoTデバイスにセキュリティを実装することが容易になる
ARMはTrustZone対応のmbed OSも含めたハードウェアとソフトウェアの統合ソリューションを提供する

 Cortex-MのTrustZoneは、PCやスマートフォン向けのセキュリティアーキテクチャとはかなり異なる仕組みを取っている。これは、実装に必要なダイエリアやメモリ、性能を最小に抑えるためだ。Cortex-MのTrustZoneは、以前から提供されることが業界では噂されていた。

既存のCortex-Mの実行モードを拡張

 ARMのCortex-M MCUには、もともと2つの実行モードがある。ハンドラモード(Handler Mode)とスレッドモード(Thread Mode)だ。やや馴染みが薄い用語だが、話は簡単で、ハンドラが例外処理モード、スレッドモードが通常の動作状態だ。例外処理要求でハンドラモードに入り、割り込みハンドラを実行して、終了したら通常実行のスレッドモードに戻る。割り込みハンドラが動作する状態を、ハンドラモードと定義している。

 ARMv8-Mでは、この2モードそれぞれにセキュリティ保護状態のセキュアステイトと、従来通り保護されていない非セキュアステイトを設ける。利点は、従来の非セキュア側のソフトウェアスタックからは、ほぼ同じふるまいに見えることだ。プログラミングモデルに優しい実装となっている。

非セキュアステイトで走るソフトウェアからは従来とほぼ同じに見える

 しかし、セキュアモニタが介在しないARMv8-MのTrustZoneでは、ハードウェアで分離されたセキュアステイトと非セキュアステイトの間の遷移ができない。そこで後述するが、ARMv8-M TrustZoneでは、モニタを介さないでダイレクトにドメインをまたいでファンクションコールを行ないながら、セキュリティも守る仕組みを取り入れた。これによって、低レイテンシのステイト遷移が可能になったという。

セキュアモニタを介さないARMv8-MのTrustZoneは、組み込みのレイテンシの水準でステイトの移行が可能

メモリアドレスベースでセキュリティ保護を行なう

 Cortex-M23/33でのTrustZoneの実装は、プロセッサのメモリマップを見ると分かりやすい。セキュリティ保護がアドレスベースで行なわれるからだ。

 Cortex-Mファミリでは、もともと32-bitのリニアアドレス空間4GBを、特定の用途毎にリージョン分割している。大まかには0.5GBまたは1GBずつ分割しており、それぞれ規定されているメモリアクセスの挙動が異なる。用途的にはフラットに解放された部分がほとんどのPC向けCPUとは大分異なるメモリ空間となっている。そして、ARMv8-MのTrustZoneでは、このメモリマップが従来と異なる。

 非セキュアステイト側から見えるメモリマップは、大まかな区分は、従来のCortex-M3/M4とほぼ同様だ。ただし、非セキュアステイトではアクセスできないメモリエリアが設けられており、セキュア領域に使われている。ペリフェラルやメモリのメモリマップはもちろん、システムコントロール領域の中にも、非セキュアステイトでは見えない領域が設定されている。

従来のCortex-M3のメモリマップ
ARMv8-Mで非セキュアステイト側から見た場合のメモリマップ

 下の図で右半分が、非セキュアステイトのメモリマップビューだ。薄いブルーになっているのが、非セキュアのメモリエリア。暗色になっているのが、アクセスできないエリアだ。システムコントロールの部分は、非常に狭いアドレス空間だが、細分化されているため、図では縦に引き延ばして表現している。

新旧のCortex-Mのメモリマップ。左がCortex-M23/33で、右が旧来のCortex-M3/4。左のCortex-M23/33のマップは、左がセキュアステイト、右が非セキュアステイトとなっている
PDF版はこちら

 セキュアステイト側から見ると、メモリマップは一変する。上の図の左半分がセキュアステイトのビューだ。図中でグリーンになっているセキュアメモリエリアには、セキュアステイトのみアクセスができる。また、セキュアステイトでは、非セキュアのメモリエリアも全てアクセスすることができる。セキュアステイトと非セキュアステイトは、同じアドレスマップを共有するが、アクセス許可の面で異なっている。

ARMv8-Mでセキュアステイト側から見たメモリマップ

セグメンテーションされたメモリ領域内にセキュア領域を

 詳しく見ると、ブロック図にあったように、オンチップのRAM(通常SRAM)と、オンチップまたはオフチップのフラッシュは、セキュア領域と非セキュア領域にパーティショニングされる。同様に、オンチップのペリフェラルのメモリマップもセキュアか非セキュアの設定がなされる。

 ペリフェラルとRAM、フラッシュ(Code)のメモリマップは、もともとのCortex-M0/M3/M4のメモリマップ上の各領域が、セキュアと非セキュアに分割される。Cortex-M0/M3/M4では、コード領域(通常フラッシュメモリ)が「0x00000000-0x1FFFFFFF」の0.5GB、ワーキングメモリのRAM(通常SRAM)が「0x20000000-0x3FFFFFFF」の0.5GB、ペリフェラルが「0x40000000-0x5FFFFFFF」の0.5GBにマップされている。Cortex-M23/33では、それぞれのアドレス領域内でセキュアと非セキュアの2つの領域が設定される。

 セキュア領域と非セキュア領域の管理は、全てアドレスベースとなる。アドレスのセキュアポリシーを動的に管理するのは新ユニット「SAU(Security Attribution Unit)」だ。SAUがアドレスを両ステイトに振り分け、MPU(Memory Protection Unit)がそれぞれのステイトのメモリを管理する。ARMのCortex-M系はMMU(Memory Management Unit)を持たないため、メモリ保護だけを行なうMPUを加えた。MPUは、セキュアと非セキュアの両ステイトにバンク分けされており、MPUのコンフィギュレーションレジスタが2セットに分かれている。セキュアステイトと非セキュアステイトのそれぞれに、プライベートリソースとして見える。

CPUからのメモリアクセス要求はSAU (Security Attribution Unit)によってフィルタされる
メモリのルックアップテーブルによってアクセスを管理する
セキュアステイト側からは全てのリソースにアクセスできるが、非セキュアステイト側からは限定されたコールしかできない

 SAU自体はオプショナルで、各メモリアクセスユニット毎に「Implementation Defined Attribution Unit (IDAU)」インターフェイスで接続したコントロールロジックで制御することもできる。IDAUを使う場合は、セキュアと非セキュアのアドレス領域は、固定マッピングとなる。

 メモリマップの中央は、オフチップのRAM「0x60000000-0x9FFFFFFF」1GBと、オフチップのペリフェラルデバイス「0xA0000000-0xDFFFFFFF」1GBだ。オフチップのRAMとペリフェラルの2領域は非セキュアと説明されているが、一部のプレゼンテーションだけセキュアの設定が可能となっている。詳細は、まだわからない。

オフチップデバイスとペリファラルにセキュア領域設定が可能な例を示すスライドもある

 セキュアと非セキュアにパーティショニングされたARMv8-Mのアドレス空間。ポイントはアクセス制御にある。セキュアステイト側からは、セキュア領域と非セキュア領域のどちらのアドレスにも、通常のロード/ストア命令でも命令フェッチでも、アクセスができる。それに対して、ノンセキュアステイト側からは、基本的にはブルーの非セキュアな領域のみしかロード/ストア命令によるアクセスができない。セキュア領域へのアクセスはフォールトとなる。ただし、非セキュアステイトからも、セキュアメモリの一部(Non-secure-callable attribute:NSC領域)上の特定の命令だけはコールできる。

システムコントロール&デバッグのメモリ領域

 従来のCortex-M3/M4では、システムコントロールやデバッグのための「プライベートペリフェラルバス(Private Peripheral Bus:PPB)」が「xE0000000-0xE00FFFFF」の1MBに、システムリージョンが「0xE0100000-0xFFFFFFFF」の511MBに割り振られていた。つまり、コアの諸機能の制御のためのプライベートペリフェラルバスのアドレス空間は1MB分だった。これはCortex-M0も同様だ。

 今回のARMv8-Mのマップでは、PPBにあたるシステムコントロール&デバッグ(System Control & Debug)は同様に「0xE0000000」から始まるが、スライドでは上のアドレスは「0xEFFFFFFF」のようにも読み取れる。だとすれば、システムコントロール&デバッグの予約領域が一気に広がったことになるが、そもそも、それほどのアドレス空間が必要とは思えない。この辺りは、まだ明確ではない。

ARMv8-Mで非セキュアステイト側から見た場合のメモリマップ
ARMv8-Mでセキュアステイト側から見たメモリマップ

 PPBは、各種のシステムユニットにアクセスするためのシステムコントロールとデバッグのためのメモリ空間だった。今回のCortex-M23/33では、この中のアドレスマップが多少変わっている。まず、TrustZoneでセキュア化されるシステムコントロールの「MPU(Memory Protection Unit)」、「SCB(System Control Block)」や「SysTick(System Timer)」が、システムコントロール&デバッグ領域に割り当てられている。下の図のようなマップとなる。

ARMv8-Mのメモリマップ
ARMv8-Mのシステムコントロール&デバッグ部分のメモリマップ
PDF版はこちら

 非セキュアステイト時には、非セキュアのMPU/SCB/SysTickリソースにアクセスできる。しかし、セキュアステイト時には、それぞれがセキュアMPU/SCB/SysTickリソースのアドレスとなる。そして、元々リザーブだった領域などを使って、非セキュアステイトのMPU/SCB/SysTickのエイリアスが、セキュアステイト側のアドレスにマップされる。この方法で、セキュアステイト時にも、非セキュアステイトのシステムリソースにアクセスができる。また、メモリのセキュリティ属性を動的に制御するSAU (Security Attribution Unit)も、システムコントロール領域でセキュアエリアにマップされている。

 ITM(Instrumentation Trace Macrocell)/DWT(Data Watchpoint and Trace Unit)/FPB(Flash Patch and Breakpoint Unit)などのデバッグ系の機能、NVIC(Nested Vectored Interrupt Controller)は非セキュアにマップされる。

セキュアと非セキュアの間に窓をあける

 Cortex-AのTrustZoneでは、セキュアモニタがセキュアと非セキュアの両ワールドを仲介する。ハイパーバイザ型のセキュアソリューションだ。しかし、Cortex-Mはハードウェア的にセキュアと非セキュアを分離しており、その間をモニタするソフトウェアが存在しない。そのためCortex-Mでは、セキュアと非セキュアの境界を越えて、非セキュア側がセキュア側を安全に呼び出す仕組みが必要となる。

セキュアモニタを介さずにダイレクトにセキュアと非セキュアの両ワールドをまたいだコールを実現する

 そこで、セキュア領域と非セキュア領域のクッションとなるレイヤーを設けた。ARMv8-Mでは、新しいセキュアゲートウェイ(Secure Gateway:SG)命令と、非セキュア側からアクセスができる、セキュアメモリ上の“窓”となる「Non-secure-callable attribute(NSC)」だ。NSCはセキュアメモリ領域にあるが、非セキュアステイトでアクセスが可能な特殊な属性の領域だ。NSCだけが、両ステイトの間のメモリの窓となる。

ARMv8-Mのメモリ領域毎のアトリビュート

 NSCには、セキュア領域へのゲートウェイとなるSecure Gateway(SG)命令のみが置かれる。SG命令以外はNSCから呼び出すことができない。非セキュア側からセキュア側の処理を呼び出す場合は、必ずSG命令が必要となる。SG命令でのみ、セキュアステイトに切り替わることができる。

 SGでいったんセキュアステイトに入った後は、セキュアメモリ上のコードを実行できる。セキュア実行が終わって、非セキュアステイトに戻る場合は、BXNS命令を使う。BXNSも新命令で、非セキュア(NS)ステイトへの分岐命令だ。

ゲートウェイとなるSG命令をコールしセキュアステイトに移行する

 ちなみに、ARMのBX命令では、本来命令セットを切り替えることが可能だ。ARMには、もともと32-bitのARM命令セットと16-bitのThumb命令セットがあり、さらにそれを統合する目的で、Thumb命令に32-bit命令を加えたThumb-2命令セットが作られた。命令セットの併存状態で、混在実行を可能にするために、命令セット遷移つきのBX命令が作られた経緯がある。Cortex-M系は、Thumb/Thumb-2命令セットベースだが、BXNSはセキュアステイトからの状態遷移に使われる。

ARMv8-Mの割り込みセキュリティ

 ステイト遷移でのセキュリティでは、CPUのレジスタ内容の保護がある。上のスライドのように、セキュアステイトから非セキュアステイトへと遷移する場合、レジスタ内容はクリアされる。ちなみに、非セキュアからセキュアでは、この過程は省かれる。実際には、これはコンパイラレベルで実現される。

TrustZoneのシステムIP CoreLink SIE-200

 ARMは、Cortex-MベースのSoCでTrustZoneを実現するためのシステムIPも提供する。「CoreLink SIE-200」、「AMBA 5 AHB5」、「CoreLink SSE-200」がコンポーネントだ。これらのコンポーネントによって、システム全体で統合的なセキュリティを実現する。

MCUシステム全体で統合的なセキュリティを提供
TrustZoneを使ったARMv8-Mシステムのブロック図
PDF版はこちら

 まず、SoCの内部バスとしてTrustZoneをサポートするのがAMBA 5 AHB5チップインターコネクト規格だ。AMBAは「ARM Advanced Microcontroller Bus Architecture」を、AHBは「Advanced High-performance Bus」を表す。AMBA 5 AHB5がCPUやほかのバスマスタデバイス、メモリ、ペリファラル、フラッシュメモリコントローラなどを接続する。AMBA 5 AHB5ではバスプロトコルが拡張されておりセキュリティを保護できる。AMBA 5 AHB5のポイントは、セキュリティを保護しながらも、配線数を抑えて実装を軽くしている点だ。

 CoreLink SIE-200は、AMBA 5 AHB5を中核としたシステムIPのセットだ。セキュアラッパによって、レガシーの非セキュアなデバイスも、セキュアまたは非セキュアにAMBA 5 AHB5インターコネクトに接続できる。また、「Advanced Peripheral Bus (APB)」へのセキュア制御ができるブリッジも提供する。

AMBA5 AHB5インターコネクトIPがセキュアなシステムバスを実現する
CoreLink SIE-200は統合的なセキュアIP

 CoreLink SSE-200は、AMBA 5 AHB5インターコネクトを含むCoreLink SIE-200のシステムIPに、さらにサブシステムのIPを統合したものだ。Cortex-M33プロセッサとセキュア命令キャッシュ、パワーコントロール、CoreSightデバッグ支援システム、さらに、オプションで暗号化ハードウェア「TrustZone CryptoCell」と無線技術「Cordio Radio」も提供する。

CoreLink SSE-200サブシステムで提供されるサブシステムIP群

 暗号化支援のCryptoCellは、Cortex-Aシステムにもオプションで提供されている。しかし、Cortex-A向けのCryptoCell-710と比べると、Cortex-M向けのCryptoCell-310はより省電力の軽いサブシステムになっているという。

CryptoCell
mbed OSエコシステムでTrustZoneをサポート

 組み込みの世界では、数年前からARMがTrustZoneのMCU版をIoTのために提供すると噂されていた。IoTで盛り上がり始めてから、MCUのセキュリティの必要性が謳われていたためだ。ARMのMCU向けのTrustZoneは、今回のCortex-M23/33によって、ついに市場に提供された。これで、ARMのIoTに向けた技術的な布陣が整ったことになる。