0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Cortex-M MPU提高MCU安全性的方法

星星科技指导员 来源:嵌入式计算设计 作者:Ralph Moore 2022-06-10 07:32 次阅读

这是四部分系列文章的第四部分,介绍了独特的产品 MPU‑Plus® 和使用 Cortex-M 内存保护单元 (MPU) 来提高微控制器单元 (MCU) 安全性的方法。第 3 部分介绍了分区问题,包括堆使用、函数调用 API、中断、父子任务和任务本地存储。 第 2 部分 介绍了分区、安全启动、MPU 控制和系统调用。 第 1 部分介绍了一些介绍性概念:MMU 与 MPU、对安全性、保护目标、MPU-Plus 快照、Cortex-v7M 和 v8M 以及 MPU 操作的日益增长的需求。

动态区域

如前所述,创建静态区域是一个耗时、乏味且容易出错的过程。下面讨论的动态数据区域有助于减轻部分负担。

动态数据区域

以下函数允许在初始化期间或从 ptask 动态创建数据区域:

u8* mp_RegionGetHeapR(rp, sz, sn, attr, name, u32 hn);

u8* mp_RegionGetPoolR(rp, pool, sn, attr, name);

BOOLEAN mp_RegionMakeR(rp, bp, sz, sn, attr, name);

其中 rp 是指向创建区域的指针,sz 是区域大小,sn 是槽号,attr 是属性,name 是区域的可选名称,hn 是堆号,pool 是块池句柄,并且bp 是一个块指针。以上可用于分别从堆、块池或静态块(例如 stat_blk[100])创建数据区域。

通常 rp 指向动态保护区域数组 dpr[n] 中的一个条目。然后,动态区域的 MPA 模板槽设置如下:

mpa_tmplt_t2a[sn] = MP_DYN_RGN(dpr[n]);

其中 MP_DYN_RGN() 加载 dpr[n] 的地址并在模板槽中设置动态区域标志。

这些函数通常应在任务开始运行之前的系统初始化期间调用。但是,它们也可以被 ptasks 调用,它们正在创建和初始化其他任务。

动态数据区域可用于存储静态数组和结构的混合,它们可以在任务之间共享。尽管它们不能用于全局变量,但它们确实节省了在代码中定义部分、在链接器命令文件中定义块以及在模板中定义静态区域的复杂性。因此,它们更简单,使用起来更不容易出错。鉴于 sz 可能是 sizeof() 的总和,它们在开发过程中也可能更加灵活。

受保护的数据块

以下受保护的块函数允许从 utasks 或 ptasks创建受保护的数据块,并在运行时释放它们:

u8* smx_PBlockGetHeap(sz, sn, attr, name, hn);

u8* smx_PBlockGetPool(pool, sn, attr, name);

BOOLEAN smx_PBlockMake(bp, sz, sn, attr, name);

BOOLEAN smx_PBlockRelHeap(bp, sn, hn);

BOOLEAN smx_PBlockRelPool(bp, sn, pool, clrsz);

其中参数与动态区域的参数相同,除了释放函数,bp 是其中一个 Get 函数返回的块指针,clrsz 指定在第一个字的空闲块链接之后要清除多少字节堵塞。基本上,块是从堆或池中获得的,或者是由静态块制成的。为其创建一个区域并将其加载到当前任务的 MPU[sn] 和 MPA[sn] 中。堆可以是任何堆,包括主堆。这是安全的,因为如果黑客侵入任务,MPU 会阻止他访问受保护块之外的堆内存。

动态分配的块可用于缓冲区、工作区、消息(见下文)或结构。如果一个任务被写成它的所有静态变量都在一个结构中,例如:

u8* 副总裁;

vp-》var1 = vp-》var2 + vp-》var3;

然后可以使用动态块来存储其静态变量。上面的 vp 是 BlockGet() 函数返回的块指针。(注意 vp 是一个自动变量,因此存储在任务堆栈中,而不是结构中)。如果一个函数不是这样写的,转换它并不困难——只需在每个静态变量引用前插入“vp-》”,定义一个VP结构,变量名作为字段,定义vp作为指向副总裁。

受保护数据块和动态数据区域的区别在于,受保护数据块可以在任务运行时被任务获取,而动态数据区域是在初始化过程中创建的,并且指向它的指针被加载到任务的模板中。 受保护数据块对于 utasks 创建临时缓冲区和受保护消息特别有用,如下所述。

使用动态区域

使用动态数据区域、受保护数据块或 TLS 来替换 task_data 静态区域需要将所有任务全局变量重新定义为一个或多个结构中的字段。如果结构名称很短,这不会明显使代码复杂化。例如,这里有一些来自 eheap 的代码:

