LPC5500のArmTrustZoneセキュリティ機能を活用する方法
LPC5500シリーズのArmTrustZone拡張機能がどのように機能するか、およびカスタムの安全なアプリケーションと安全でないアプリケーションで安全対策を利用し始める方法を学びます。
>デバイスの接続が増え、ハッカーの高度化が進む中、NXPセミコンダクターズのような多くの企業が対策の必要性を認識しています。 NXPは、組み込みプロジェクトを保護するために使用できる強化されたセキュリティ機能を備えたLPC5500MCUシリーズを開発しました。
NXPは、FIPS準拠の乱数ジェネレーターを採用し、「Prince」復号化アルゴリズム(コアに対称暗号化コードの実行を許可)を選択し、PUFテクノロジーを使用して4096ビットのエフェメラルオンチップキーを実装しました。 LPC5500 MCUは、オンチップ暗号化ハードウェアアクセラレータ「CASPER」と組み合わせると、堅牢なサイバーセキュリティ対策とライフサイクル全体のキープロビジョニングを必要とするネットワークエッジのIoTアプリケーションに適しています。
さらに、このチップは、Cortex-MベースのデバイスにArmTrustZoneテクノロジーを活用しています。この記事では、LPC5500シリーズのTrustZone拡張機能がどのように機能するか、およびカスタムアプリケーションで安全対策を利用する方法を学びます。
Cortex-M用のArmTrustZoneテクノロジーとは何ですか?
TrustZoneのコア原則は、例を通して最もよく説明されています。 MCUの製造元は、セキュリティライブラリ、ブートローダー、高速DSPアルゴリズムなどのカスタム独自のコードをマイクロコントローラーのROMに提供することがよくあります。ただし、これらのアプリケーションの作成者には、知的財産を保護する正当な理由があることがよくあります。ユーザーや競合他社がバイナリを逆コンパイルしてアルゴリズムをリバースエンジニアリングすることを望まない場合があります。
一方では、プログラマーはこれらの事前定義されたソフトウェアライブラリを利用したいと考えています。ただし、一方で、製造元は、コードが悪意のある可能性のあるパーティにさらされることを望んでいません。
図1。 非セキュアユーザーコードとセキュアROMの内容は、同じ物理MCUに存在します。
サプライヤは、開発者が関数にアクセスできるようにしながら、実装の詳細を非表示にしたいと考えています。ユーザーコードは、隠しソフトウェアの公開されたメソッドを呼び出すことができますが、セキュアROMが所有するメモリに直接アクセスすることはできません。その結果、2つの分離されたサブシステムで構成される構造になります。これら2つの世界間の移行は、TrustZoneセキュリティ拡張機能によって管理されます。
これは、TrustZoneを利用するマイクロコントローラーが2つの別々のプロジェクトとして設計されることを意味します。最初のプロジェクトはセキュア状態で開始されます。次に、オンチップリソースのセキュリティ属性を構成し、非セキュア状態からアクセス可能なテーブルでセキュア機能を公開する場合があります。 2つ目は、セキュリティで保護されていないコードが含まれており、セキュリティで保護された世界の公開された機能へのアクセスが制限されています。
以前のアーキテクチャとの違い
Cortex-M3および-M4コアは、スレッドモードとハンドラーモードの2つのプロセッサモードを認識しています。アプリケーションソフトウェアはスレッドモードで実行され、ハンドラモードは例外を処理します。コードは、特定のCPU機能へのアクセスを制御する特権レベルまたは非特権レベルのいずれかで動作できます。
Cortex-M33コアのTrustZone拡張により、上記のように2つの新しい状態が導入されました。この変更により、4つの異なるプロセッサモードが発生しました。非セキュアハンドラ、セキュアハンドラモード、非セキュアスレッド、およびセキュアスレッドです。
図2。 M33コアのTrustZone拡張機能は、4つのプロセッサモードを作成します。
他の更新に加えて、新しいSysTickタイマーも新しい状態で導入されました。そのため、現在、セキュア状態と非セキュア状態に別々のタイマーがあります。
メモリパーティション
前述のように、MCUのメモリはセキュアエリアと非セキュアエリアに分割されます。 MCUのCPUコアは、セキュアモードの1つで動作している場合にのみ、セキュアメモリ領域にアクセスできます。他のメモリパーティションにある命令にはアクセスできません。ただし、データRAMのセキュアセグメントと非セキュアセグメントの読み取りと書き込みは可能です。 CPUコアが非セキュア状態の場合、非セキュア命令とデータメモリブロックにのみアクセスできます。
TrustZoneは、メモリマップ内のアドレス範囲をセキュリティ属性で装飾します。 3つのセキュリティ属性があります:セキュア(S)、非セキュア(NS)、および非セキュア呼び出し可能(NSC)。コアの現在のセキュリティ状態に応じて、各メモリ領域へのアクセスが許可または拒否されます。
図3。 CPUは、セキュアモードと非セキュアモードでさまざまな領域にアクセスできます。
LPC55S69デバイスでは、メモリはアドレスに基づいてセキュアセグメントと非セキュアセグメントに分割されていました。メモリアドレスビット28がLOWの場合、メモリは安全ではありません。それ以外の場合は安全です。唯一の例外は、セキュリティ属性ユニットを介して構成できるプログラムメモリです。
安全なアプリケーションの構成要素
安全でないコードは、アプリケーションの安全な部分を直接呼び出すことはできません。代わりに、保護された部分は、ユーザーがアクセスできる機能のリストを公開します。このリストは、外側からは見えるが内側の詳細を隠す非常に薄いレイヤーであるため、ベニヤテーブルと呼ばれます。ベニヤテーブルは、TrustZone属性NonSecureCallableを持つメモリ領域にあります。
通常、固定されたパーツのソースは表示されません。代わりに、コンパイルされ、オブジェクトライブラリとベニヤテーブルがヘッダーファイルとして提供されます。これらのファイルには実際の命令は含まれていませんが、安全な関数を呼び出すために必要な情報が一緒に含まれていることに注意してください。ベニヤテーブルには、実際の命令が存在する安全なメモリ位置へのゲートウェイと分岐命令のみが含まれています。
安全な機能と安全でない機能の間の移行
TrustZone拡張機能を備えたCPUは、セキュアと非セキュアの間を移行するための2つの新しい機能であるSGおよびBXNS命令をサポートします。
ユーザーコードが安全な関数を必要とする場合、メモリのNSC部分にあるベニヤテーブルを介して呼び出しを行います。次に、SG命令を利用して、CPUをセキュアモードに切り替えます。実行が完了すると、コントロールはBXNS命令でユーザーコードに戻されます:
図4。 ユーザーコードは、TrustZoneゲートキーパーを介して安全な関数を呼び出す必要があります。
ユーザーが保護領域に直接アクセスするなど、セキュリティ関連の違法な操作を試みると、セキュアフォールト例外が発生します。
安全なHelloWorldの例
LPCXpresso55S69のSDKには、MCUXpressoにロードできるTrustZoneの例がいくつか付属しています。前述のように、これらの例は、セキュリティで保護された部分とセキュリティで保護されていないユーザーコードの2つの別個のプロジェクトで構成されています。
安全な部分は、他のMCUXpressoプロジェクトとほぼ同じように見えます。ただし、次の関数呼び出しという1つの違いがあります。
この関数は、できるだけ早く呼び出す必要があります。その後、メモリと非セキュアプロジェクトを構成するのは、セキュアプロジェクトの責任です。
セキュアプロジェクトはすべてのセットアップ呼び出しを処理するため、非セキュアプロジェクトは処理する必要がないため、その主な機能は短くなります。
ただし、このアプリケーションは、他のプロジェクトで定義された安全な関数のみを呼び出します。 PRINTF_NSE関数の次の定義は次のとおりです。
その定義に従うと、保護されたプロジェクトで定義されたベニヤテーブルを指します。安全でないプロジェクトは、ベニヤテーブルを説明するヘッダーファイルしか知らないことを覚えておくことが重要です。ただし、この場合、ソースコード内の対応する関数を確認できます。
「__attribute __((cmse_nonsecure_entry))」装飾により、関数がオブジェクトファイルにエクスポートされます。
メモリの分割
セキュリティ属性は、メモリのどの部分が保護されているか、NSCであるか、または保護されていないかを定義します。これらはすべてのアクセスでチェックされます。そのために、MCUは、これらのチェックを処理し、3つのロジックブロックで構成されるハードウェアで拡張されました。
- セキュリティアトリビューションユニット(SAU)
- 実装定義属性ユニット(IDAU)
- セキュリティ帰属ロジック
SAUは、BOARD_InitTrustZone()関数内の安全なプロジェクトによってプログラムされます。これにより、メモリを異なるセキュリティ設定の8つのリージョンに分割できます。明示的に設定されていないリージョンは、デフォルトで安全なままであることに注意してください。
IDAUを使用すると、MCUメーカー(この場合はNXP)がより多くのカスタムリージョンを定義できます。ここで、リージョンはアドレスの28番目のビットに依存します。 LPC55S69 MCUでは、メモリマップの下部(0x0000_0000〜0x2FFF_FFFF)はデフォルトで非セキュアであるため、SAUを使用して自由に設定できます。
アービターは、IDAUとSAUの設定が一致することを保証します。メモリ領域を非セキュアとしてマークするには、両方のロジックブロックを非セキュアに設定する必要があります。それ以外の場合、メモリはデフォルトの保護された状態にフォールバックします。同じことがNSCメモリ領域にも当てはまります。セクションをNSCにするには、SAUをNSCとしてマークし、IDAUを非セキュアに設定する必要があります。
MCUXpressoには、ユーザーがメモリ領域をすばやく簡単に定義できるツールがあります。ツールにアクセスするには、IDEのメインメニューバーを使用して、TEEパースペクティブを開きます。
図5。 このMCUXpressoツールを使用すると、ユーザーはMCUのメモリマップを表示および編集できます。
ツールの左側にある表は、メモリ領域のセキュリティレベルを変更できます。右側のメモリマップは、メモリがどのように分割されるかを示しています。
TrustZoneは必要なセキュリティコンポーネントを提供します
TrustZoneテクノロジを搭載したLPC5500MCUシリーズでは、メモリは安全な世界と安全でない世界に分割されます。ユーザーが安全でないメモリの一部にアクセスできるようにすることができます。また、安全なアプリケーションを作成して、その他。 TrustZoneは、2つの世界の間のゲートキーパーとして機能し、コアが2つの世界の間でどのように移行するかを管理します。
そのために、2つの新しい命令が導入されました。セキュアアプリケーションは、非セキュアコンテキストから呼び出すことができる関数を公開するベニヤテーブルを提供します。 MCUのハードウェアは、不正なメモリアクセス操作が実行されないようにします。このハードウェアを使用して、メモリマップのリージョンを構成することもできます。その目的のために、MCUXpressoはTEEパースペクティブを提供します。 LPC5500シリーズのMCUに提供されるセキュリティをより深く理解することで、より優れた設計エクスペリエンスが可能になります。 TrustZoneの詳細については、TrustZone:Calling the SecureWorldをご覧ください。
業界記事は、業界パートナーが編集コンテンツに適さない方法でAll About Circuitsの読者と有用なニュース、メッセージ、テクノロジーを共有できるようにするコンテンツの形式です。すべての業界記事は、読者に有用なニュース、技術的専門知識、またはストーリーを提供することを目的とした厳格な編集ガイドラインの対象となります。業界記事で表明されている見解や意見はパートナーのものであり、必ずしもAll AboutCircuitsやそのライターのものではありません。
クラウドコンピューティング