说在前面:站长在恩智浦技术社区看到了这篇文章,特分享给大家,但有些话还是要说在前面,本文介绍的方法也许适合在LPC55系列不带S的产品中,但对于型号中具有S的产品,强烈建议使用debug authentication功能实现调试接口的禁用保护。
本文介绍的方法,不能防止通过其他手段(例如通信接口注入)借助代码从内部再次打开调试接口,只有debug authentication功能才能阻止这种情况。
在LPC早期发布的一些产品中,如LPC11xx、LPC17xx、LPC18xx、LPC40xx、LPC43xx、LPC8xx等,使用 CRP 实现代码保护,CRP有三种不同的安全级别:CRP1、CRP2和CRP3,各自的安全级别大体如图1所示。
图1
LPC55系列 (LPC55(S)0x, 1x,2x,6x) 不再使用CRP机制进行安全保护,而是用Secure boot,配置PFR(Protected Flash Region)等方式实现。其中,所有带S (LPC55S) 的芯片支持Secure boot,如LPC55S28,LPC55S06等等。而非S系列产品,如LPC5506,LPC5528等等,只能通过配置FPR相关字段来实现代码保护。
在CRP的三个安全等级中,CRP2最为常用。在使用CRP2时,SWD的访问将被阻止,所以SWD没有办法对Flash进行读写或者擦除操作,ISP也无法对Flash内容进行读取。此外,未经授权的用户并不能通过擦除部分Flash方式修改现有代码,一旦设置为CRP2, 只有Mass Erase Flash后才能继续正常使用,这样便有效地阻止了他人读取和修改代码。
遗憾的是LPC55系列(LPC55(S)0x, 1x,2x,6x) 没有和CRP2完全一样的功能机制,这也是很多初识LPC55的用户感到不适应的地方。不过,若想实现与CRP2相似的功能我们可以通过配置CMPA实现,即禁用ISP和关闭SWD调试口。
1.禁用ISP
客户制造编程区域 (CMPA) 属于PFR的一部分,通过配置BOOT_CFG来选择ISP模式的启用情况。 表1为CMPA中9E40字地址开始的字段表,ISP控制域已用红色标识(如表1),表2为ISP域的模式选择,111为ISP禁用。若禁用ISP模式,设置BOOT_CFG=0b1110000。 表1 表2
2. 关闭SWD调试接口
搭配使用 CC_SOCU_PIN 以及 CC_SOCU_DFLT 寄存器,用于定义模块的SWD调试访问权限。其中,CC_SOCU_PIN寄存器将调试域细分,不同位代表不同的调试域,对该位置1表示可操作。CC_SOCU_DFLT 寄存器设置可操作调试域的最终访问级别,置1表示禁用。也就是说,将CC_SOCU_PIN及CC_SOCU_DFLT寄存器相对应的位同时置1,便能禁用该模块。如图2。
图2
两寄存器低8位的每一位都代表某一子域,将两寄存器的低8位全部置1,即可关闭全部子域的SWD访问权限。
3.代码中实现关闭/开启ISP和SWD
以LPC5506为例,配置CMPA字段:
关闭ISP和SWD:
除上图被标红的三处外,其余皆保持CMPA默认值。
设置BOOT_CFG为0x70,禁用通过ISP 引脚进入ISP 模式功能。
其余两处0xFF分别为寄存器CC_SOCU_PIN和CC_SOCU_DFLT所在地址,即将调试访问的子域全部关闭。
开启ISP及SWD: 除上图被标红的三处外,其余皆保持CMPA默认值。
设置BOOT_CFG为0x00,开启自动ISP模式。
其余两处0x00分别为寄存器CC_SOCU_PIN和CC_SOCU_DFLT所在地址,对调试访问的子域不做修改。
通过串口命令(1或0)开启或关闭SWD及ISP功能:
注意
1. CMPA的设置在Reset或重启生效,一旦在CMPA里关闭了ISP和SWD, 在断电前不要擦除或下载其他程序!否则开发板的ISP和SWD口将永远锁死无法使用。
2. 从系统安全的角度考虑,客户必须了解NXP不承诺可以防范所有的攻击,客户需对产品的安全性在系统级别进行详细评估并采取相应安全措施。
全部0条评论
快来发表一下你的评论吧 !