NXP MCU 技术论坛
直播中

张飞雄

7年用户 961经验值
私信 关注
[问答]

LPC55如何禁用ISP和SWD以利用代码保护?

在一些早期的LPC产品中,如LPC11xx、LPC17xx、LPC18xx、LPC40xx、LPC43xx、LPC8xx等,都使用CRP来利用代码保护。CRP 具有三个不同的安全级别: 图 1 显示了 CRP1、CRP2 和 CRP3 的安全级别。


图1

LPC55 系列(LPC55(S)0x、1x、2x 和 6x)使用安全启动和受保护闪存区域 (PFR) 配置代替 CRP 进行安全保护。带S的型号(例如LPC55S)支持安全启动,例如LPC55S28和LPC55S06。但非S系列产品,如LPC5506、LPC5528,只能通过配置FPR相关字段来实现代码保护。

CRP2 是最常用的保护级别。使用 CRP2,SWD 访问被阻止,因此用户无法通过 SWD 或 ISP 读取、写入或擦除 Flash。此外,用户不能通过擦除部分 Flash 来修改现有代码。一旦进入CRP2模式,Flash只能通过Mass Erase Flash进行恢复,有效防止攻击者读取和修改Flash代码。

不幸的是,LPC55(S)0x、1x、2x、6x 等 LPC5500 器件没有与 CRP2 完全相同的功能机制,这受到许多用户的质疑。但是,如果我们需要实现与 CRP2 相同的功能,我们可以配置 CMPA 以禁用 ISP 和 SWD 调试端口。

1.   禁用ISP


Customer Manufacturing/Factory Configuration Area (CMPA)是PFR的一部分,Configure BOOT_CFG选择是否启用ISP模式。表 1 显示了 CMPA 中以 9E40 字地址开头的字段表。ISP 控制域已标记为红色(如表 1 所示)。ISP域的模式选择如表2所示,111为ISP disabled。如果禁用 ISP 模式,将 BOOT_CFG 设置为 0b1110000。


字地址(十六进制)


字节地址


字段说明


6个


5个


4个


3个


2个


1个


0


9E40


9E400


引导配置文件


默认 ISP 模式


0


0


0


0


9E404


SPI_FLASH_CFG


0


0


0


0


0


0


0


9E408


USB_ID


USB 供应商 ID


9E40C


SDIO_配置文件


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


塔彭


蜘蛛侠


斯尼登


数据库生成器


尼电


表格1


默认 ISP 模式


【6:4】


汽车ISP


000


USB_HID_MSC


001


串口ISP


010


SPI 从站 ISP


011


I2C 从 ISP


100


禁用网络服务提供商


111


表 2

2.   禁用SWD


DCFG_CC_SOCU 是一种配置,用于指定每个调试域的调试访问限制。这些访问限制在本节中也称为约束属性。调试子系统被细分为多个调试域,以实现更精细的访问控制。图 2 显示了调试域及其在 DCFG_CC_SOCU 中相应的控制位位置。从逻辑上讲,DCFG_CC_SOCU 有两个组成部分:SOCU_PIN 和 SOCU_DFLT。SOCU_PIN 和 SOCU_DFLT 寄存器一起用于定义模块的 SWD 调试访问。它在逻辑上由两个部分组成:


  • SOCU_PIN:一个位掩码,指定哪些调试域由设备配置预先确定。
  • SOCU_DFLT:为 SOCU_PIN 字段指示的那些位提供最终访问级别,这些位由设备配置预先确定。

即同时设置SOCU_PIN和SOCU_DFLT寄存器的相应位为1,使能模块。该模块通过将 SOCU_PIN 和 SOCU_DFLT 寄存器的相应位同时设置为 0 来禁用。参见图 2。


图 2

注意LPC55 PFR中CC_SOCU_PIN和CC_SOCU_DFLT的默认值都是0。因此,在这种情况下,虽然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

3.   通过代码禁用/启用ISP和SWD


下面以LPC5506为例配置CMPA字段:

3.1  禁用 ISP 和 SWD



图 5

保留默认 CMPA 值,但图 5 中以红色突出显示的两个值除外。

1) 将 BOOT_CFG 设置为 0x70 以禁用 ISP。

2) 将SOCU_PIN和SOCU_DFLT全部设置为0,将所有反向位设置为1,即禁止所有调试访问子域。

3.2 启用 ISP 和 SWD



图 6

保留默认 CMPA 值,但图 6 中以红色突出显示的两个值除外。

1) 将 BOOT_CFG 设置为 0x00 以启用自动 ISP。

2) 恢复DCFG_CC_SOCU的默认值,即CC_SOCU_PIN和CC_SOCU_DFLT全零。在这种情况下,所有调试权限都将恢复(打开),因为不符合位反转规则(请参阅本文的第 2 部分)。

3.3 代码实现


通过串行命令(1 或 0)启用或禁用 SWD 和 ISP 功能。


图 7

附上演示代码。本例程已在LPCXpresso55S06开发板上进行测试。

笔记:

    随着系统安全要求和攻击面的演变,客户必须了解恩智浦未声称可以防御或强烈缓解的攻击类型(尤其是高级物理攻击),以便客户可以采取适当的缓解措施如有必要,在系统级别。

更多回帖

发帖
×
20
完善资料,
赚取积分