如何为安全系统设计归零序列

问题描述

我有一个带有主站和几个从站的嵌入式系统。所有节点都运行在不同的 mcus 中并与 can 总线通信。 我现在想要一个归零序列。当 master 发送 zeroize 命令时,slave 应该这样做。但我无法决定奴隶的行为。 以下是之前的一些事实:

  • 从设备在 XMC1400 mcus 上运行。在 XMC1400(arm m0 核心)中,代码从闪存加载并运行。从 ram 运行有点复杂(包括链接器脚本和启动代码修改..)并且 ram 容量很短。

  • 有一个可以引导加载程序位于闪存(0x10001000)的开头。上电引导加载程序唤醒后,等待来自 CAN 的闪存加载命令,如果收到命令则继续加载序列,或者如果在特定秒内没有收到消息则跳转到某个闪存区域。因此,如果没有引导加载程序,则永远不会跳转。

  • 代码在运行时无法自行擦除。如果被迫这样做,它会跳转到异常处理程序。

以下是一些可能的情况:

  1. 在接收到 zeroize 命令时擦除引导加载程序部分。如果删除引导加载程序,则无法运行任何应用程序。但是,如果有人获得了闪存转储,则可以保留应用程序代码。所以它不是一个完美的归零。 这是一种简单的方法,但在此选择中,应用程序应知道引导加载程序在哪里。这会产生不需要的依赖性。如果引导加载程序位置因某种原因发生变化,则归零序列也将发生变化。

  2. 将此责任交给引导加载程序。当接收到 zeroize 命令时,应用程序将设置一个位于某个闪存区域的标志并插入软复位。然后引导加载程序将唤醒,如果设置了该标志,它将擦除通常会被用户应用程序填充的闪存区域。这是一个更复杂的序列,但依赖性较少。引导加载程序已经通过其数据库和应用程序头知道应用程序在哪里。因为它对应用程序有一定的了解,所以它也可以知道一个标志位置。

  3. 将会有第三个应用程序,它将被加载到某个闪存区域。可以在生产过程中使用引导加载程序加载这个。当接收到 zeroize 命令时,应用程序将跳转到第三个橡皮擦应用程序并将它们全部删除。这是最安全的选择。因为在这些条件下,闪存将处于最空的状态。这第三个应用程序和用户应用程序之间仍然会存在依赖关系,但这不太受欢迎..

以下是我能想到的以及我推测的利弊。我不确定正确的归零操作应该如何,所以我想听听其他人的意见。 提前致谢 北京

解决方法

擦除闪存是微控制器的最终状态,这意味着您可以清除 RAM 和外围设备中的所有现有状态。考虑到这一点,您可以创建一个非常小、非常简单的独立子程序,它没有依赖项(例如,对 Flash 中的库)并且只包含擦除代码。然后,您可以(在正常应用程序操作期间)停止所有中断,将擦除子程序复制到 RAM 中并将执行转移到其中。

那个,或者引导加载程序。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...