在一些早期的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 Configura
tion 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
开发板上进行测试。
笔记:
随着系统安全要求和攻击面的演变,客户必须了解恩智浦未声称可以防御或强烈缓解的攻击类型(尤其是高级物理攻击),以便客户可以采取适当的缓解措施如有必要,在系统级别。