一部の初期のLPC製品、例えばLPC11xx、LPC17xx、LPC18xx、LPC40xx、LPC43xx、LPC8xxなどでは、コード保護を利用するためにCRPが使用されています。CRPには3つの異なるセキュリティ・レベルがあります。図1は、CRP1、CRP2、CRP3のセキュリティ・レベルを示しています。
図1
LPC55シリーズ(LPC55(S)0x、1x、2x、および 6x)は、セキュリティ保護のためにCRPではなくセキュア・ブートおよび保護フラッシュ領域(PFR)構成を使用します。Sが付いている部品番号(例:LPC55S)はセキュア・ブートをサポートしています。例えばLPC55S28およびLPC55S06です。ただし、LPC5506、LPC5528などのSシリーズ以外の製品では、FPR関連フィールドを構成することによってのみコード保護を利用できます。
CRP2は最も一般的に使用される保護レベルです。CRP2では、SWDアクセスがブロックされるため、ユーザーはSWDまたはISP経由でフラッシュの読み取り、書き込み、消去ができません。さらに、ユーザーはフラッシュの一部を消去して既存のコードを変更することはできません。CRP2モードになると、フラッシュはフラッシュ大量消去によってのみ回復可能であり、これにより攻撃者がフラッシュコードを読み取ったり変更したりすることが効果的に防止されます。
残念ながら、LPC55(S)0x、1x、2x、6x などの LPC5500 デバイスは CRP2 とまったく同じ機能メカニズムを持っていないため、多くのユーザーから疑問が寄せられています。しかし、CRP2と同じ機能を達成する必要がある場合は、CMPAを設定してISPおよびSWDデバッグポートを無効にすることができます。
顧客製造/工場構成領域(CMPA)は PFR の一部であり、BOOT_CFG を設定して ISP モードを有効にするかどうかを選択します。表1は、CMPAの9E40ワードアドレスから始まるフィールドテーブルを示しています。ISP 制御ドメインは赤でマークされています(表1に示されています)。表2はISPドメインのモード選択を示しています。111はISPが無効です。ISP モードが無効になっている場合は、BOOT_CFG を 0b1110000 に設定します。
|
ワードアドレス(HEX) |
バイト・アドレス |
フィールドの説明 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
9E40 |
9E400 |
BOOT_CFG |
Default ISP mode |
0 |
0 |
0 |
0 |
||
|
9E404 |
SPI_FLASH_CFG |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
9E408 |
USB_ID |
USB Vendor ID |
|||||||
|
9E40C |
SDIO_CFG |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
9E41 |
9E410 |
CC_SOCU_PIN |
ISP_CMD_EN |
MCM33_DBGEN |
0 |
0 |
0 |
0 |
0 |
|
9E414 |
CC_SOCU_DFLT |
ISP_CMD_EN |
MCM33_DBGEN |
TAPEN |
SPIDEN |
SPNIDEN |
DBGEN |
NIDEN |
|
表1
|
Default ISP mode |
Bit 【6:4】 |
|
Auto ISP |
000 |
|
USB_HID_MSC |
001 |
|
UART ISP |
010 |
|
SPI Slave ISP |
011 |
|
I2CスレーブISP |
100 |
|
Disable ISP |
111 |
表2
DCFG_CC_SOCUは、デバッグ・ドメインごとにデバッグ・アクセス制限を指定する構成です。これらのアクセス制限は、このセクションでは制約属性とも呼ばれます。デバッグ・サブシステムは、より細かいアクセス制御を可能にするために、複数のデバッグ・ドメインに細分化されています。図2は、デバッグ・ドメインとDCFG_CC_SOCU内の対応する制御ビットの位置を示しています。論理的に、DCFG_CC_SOCUにはSOCU_PINとSOCU_DFLTの2つのコンポーネントがあります。SOCU_PINレジスタとSOCU_DFLTレジスタは、モジュールのSWDデバッグ・アクセスを定義するために一緒に使用されます。これは論理的に2つのコンポーネントで構成されています。
言い換えると、モジュールを有効にするには、SOCU_PINレジスタとSOCU_DFLTレジスタの対応するビットを同時に1に設定してください。このモジュールは、SOCU_PINレジスタとSOCU_DFLTレジスタの対応するビットを同時に0に設定することで無効化されます。図2参照。
図2
LPC55 PFRのCC_SOCU_PINとCC_SOCU_DFLTのデフォルト値はすべてゼロであることにご注意ください。したがって、この場合、SOCU_PINとSOCU_DFLTは両方とも0ですが、ビット反転ルールは満たされません(以下の図3参照)。したがって、CC_SOCU_PINとCC_SOCU_DFLTがすべて0の場合、すべてのデバッグ権限がデフォルトで有効になります。
図3
注:CC_SOCU_PIN(CC_SOCU_DFLT)とSOCU_PIN(SOCU_DFLT)の違い。CC_を含む前者には、後者のビット反転が含まれています。
たとえば、SOCU_PINとSOCU_DFLTがすべてゼロに設定され、反転ビットが1に設定されている場合、すべてのSWDモジュールが無効になります。
図4
以下では、LPC5506を例にしてCMPAフィールドを設定します:
図5
図5で赤く強調表示されている2つを除き、デフォルトのCMPA値を維持してください。
1)BOOT_CFGを0x70に設定し、ISPを無効にします。
2)すべてのSOCU_PINとSOCU_DFLTを0に設定し、すべてのリバースビットを1に設定します。つまり、サブドメインにアクセスするすべてのデバッグを無効にします。
図6
図6で赤く強調表示されている2つを除き、デフォルトのCMPA値を維持してください。
1)自動ISPを有効にするには、BOOT_CFGを0x00に設定します。
2)DCFG_CC_SOCUのデフォルト値、すなわちCC_SOCU_PINとCC_SOCU_DFLTをすべてゼロに戻します。この場合、ビット反転のルールが満たされていないため、すべてのデバッグ権限が復元されます(オンになります)。詳細はこの記事の第2部を参照してください。
シリアルコマンド(1 または 0)で SWD および ISP 機能を有効または無効にします。
図7
デモ・コードが添付されています。このルーチンは、LPCXpresso55S06開発ボードでテストされました。
NOTE:
システムのセキュリティ要件と攻撃対象領域が進化する中で、NXPが防御を主張していない、または強力に軽減していない攻撃(特に高度な物理攻撃)の種類をお客様が理解することが重要です。これにより、必要に応じてシステムレベルで適切な緩和策を講じることができます。
これは、SWDによるフラッシュの一括消去が将来完全に無効になるように見えます(上記の例の有効化コードが何らかの方法で実行されない限り)。これは正しいでしょうか、それとも間違っているのでしょうか?
私たちはプロダクションボードをプログラムするためにSWDインターフェース(LPC5528ボード上)しか持っていないため、SWDを介してフラッシュを読み取り保護し(どのインターフェースからも読み取りを許可しない)、どのインターフェースからでも大量消去のみを許可する方法が必要です。これは可能ですか?