IoTセキュリティの基礎(第4部):ランタイムの脅威を軽減する
DigiKeyの北米担当編集者の提供
2020-06-25
編集者注:IoTデバイスはその急増にもかかわらず、セキュリティ面の懸念が払拭されておらず、産業用IoT(IIoT)やミッションクリティカルなアプリケーションでは、攻撃された場合に企業や個人のデータが被害を受ける可能性あり、セキュリティの課題がコネクテッドデバイス導入の障壁になる場合もあります。IoTアプリケーションのセキュリティ確保は難しいと考えられがちですが、実際には、IoTデバイスのセキュリティは、ハードウェアセキュリティデバイスによって支えられる、さほど複雑でない基本的な仕組みをいくつか組み合わせれば構築できます。すでに確立されたセキュリティ手法に従うことで、これらの懸念を払拭することができます。5回に分けてお届けするこのシリーズでは、開発者が最初からベストプラクティスを実践するのに役立つ実際的なガイダンスを提供します。第1部では、安全設計の基盤となる暗号アルゴリズムについて説明します。第2部では、セキュアIoT設計における秘密鍵の役割、鍵管理、およびセキュアストレージについて説明します。第3部では、IoTデバイスへの他の種類の脅威を軽減するためにセキュアプロセッサに組み込まれたメカニズムについて説明します。この第4部では、高度なプロセッサでセキュリティメカニズムを適用して、IoTデバイスのランタイム環境に対する攻撃を軽減するのに必要な隔離を確保する方法を特定して紹介します。第5部では、IoTデバイスから、これらのデバイスをIoTクラウドリソースに接続するために使用されるハイレベルのセキュリティ対策へとIoTセキュリティを移行する方法について説明します。
セキュアストレージを使用したハードウェアベースの暗号は、セキュアなIoT設計を実装するのに必要な基盤を提供します。セキュアブートおよびセキュアファームウェアのOver-The-Air(FOTA)アップデートでは、この基盤を使用してソフトウェア実行のルートオブトラストを構築します。それでもなお、モノのインターネット(IoT)デバイスには、ランタイム環境で実行中のソフトウェアアプリケーションやシステムコードによってアクセスされるセキュアリソースを偶発的または意図的に侵害する可能性のあるソフトウェアからの継続的な保護が必要です。
この記事では、NXP Semiconductors、STMicroelectronics、および他社のプロセッサの一部に組み込まれたセキュリティメカニズムを取り上げ、ソフトウェア実行中に発生する脅威からより効果的にシステムを保護するために開発者がどのように使用できるかについて説明します。
ランタイムソフトウェアはどのように妨害されるか
このシリーズの以前の回で説明したように、暗号、セキュアキーストレージ、およびセキュアブート/ファームウェアアップデートは、IoTセキュリティに必要な構成要素を提供します。これらの機能はIoTデバイスセキュリティ全体に大きく貢献しますが、コネクテッドシステム内のランタイムソフトウェアの妨害を意図した攻撃に対しては不完全なソリューションとなることがあります。理想的には、セキュアブートによって作成されるルートオブトラストの上に構築されたトラステッド環境のおかげで、これらのメカニズムが提供する防御線を突破しようとする試みは失敗に終わるはずです。しかし実際には、このような堅牢なセキュリティ機能で構築されたシステムでも、破損したコードやマルウェアの一部をシステムに注入する攻撃によって侵害される可能性があり、実際に侵害されてきました。
ハッカーはさまざまな方法を駆使し、システムの一部に存在するセキュリティの脆弱性を悪用して、他の部分を攻撃します。たとえば、バッファオーバーフロー攻撃は、大きな入力データストリームが意図されたバッファ領域を越えて書き込みを実行できるようにするソフトウェアアプリケーションを悪用します。そのオーバーフローデータにコードが含まれる場合、プロセッサは後でそれを実行できるため、ハッカーにさらなる攻撃のエントリポイントを提供していしまいます。このような方法や他の方法を使用することにより、ハッカーは徐々に広範にシステムへ侵入していきます。
脆弱性は、システムのソフトウェアスタック内で、どのレイヤのどのソフトウェアコンポーネントにも存在する可能性があります。開発者はより機能が豊富なシステムを作成するように努力しますが、ソフトウェアコンポーネントの数を増やすと、システム内の脆弱性の数も増える可能性があります。同時に、ソフトウェアで見つかる脆弱性のバリエーションも増加し続けます。たとえば、権威ある共通脆弱性識別子(CVE®)のリストにある公に知られたサイバーセキュリティの脆弱性は、2020年第1四半期に前年比で15%増加しました。
段階的保護によって重要なソフトウェアを保護する
脅威の軽減は、悪意のハッカーと善意のセキュリティ専門家の間で行われる継続的な戦いです。脅威は引き続き出現しますが、開発者は、一般的なアプリケーションで必要とされるさまざまなソフトウェアプロセスを隔離するように設計された方法を活用することにより、設計におけるセキュリティを大幅に強化することができます。長年にわたって、セキュアシステムは段階的保護のアプローチの上に構築されてきました。この従来的なアプローチでは、同心円状の保護により、システム内の隔離レベルが向上します。最外層で実行されているアプリケーションは、内層のデバイスドライバやシステムサービスへのアクセスを制限されています。また、最内層のソフトウェアカーネルへのアクセスも制限されています(図1)。
図1:セキュアソフトウェアシステムは、段階的により優れた保護を提供するリング状の保護により、アプリケーション、ドライバ、およびオペレーティングシステムのカーネルを保護します。(画像提供:Wikipedia)
Rochester Electronicsから現在入手可能な80286で始まるIntel x86デバイスは、2ビットの要求特権レベル(RPL)フィールドを含むセレクタレジスタを使用して指定された4つのレベルをサポートしました。Arm®のTrustZoneなどの最新プロセッサアーキテクチャは、ランタイム中にユーザープロセスを隔離するように設計されたさまざまなメカニズムにより、セキュリティ機能を大幅に拡張しました。開発者は、以下を含む多くの組み込みシステム用プロセッサでこの種の段階的保護機能を見つけることができます。
- Microchip TechnologyのArm Cortex®-M23ベースのSAM L11マイクロコントローラファミリ
- Nordic SemiconductorのArm Cortex-M33ベースのnRF9160ワイヤレスシステムオンチップ(SoC)
- Nuvoton TechnologyのArm Cortex-M23ベースのM2351マイクロコントローラ
- NXP SemiconductorsのArm Cortex-M33ベースのLPC55マイクロコントローラ
- Silicon LabsのArm Cortex-M33ベースのEFR32BG21ファミリのワイヤレスSoC
- STMicroelectronicsのArm Cortex-M33ベースのSTM32L5マイクロコントローラファミリ
Cortex-M向けのArm TrustZoneは、NXPのLPC55S69JBD100KおよびSTMicroelectronicsのSTM32L552VET6などのArm Cortex-M組み込みシステムプロセッサに強化されたセキュリティ機能をもたらします。Cortex-A向けのTrustZoneは、NXPのi.MX 8M Mini MIMX8MM6DVTLZAAおよびSTMicroelectronicsのSTM32MP157AAC3TなどのArm Cortex-Aベースのアプリケーションプロセッサに対して同様の機能を提供します。
TrustZoneは各Armシリーズに対し、セキュアブート、セキュアコード、データ、メモリ、および他のセキュリティ機能をサポートするメカニズムを提供します。Cortex-Mプロセッサ向けのTrustZoneは、組み込みシステムの低レイテンシ要件をサポートするために設計され、高速なセキュア割り込みおよびセキュリティ状態間のハードウェアベースの高速な移行を含む性能強化を特色としています。ここでは、Cortex-Mプロセッサ向けのTrustZoneについて説明し、クラスを代表する2つのプロセッサに注目します。それは、NXPのLPC55S69JBD100KとSTMicroelectronicsのSTM32L552VET6です。
プロセッサの動作モードで拡張された保護を実現する
TrustZoneアーキテクチャの要として、プロセッサはソフトウェアプロセスとシステムリソースの隔離をサポートする複数の動作モードで実行できます。プロセッサの「セキュア」および「非セキュア」モードは、信頼できないプロセスから信頼できるプロセスを隔離する方法を提供します。プロセッサの「ハンドラ」および「スレッド」モードは、プロセスとリソースの隔離において精度を高める別個の保護メカニズムを提供します。
TrustZoneアーキテクチャでは、ハンドラモードで実行されているプロセッサにより、ソフトウェアが常に特権モードで実行されます。したがって、これはリアルタイムオペレーティングシステム(RTOS)などのソフトウェアの実行、またはブートイメージ、セキュアキー、およびシステム動作に重要な他のリソースへのアクセスで使用するために推奨されるモードです。スレッドモードでは、ソフトウェアは非特権モードで実行されますが、特権プロセスではこのモードで実行中のソフトウェアの特権レベルを変更できます。一般的に、アプリケーションコードの実行にはスレッドモードが使用されます。
セキュア/非セキュアおよびハンドラ/スレッドモードを組み合わせて使用することにより、リング状の保護をサポートする従来のシステムに見られるのと同様の段階的保護を提供できます。たとえば、STMicroelectronicsのSTM32L552VET6を使用することにより、開発者は最大特権を備えた信頼できるコードを、最小特権の信頼できないコードから隔離できます(図2)。
図2:STMicroelectronicsのSTM32L552VET6のようなTrustZoneプロセッサは、プロセッサモードの組み合わせを提供します。これにより、開発者はブートイメージなどの信頼できるシステムソフトウェアを、サードパーティの無線周波数(RF)通信スタックなどの信頼できないアプリケーションコードから隔離できます。(画像提供:Digi-Key、STMicroelectronics提供の資料より)
これらのプロセッサに内蔵された隔離メカニズムは、各プロセッサがプログラムデータメモリのさまざまな領域にアクセスする機能を制限します。たとえば、NXPのLPC55S6xコアがセキュア状態にある場合、非セキュアなデータメモリにはアクセスできるものの、非セキュアなプログラムメモリにはアクセスできません。一方、LPC55S6xコアが非セキュア状態で実行されている場合は、非セキュアなプログラムメモリおよびデータメモリにのみアクセスできます(図3)。
図3:NXPのLPC55S6xデバイスなどのプロセッサは、セキュアなプログラムメモリ(緑色)を読み込むセキュア状態(S状態)、または非セキュアなプログラムメモリ(赤色)を読み込む非セキュア状態(NS状態)でコアが実行されるようにすることができます。(画像提供:NXP Semiconductors)
信頼できるソフトウェアを実行するためにセキュア状態で実行している場合、これらのプロセッサは非セキュアなプログラムメモリからの命令をフェッチできません。逆に、アプリケーションコードなどの信頼できないソフトウェアを実行するために非セキュア状態で実行している場合、これらのプロセッサはセキュア領域にあるアクセスコードやデータにアクセスできません。ただし、アプリケーションコードには一般的に、セキュアライブラリで信頼できるコードを実行する機能が必要です。TrustZoneプロセッサにより、開発者はセキュアライブラリへの許可されたエントリポイントを提供する非セキュアコール可能(NSC)メモリ領域を定義して、この要件を満たすことができます(図4)。
図4:非セキュアコール可能領域は、非セキュアメモリ領域からセキュアメモリ領域へのセキュアなエントリポイントを提供します。これにより、非セキュアアプリケーションはセキュアライブラリで関数を実行できるようになります。(画像提供:STMicroelectronics)
メモリエイリアシングによるセキュリティ強化
NXPのLPC55S69JBD100KおよびSTMicroelectronicsのSTM32L552VET6などのTrustZoneプロセッサは、物理プログラムメモリをセキュアおよび非セキュアなメモリ空間へエイリアシングすることにより、実行を管理します。たとえば、STMicroelectronicsのSTM32L552VET6は、フラッシュとSRAMのコードを2度、つまり1度目は非セキュアなアドレス範囲(0x0800_0000~0x0BFF_FFFF)、2度目はセキュアなアドレス範囲(0x0C00_0000~0x0FFF_FFFF)へエイリアシングします。同様に、NXPのLPC55S69JBD100Kは、物理プログラムメモリを0x0000_0000で始まる非セキュア空間、および0x1000_0000で始まるセキュア空間へエイリアシングします。これらの各プロセッサは、他のメモリタイプや周辺モジュールに対しても同様のアプローチを使用し、それらをセキュアおよび非セキュア領域へ2度エイリアシングします。
プロセッサがメモリロケーションにアクセスする必要がある場合、そのロケーションにアクセスする機能は、以下2種類のハードウェアユニットが生成するセキュリティ属性により決定されます。
- プロセッサコア外部の固定ハードウェアユニットであるIDAU(Implementation Defined Attribution Unit)は、メーカーによって定義されたメモリマップの固定セキュリティステータスを提供します。
- プロセッサコアに内蔵されたプログラム可能なユニットであるSAU(Secure Attribution Unit)は、最大8つのメモリ領域のセキュリティステータスを定義するのに使用されます。
システムの初期化中、セキュアモードで実行されている設定ルーチンは、以下のSAUレジスタを設定することにより、各領域のセキュリティステータスを定義します。
- さらなる動作領域を選択するためのSAU Region Number Register(SAU_RNR)
- 領域の開始アドレスを定義するためのSAU Region Base Address Register(SAU_RBAR)
- 領域の範囲を定義するためのSAU Region Limit Address Register(SAU_RLAR)
STM32L5シリーズ向けSTM32Cube MCUソフトウェアパッケージで、STMicroelectronicsはSAU設定を含むプロセッサ機能の使用方法を示す複数のテンプレートファイルを提供しています。リスト1で示されているように、開発者は、構成設定がデバイスに書き込まれる際に使用されるSAU構造で、レジスタ値を設定するマクロ(SAU_INIT_REGION(n))を使用して、各設定パラメータに対してこれらの領域を定義できます。
コピー
/*
// <e>Initialize SAU Region 0
// <i> Setup SAU Region 0 memory attributes
*/
#define SAU_INIT_REGION0 1
/*
// <o>Start Address <0-0xFFFFFFE0>
*/
#define SAU_INIT_START0 0x0C03E000 /* start address of SAU region 0 */
/*
// <o>End Address <0x1F-0xFFFFFFFF>
*/
#define SAU_INIT_END0 0x0C03FFFF /* end address of SAU region 0 */
/*
// <o>Region is
// <0=>Non-Secure
// <1=>Secure, Non-Secure Callable
*/
#define SAU_INIT_NSC0 1
/*
// </e>
*/
/*
// <e>Initialize SAU Region 1
// <i> Setup SAU Region 1 memory attributes
*/
#define SAU_INIT_REGION1 1
/*
// <o>Start Address <0-0xFFFFFFE0>
*/
#define SAU_INIT_START1 0x08040000 /* start address of SAU region 1 */
/*
// <o>End Address <0x1F-0xFFFFFFFF>
*/
#define SAU_INIT_END1 0x0807FFFF /* end address of SAU region 1 */
/*
// <o>Region is
// <0=>Non-Secure
// <1=>Secure, Non-Secure Callable
*/
#define SAU_INIT_NSC1 0
/*
// </e>
*/
.
.
.
**
\brief Setup a SAU Region
\details Writes the region information contained in SAU_Region to the
registers SAU_RNR, SAU_RBAR, and SAU_RLAR
*/
__STATIC_INLINE void TZ_SAU_Setup (void)
{
#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)
#if defined (SAU_INIT_REGION0) && (SAU_INIT_REGION0 == 1U)
SAU_INIT_REGION(0);
#endif
.
.
.
#define SAU_INIT_REGION(n) \
SAU->RNR = (n & SAU_RNR_REGION_Msk); \
SAU->RBAR = (SAU_INIT_START##n & SAU_RBAR_BADDR_Msk); \
SAU->RLAR = (SAU_INIT_END##n & SAU_RLAR_LADDR_Msk) | \
((SAU_INIT_NSC##n << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk) | 1U
リスト1:STMicroelectronicsのSTM32L5シリーズ向けSTM32Cube MCUソフトウェアパッケージのテンプレートに含まれるこのスニペットは、開発者がメモリ領域や関連したセキュリティステータスを定義する方法を示しています。(コード提供:STMicroelectronics)
IDAUとSAUは連携して動作し、メモリロケーションがアクセス可能であるかを見極め、2つのうちセキュリティレベルが高いほうを返します。プロセッサはセキュア/非セキュアな動作状態に対応するメモリエイリアスと連携するため、IDAUとSAUの組み合わせにより生成されるセキュリティ属性は、一致するセキュリティレベルの領域のみへのアクセシビリティを確保します(図5)。
図5:NXPのLPC55S69JBD100Kでは、IDAUとSAUを組み合わせて、各メモリエイリアスに対するセキュリティ属性を生成します。これにより、それぞれの領域を越えた実行を許可されていないコードを効果的に排除します。(画像提供:NXP Semiconductors)
たとえば、NXPのLPC55S69JBD100Kがセキュアモードで動作している場合、IDAUとSAUにより生成されたセキュリティ属性は、物理メモリのブロックのセキュアエイリアスに含まれる非セキュアアプリケーションへのアクセスを防ぎます。これにより、非セキュアコードをセキュアエイリアスから効果的に排除します。逆に、プロセッサが非セキュアモードで動作している場合、IDAUおよびSAUセキュリティ属性は、結果として生じる非セキュアエイリアスからセキュアアプリケーションを効果的に排除します。
特権およびアクセス制御の設定
IDAUとSAUはセキュアおよび非セキュアなアクセス制限を直接実施しますが、それらはセキュアおよび非セキュアなメモリ保護ユニット(MPU)と連携して、対象リソースに関連したアクセス権を決定します(図6)。
図6:ここに示されているNXPのLPC55S69JBD100KなどのTrustZoneプロセッサでは、SAUおよびIDAUにより生成されたセキュリティ属性は、セキュアおよび非セキュアなMPUにより管理される設定と組み合わされ、セキュリティレベルとともに特権レベルを提供します。(画像提供:NXP Semiconductors)
これらのプロセッサに内蔵されたMPUは、メモリリソースのきめ細かなアクセス制御を提供します。たとえば、STMicroelectronicsのSTM32L552VET6では、MPUはさまざまなアクセス権をサポートしており、プロセッサが特権ハンドラモードで実行している場合と、非特権スレッドモードで動作している場合では異なります(表1)。
表1:STMicroelectronicsのSTM32L552VET6により、開発者はMPUを使用して、特権モードと非特権モードでは動作の異なるさまざまなレベルのアクセスを定義できます。(表提供:STMicroelectronics)
これらの属性の1つであるExecute Never(XN)属性により、開発者はプロセッサが関連するメモリ領域からのコードの実行を決して試みないようにすることができます。これにより、別のレベルのランタイム保護を提供できます。たとえば、フラッシュから直接コードを実行するシステムでは、開発者が未使用のSRAM領域に対してXN属性を設定することにより、たとえマルウェアのインジェクション攻撃がそれらの領域で成功するとしても、システムが侵害される可能性を排除することができます。
より多くの周辺モジュールやメモリに保護を拡張する
これらのプロセッサのIDAU、SAU、およびMPU機能は、システムソフトウェアおよびアプリケーション両方のランタイム実行を保護するための柔軟な基盤を提供しますが、これらの機能はプロセッサ自体に限定されます。NXPのLPC55S69JBD100KやSTMicroelectronicsのSTM32L552VET6などのプロセッサは、さまざまなアプローチにより、セキュアおよび特権機能を他のメモリシステムやインターフェースに引き継ぐことができます。
STMicroelectronicsは、STM32L552VET6向けに、周辺モジュール、組み込みSRAM、および外部メモリを保護するために設計された独自のグローバルTrustZoneコントローラ(GTZC)で、ネイティブのTrustZoneメカニズムを補完します(図7)。
図7:STMicroelectronicsのSTM32L552VET6プロセッサは、ネイティブのTrustZoneフレームワークに含まれていない周辺モジュールやメモリにセキュリティ保護を拡張するグローバルTrustZoneコントローラ(GTZC)を内蔵しています。(画像提供:STMicroelectronics)
NXPのLPC55S69JBD100Kの場合、他のバスマスター用のMPC(Memory Protection Checker)、PPC(Peripheral Protection Checker)、MSW(Master Security Wrappers)に到達するために、内部のAHB(Advanced High-performance Bus)マトリックスに特権属性(HPRIV)およびセキュア属性(HNONSEC)があります(図8)。
図8:NXPのLPC55S69JBD100Kでは、特権およびセキュリティレベルが、メモリ、周辺モジュール、および他のバスマスターに関する動作にこれらの属性を適用する追加のハードウェアユニットに送信されます。(画像提供:NXP Semiconductors)
ソフトウェア隔離およびシステム保護の基盤となるメカニズムを理解することは重要ですが、開発者は開発サポートを活用して、独自の設計にこれらの機能を迅速に適用することができます。
STMicroelectronicsは、STM32L5プロセッサをベースとするアプリケーションを構築するための迅速な試作プラットフォームとして、STM32L552E-EV、STM32L562E-DK、およびNUCLEO-L552ZE-Q評価ボードを提供しています。同社のSTM32CubeIDE統合開発環境(IDE)は、ソフトウェアプログラミング用の包括的な環境を提供しています。また、STM32CubeProgrammerは、内部および外部メモリをプログラミングするために、グラフィカルユーザーインターフェース(GUI)およびコマンドラインインターフェース(CLI)バージョンの両方を提供しています。たとえば、開発者はこのツールを使用して、フラッシュメモリのセキュア領域を定義することができます(図9)。
図9:STMicroelectronicsのSTM32CubeProgrammerは、フラッシュメモリのセキュア領域を定義するための簡単なアプローチを提供します。(画像提供:STMicroelectronics)
NXPのLPC55S69プロセッサをベースにしたシステムの開発を迅速化するために、開発者はNXPのLPC55S69-EVK評価ボードで設計を構築できます。システム構成およびソフトウェアプログラミングにおいて、NXPのMCUXpresso IDEは、NXPのLPC55S69プロセッサベースのアプリケーションを作成するための包括的なプラットフォームを提供しています。
まとめ
IoTセキュリティは、暗号およびセキュリティストレージの基本的なセキュリティメカニズムや、ハードウェアセキュリティメカニズムに基づいてルートオブトラストにアプリケーションを構築する機能に依存しています。これらはすべてセキュリティにとって必要ですが、システムのランタイム環境の脆弱性を悪用することを意図した継続的脅威に対抗するには不十分です。多くのプロセッサで入手可能な段階的保護メカニズムを使用することにより、開発者はこれらの脅威を緩和し、IoTアプリケーションへの影響をよりうまく軽減または排除できるセキュアIoTデバイスを構築できます。
免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。


