Flash読み出し保護はどう実装する?

お客様から、コードフラッシュ(code flash)に対して外部からの読み取り保護機構を追加するよう要請されています。

TRMマニュアルにはフラッシュの書き込み保護しか記載されていませんでした。

読み取り保護はどのように実装すればよいでしょうか?

コード記憶領域の読み出し保護は、ハードウェアレベルのメカニズムと暗号技術を組み合わせて実現できる。STM32 シリーズを例に取ると、オプションバイト内の読み出し保護(RDP)レベルを設定することで実現可能である。例えば:

  1. RDP レベル 1:デバッグインターフェース(JTAG/SWD)を無効化し、SRAM またはシステムメモリから起動する際の Flash アクセスを禁止し、チップ自身のプログラムによる読み出しのみを許可する。

  2. RDP レベル 2:さらにデバッグインターフェースをヒューズで切断し、あらゆる外部アクセスを完全に禁止し、かつ不可逆とする。

また、ヒューズビット(AVR の SPIEN ビットなど)と組み合わせてプログラミングインターフェースを無効化し、ISP 経由での Flash 読み出しを防ぐこともできる。さらに高いセキュリティが必要な場合は、ハードウェア暗号モジュール(HSM など)を統合し、AES/SM4 アルゴリズムで Flash 内容を暗号化し、鍵を外部のセキュアチップに格納することができる。

外部読み出し保護の要件に対しては、以下のような対策が採れます。

  1. 物理レベル保護:ヒューズビットの書き込み(Nordic nRF52 の Permanent Read Protection など)によりデバッグインターフェースを永久無効化し、チップの消去には物理的な破壊が必要。
  2. 動的暗号化検証:起動時に乱数+DES アルゴリズムでチェック値を生成し、HASH 演算(SHA-256 など)でコード完全性を検証。3 回失敗するとセルフデストラクト機構で重要データを消去。
  3. セキュアブート(Secure Boot):ハードウェアセキュリティモジュール(HSM)を用いて信頼チェーンを構築し、段階的にファームウェア署名を検証。例:Infineon TC3xx シリーズは HSM 内蔵鍵で起動コードを復号し、検証完了後にメイン CPU へ制御を移譲。
  4. ハードウェア暗号エンジン:Flash 内容をハードウェアレベルで暗号化し直接読み出しを防ぐ、内蔵暗号モジュールを持つ MCU(NXP S32K の CSEc や芯必達 IM94xx の HSM など)を選択。

上記手法は利用する MCU モデルとセキュリティ要件に応じて組み合わせて使用し、同時にメーカーの TRM 内のセキュリティ章(STM32 の Option Bytes 設定手順など)を参照することを推奨します。