hvp[hn]-》errno = EH_OK;

bsmap = hvp[hn]-》bsmap;

csbin = hvp[hn]-》csbin;

为了支持多个堆,有必要将离散的全局变量更改为结构数组 hvp[hn]。在这种情况下,hvp[hn]-》 被粘贴到代码中每个全局变量名的开头。Cortex-M 架构允许访问结构的速度与离散全局变量一样快或更快——函数中的一条 LDM 指令加载结构基地址,然后通过恒定偏移量访问字段。编译器可能无法对函数使用的所有离散全局变量执行此操作,因此访问它们可能会更慢。使用结构还允许将一起使用的字段分组在一起,如果处理器具有指令缓存,则可以提高性能。通过使用 sizeof() 确定指针偏移量,可以自动处理多个结构和数组。

受保护的消息

smx 消息由链接到数据块的消息控制块 (MCB) 组成。smx_MsgMake() 函数可用于将受保护的数据块变成受保护的消息,并且当前任务成为消息所有者。消息被发送到消息交换并从消息交换接收。在消息交换中,消息的 MCB 与交换的控制块链接到等待消息的队列中。

图 11 说明了在任务之间传输受保护的消息。TaskA 显示为绿色,TaskB 显示为蓝色。黄色代表 pcode 和 pdata,它们受任一任务的保护。如图所示,TaskA 在 slot sn 中获取一个 pdata 块,将其制成消息,加载它,然后将其发送到 Xchg。作为发送操作的一部分,MPU 和 TaskA 的 MPA 中的 slot sn 被清除。请注意,其他消息正在 Xchg 处等待,并且 MCBi 位于消息队列的顶部。TaskB 在插槽 sx 中接收它。请注意,rbar 和 rasr 是从 MCBi 获得的,用于在插槽 sx 中为消息的 pdata 块创建区域。TaskB 验证消息,该消息依赖于应用程序,可能包括对数据进行范围和一致性检查。然后它处理 pdata,取消消息,

smx 中添加了两个受保护的消息函数:

MCB_PTR smx_PMsgReceive(xp, bpp, sn, timeout);

BOOLEAN smx_PMsgSend(mp, xp, sn, pri, rp);

其中 xp 是交换指针,bpp 是指向消息块指针的指针,sn 是 MPU/MPA 槽号,timeout 以刻度为单位,mp 是消息指针,pri 是消息优先级,rp 是回复指针(例如到交易所发送回复消息。)

如图 11 所示,当一个受保护的消息被发送时,它在 MPU 和当前任务的 MPA 中的 slot sn 被清除。因此,即使发送任务保留了指向消息块的指针(例如 bpp),它也无法访问消息块。这阻止了在另一个分区中的接收任务验证消息后更改消息的黑客技术。在消息被另一个分区中的接收任务更新后,它还会阻止读取消息。

在交换器中,消息块区域信息存储在消息的 MCB 中,交换器是消息的所有者。当消息被接收任务接收时,其消息块区域信息被加载到 MPU 和接收者 MPA 的指定槽 sx 中,接收任务成为消息所有者。(sx 不必与发送任务使用的插槽相同。)

现在,接收任务可以读取和修改消息,并可能将其发送到另一个交换器。因此,可以创建一条消息,加载数据,传递给一个任务以检查数据并对其进行加密,然后传递给第三个任务以通过网络发送它。请注意,发送任务和接收任务之间是完全隔离的。当然,发件人可以发送某种破坏性消息。因此,接收者必须在接受消息之前执行验证。这种安全级别是特定于应用程序的。

分区门户

正如第 3 部分中所讨论的,分区门户可以将客户端分区与服务器分区隔离开来,并且是实现 100% 分区隔离所必需的,这对于实现强大的安全性至关重要。它们建立在上述受 smx 保护的消息之上。受保护的消息满足 Arm PSA Secure IPC 要求(参见第 1 部分中的参考资料 3),无需进行消息复制。因此,与普通函数调用 API 相比,引入门户可能不会显着降低性能。

如图 12 所示,分区门户由交易所组成,标记为 XI 和 XO — 每个方向一个。添加到客户端分区的代码(由虚线右侧的区域表示)将函数调用及其参数转换为发送到 XI 交换的消息。然后,客户端任务在 XO 交换处等待回复消息。

