防止发生未经授权的固件访问
不同微控制器采用不同方法来防止闪存中的代码遭到未授权访问,而有的微控制器根本不采取任何保护措施。进一步说,所有解决方案都采用禁止从闪存存储区域读取数据来解决安全问题。有些设备会禁用整个闪存存储系统的读/写访问。这种解决方案无法在终端系统中添加引导加载程序。如果需要在系统中实现引导加载程序且IP安全性同样重要,那么系统设计人员就需要选择合适的微控制器。
有些微控制器将闪存分为多个模块,并对每个模块采取不同的安全等级保护。对于这种器件,我们可以在实现引导加载程序的同时获得同样高的保护等级。让我们看一下赛普拉斯半导体的PSoC 1器件所提供的闪存保护功能。这些器件支持各种闪存保护模式:
· 无保护模式
· 工厂升级模式
· 现场升级模式
· 完全保护模式
所选的保护模式只能在编程时载入NVL(非易失性)位,不能在运行时间更改,以免保护等级发生意外更改,也是为了防止攻击者通过在闪存无保护区域写入特定代码试图修改固件。
无保护模式:这种模式下允许执行所有外部和内部写入/读取操作。该保护模式适合在开发阶段使用,因为此时无需将器件提供给第三方。该模式不应用于生产阶段。
工厂升级模式:这种保护模式适用于需要由外部程序员对各个闪存模块进行升级的系统。这种保护模式不允许外部读取,但允许外部写入、内部读取和内部写入。如果某个特定模块需要在不擦除整个存储器的前提下由外部程序员进行升级,那么可以使用这种模式。例如对于需要由客户或安装团队校正系统并将校正数据存储在闪存中的这种情况,这种模式就很有用。尽管在系统中进行的这种升级非常有用,但在能够使用安全性更高的模式的情况下必须避免使用该模式。原因在于该模式缺乏对外部写入的保护。如果有人在可升级区域插入用以读取闪存内容的代码,那么IP就会失去保护。然而对于这些器件,为特定模块只能设定此类安全级别,其他模块则可以设定更高的安全等级。因此必须确保将非关键代码存储在这些特定模块中。
现场升级模式:这种保护模式禁用外部写入和读取操作,只允许内部写入和读取,因此无法通过程序员接口读/写闪存。该模式最适合支持引导加载支持的系统。在采用引导加载程序的嵌入式系统中,引导加载程序通过通信协议接收需要写入的闪存数据,然后使用内部程序将数据写入闪存。类似地,也是使用内部命令来执行读取操作。因此,引导加载程序可以使闪存成为只读状态。引导加载程序可存储在具有更高安全等级(完全保护模式)的模块中,因此引导加载程序本身不会被修改。额外对引导加载程序的通信进行加密还能进一步降低闪存读取可能性。
完全保护模式:如果无需对闪存模块进行现场或使用外部程序进行升级,那么这种保护模式理想适用于生产阶段。这种模式禁止以任何形式访问闪存,并禁用内/外部读/写操作。
在生成十六进制文件(将在生产就绪型系统编程)的同时,系统设计人员必须设定合适的保护等级,想方设法实现最高IP安全性。
对于需要为不同闪存区域设定不同保护等级的系统而言,最好检查一下闪存粒度保护的设定情况。有些微控制器只允许为闪存赋予一个保护等级。有些器件允许将闪存分为容量为数kB的块,有的闪存块甚至低至64字节。应使用可将闪存分为小块的器件,这样能最大程度地缩小处于较低保护等级的闪存区域。否则会造成闪存浪费或使更多闪存内容面临安全威胁。