在添加到服务器端的代码中的服务器任务(由虚线左侧的区域表示)正在 XI 交换处等待消息。当它收到一条消息时,它会使用消息中的参数将其转换为函数调用。然后它将来自函数调用的返回信息放入它发送到 XO 交换器的消息中。客户端任务从 XO 交换接收消息,并将信息返回给客户端分区中的调用者。

显然,将分区之间的函数调用接口转换为分区门户需要做很多工作。但是,结果是强大的分区隔离。当然,这会降低性能。数据缓冲区在消息中传递。如果正在修改现有代码,则可能需要将数据从缓冲区复制到消息,反之亦然。如果正在创建新代码,则可以将其设计为在无复制模式下处理消息。在后一种情况下,性能影响可能很小。

请注意,大型基于 MMU 的系统中也存在数据复制问题。事实上,在这种情况下,由于虚拟地址空间,不存在无复制解决方案。因此,在基于 MPU 的系统中通过门户进行的分区间通信可​​能比基于 MMU 的系统中的进程间通信更有效。这有利于较小的分区,每个分区做的工作较少,因此系统安全性可能更好。拥有更小的分区也使冗余路径更加实用——例如,两条独立的路径可以将可疑活动报告回总部。

调试支持

启用安全功能后,调试代码更具挑战性。出于这个原因,SecureSMX 允许在早期代码开发和调试期间覆盖大多数安全功能,以帮助加快这些阶段。可以在后期调试期间重新启用安全功能,通过检测堆栈和缓冲区溢出以及其他问题,它们实际上变得有用。此外,建议在发展过头之前开始解决安全问题。

smxAware™ 包括许多与安全相关的功能,可帮助调试基于 MPU-Plus 的软件。它显示当前 MPU 和所有任务 MPA,以及命名区域。图形内存映射概览显示内存条中的 MPU 区域。显示了开始和结束地址以及排除的子区域。在所有显示中,都会标记对齐和重叠等错误。有关更多信息,请参阅:

smxAware 用户指南, Marty Cochran 和 David Moore,Micro Digital Inc.

结论

软件工程已经失去了天真——我们现在正在为一个充满敌意的世界进行设计。实现完美的安全性是不可能的,但它可以是相当不错的。毫无疑问,即使是你能设计的最好的安全措施,一个坚定的黑客也会发现一些弱点。因此,有必要分析所有代码与可能的威胁。

在某些情况下,一段代码可能设计和实现都很糟糕,因此很容易受到攻击,以至于重新编写它是一个绝望的提议。在这种情况下,使用本文中描述的方法将代码保持原样并将其放入完全隔离的 umode 分区中可能更具成本效益。然后有必要设计一种策略来处理不可避免的闯入并实施必要的代码来处理它。在此过程中,可能会发现一些潜在的错误。

如果升级遗留代码以提高现有产品的安全性,或者如果使用遗留代码开发新产品,主要工作通常是重组遗留代码。所需的重新编码量可能很小,这取决于代码的结构如何。当然,新代码的结构应该从一开始就保证安全。

安全性为产品开发增加了另一个维度。不仅要考虑如何实现功能,还要考虑黑客如何访问该功能以造成损害或窃取私人数据。MMF 在调试过程中很烦人,但它们证明了硬件安全机制确实有效!MPU-Plus 的目标是提供一条既能实现良好安全性又不会过度痛苦的路径。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7551

    浏览量

    151403
  • MPU
    MPU
    +关注

    关注

    0

    文章

    358

    浏览量

    48790
收藏 人收藏

    评论

    相关推荐

    电池的安全性测试项目有哪些?

    选择更加安全可靠的电池产品,也能提高对电池安全性的信任。在电池技术日益进步的今天,安全性测试仍将是确保电池产品质量和用户安全的重要保障。
    的头像 发表于 12-06 09:55 314次阅读
    电池的<b class='flag-5'>安全性</b>测试项目有哪些?

    如何使用Ozone分析Cortex-M异常

    Ozone可以帮助用户快速分析和查找导致CPU故障的软件bug。本文解释如何使用Ozone的调试功能,深入了解Cortex-M架构上的这些错误。
    的头像 发表于 11-29 11:14 707次阅读
    如何使用Ozone分析<b class='flag-5'>Cortex-M</b>异常

    在电气安装中通过负载箱实现最大效率和安全性

    在电气安装中,负载箱是一种常用的设备,主要用于模拟实际的电力负载,以便进行各种电气设备的测试和调试。通过负载箱,可以实现最大效率和安全性,从而提高电气设备的运行性能和使用寿命。 负载箱可以实现最大
    发表于 11-20 15:24

    智能系统的安全性分析

    智能系统的安全性分析是一个至关重要的过程,它涉及多个层面和维度,以确保系统在各种情况下都能保持安全、稳定和可靠。以下是对智能系统安全性的分析: 一、数据安全性 数据加密 : 采用对称加
    的头像 发表于 10-29 09:56 256次阅读

    瑞萨电子基于Arm Cortex-A55和双Cortex-M33 MPU的SOM方案 加速物联网设计

    随着工业物联网技术的不断发展,数以亿计的嵌入式设备实现了无缝互联。在这宏大图景中,网关作为连接设备与网络的核心枢纽,重要不言而喻。为满足市场对高性能、高安全性以及高灵活性的工业网关需求,瑞萨推出
    的头像 发表于 08-15 17:23 1928次阅读
    瑞萨电子基于Arm <b class='flag-5'>Cortex</b>-A55和双<b class='flag-5'>Cortex-M</b>33 <b class='flag-5'>MPU</b>的SOM方案 加速物联网设计

    请问DM平台访问安全性如何控制?

    DM平台访问安全性如何控制?
    发表于 07-25 06:10

    蓝牙模块的安全性与隐私保护

    据传输过程中的安全性问题,分析隐私保护方面的挑战和解决方案,并介绍一些提高蓝牙模块安全性和隐私保护的先进技术。 蓝牙模块在数据传输过程中的安全性问题 蓝牙模块在数据传输过程中采用了加密
    的头像 发表于 06-14 16:06 543次阅读

    M8_5pin母头怎样检查安全性

      德索工程师说道在电气和电子系统中,连接器的安全性直接影响到整个系统的性能和用户的安全M8_5pin母头作为一种常见的连接器,其安全性检查尤为重要。本文将围绕
    的头像 发表于 05-07 17:40 282次阅读
    <b class='flag-5'>M</b>8_5pin母头怎样检查<b class='flag-5'>安全性</b>

    M8_6pin公头安全性怎样

    德索工程师说道M8_6pin公头在安全性方面表现出色。它严格按照电气安全标准进行设计,具有优异的电气性能。额定电压和额定电流是评价插头电气安全性能的重要指标,
    的头像 发表于 05-05 13:46 263次阅读
    <b class='flag-5'>M</b>8_6pin公头<b class='flag-5'>安全性</b>怎样

    M8_5芯插座安全性好吗

      德索工程师说道从设计和结构方面来看,M8_5芯插座通常采用高强度、耐用的材料制造,这有助于抵抗外部环境中的物理冲击和机械应力。此外,其结构设计往往注重稳定性和可靠,确保在长期使用过程中不易出现松动或损坏的情况。这种设计思路在很大程度上
    的头像 发表于 04-15 14:12 272次阅读
    <b class='flag-5'>M</b>8_5芯插座<b class='flag-5'>安全性</b>好吗

    DC电源模块的安全性能评估与测试方法

    BOSHIDA DC电源模块的安全性能评估与测试方法 DC电源模块的安全性能评估与测试方法应包括以下几个方面:  DC电源模块的安全性能评估
    的头像 发表于 03-08 11:15 692次阅读
    DC电源模块的<b class='flag-5'>安全性</b>能评估与测试<b class='flag-5'>方法</b>

    电流探头测试小技巧:提高准确安全性

    电流探头是一种常用的测试工具,用于测量威廉希尔官方网站 中的电流。正确使用电流探头可以提高测试的准确,并确保操作的安全性。本文将介绍一些电流探头的测试小技巧,帮助您更好地使用电流探头进行电流测量。 技巧一:正确
    的头像 发表于 03-08 09:31 368次阅读
    电流探头测试小技巧:<b class='flag-5'>提高</b>准确<b class='flag-5'>性</b>和<b class='flag-5'>安全性</b>

    Cortex-M85内核单片机如何快速上手

    2022年4月,Arm推出了全新的MCU级内核Cortex-M85。截止目前(2024年2月),Cortex-M85是最新、最强的Cortex-M内核。
    发表于 02-29 09:35 744次阅读
    <b class='flag-5'>Cortex-M</b>85内核单片机如何快速上手

    ARM®Cortex®-M23 32位MCU数据表

    电子发烧友网站提供《ARM®Cortex®-M23 32位MCU数据表.pdf》资料免费下载
    发表于 02-22 14:32 0次下载
    ARM®<b class='flag-5'>Cortex</b>®-<b class='flag-5'>M</b>23 32位<b class='flag-5'>MCU</b>数据表

    请问mbed物联网操作系统会成为cortex-m中的android吗?

    mbed 物联网操作系统会成为cortex-m中的android吗?
    发表于 01-17 07:14