FreeRTOS内核威胁模型
撰写日期: 2023 年 8 月 11 日
最后修改:2023 年 8 月 11 日
这是支持硬件内存保护的 FreeRTOS 移植的威胁模型,例如
ARM Cortex-M 内存保护单元 (MPU)。它适用于使用 MPU 包装函数
C 文件 (mpu_wrappers_v2.c) 的应用程序。此文件在 FreeRTOS 内核 V10.6.0 中引入。在其设备中使用 FreeRTOS 的应用程序编写者
负责保护设备以及设备上运行软件的安全。
资产
- FreeRTOS 内核 C 代码。
- 应用程序代码 - 定义为 FreeRTOS 内核 C 代码以外的所有代码。
- FreeRTOS 内核内部数据。
- 应用程序数据 - 定义为 FreeRTOS 内核内部数据以外的所有数据。
- 已保存的任务上下文 - 未处于运行状态的任务的上下文。
- 任务堆栈 – 每个任务都有自己的堆栈。
- 任务系统调用堆栈 - 每个任务都有独立的系统调用堆栈来执行系统调用。
- 系统堆栈 - 中断服务程序 (ISR) 使用的堆栈。
- 特殊 CPU 寄存器,例如:
- MPU 控制寄存器。
- CPU 操作寄存器(例如执行模式)。
- 通用 CPU 寄存器。
参与者
- 非特权任务 – 具有有限特权的 FreeRTOS 任务。
- 特权任务 – 具有全部特权的 FreeRTOS 任务。
- 系统调用 - FreeRTOS 系统调用将内核应用程序编程接口 (API) 与特定代码包装在一起,从而为非特权任务
提供内核服务。此代码为调用内核 API 的任何无特权任务临时授予
执行内核代码所需的特权。
- 中断服务程序 (ISR)。
- 具有内存访问权限的外围设备,例如直接内存访问 (DMA) 控制器和通信端口。
授权
下表介绍了每个参与者针对每个资产获得的授权,明确授予
运行时附加授权的情况除外(例如,获得应用程序数据只读
权限的非特权任务):
|
|
参与者
|
|
|
非特权任务
|
特权任务
|
系统调用
|
ISR 代码
|
外围设备
|
资产
|
内核代码
|
-
|
RX
|
RX
|
RX
|
RW
|
应用程序代码
|
RX
|
RX
|
RX
|
RX
|
RW
|
内核数据
|
-
|
RW
|
RW
|
RW
|
RW
|
应用程序数据
|
-
|
RW
|
RW
|
RW
|
RW
|
任务上下文
|
-
|
RW
|
RW
|
RW
|
RW
|
特殊寄存器
|
-
|
RW
|
RW
|
RW
|
RW*
|
通用寄存器
|
RW
|
RW
|
RW
|
RW
|
-
|
任务的自身堆栈
|
RW
|
RW
|
RW
|
NA
|
NA
|
任何其他任务的堆栈
|
-
|
RW
|
RW
|
RW
|
RW
|
任务系统调用堆栈
|
-
|
RW
|
RW
|
RW
|
RW
|
系统堆栈
|
-
|
RW
|
RW
|
RW
|
RW
|
R:读取;W:写入;X :执行;NA:不适用。不带任何字母的连字符表示“无权限”。
*外围设备可以访问自身的特殊寄存器。
总结上表:
- 非特权任务具有:
- 应用程序代码的读取和执行权限。
- 自身堆栈的读取和写入权限。
- 通用寄存器的读取和写入权限。
- 特权任务具有:
- 所有代码的读取和执行权限。
- 所有数据的读取和写入权限。
- 所有寄存器的读取和写入权限。
- 系统调用具有:
- 所有代码的读取和执行权限。
- 所有数据的读取和写入权限。
- 所有寄存器的读取和写入权限。
- 中断服务程序具有:
- 所有代码的读取和执行权限。
- 所有数据的读取和写入权限。
- 所有寄存器的读取和写入权限。
- 外围设备具有:
- 所有内存和自身寄存器的读取和写入权限。
入口点
系统调用 - FreeRTOS 系统调用将内核应用程序编程接口 (API) 与特定代码包装在一起,
从而为非特权任务提供内核服务。此代码为调用内核 API 的任何非特权任务
临时授予执行内核代码所需的特权。
在 FreeRTOS 特权管理的控制范围内,我们还可以参见
CWE-269
作为对相关威胁的访问控制映射的引用。
信任边界
非特权任务实施系统调用以执行内核 API 函数
是唯一一次跨越信任边界的情况。
信任边界。 点击放大。
不变量
FreeRTOS 调度器启动后,参与者无法访问其无权访问的
任何资产。
威胁分析和建模
威胁分类依据的是
STRIDE
(欺骗/篡改/否认/信息泄露/拒绝服务/特权提升)模型。
由内核缓解的威胁
在以下所有威胁中均假设攻击者为无特权运行。
1. 访问特权扰乱
威胁类别 - 篡改、信息披露、特权提升。
描述 - 如果参与者成功访问(以读取、写入或执行)
无权访问的资产,则视为访问特权扰乱。
缓解 - FreeRTOS 内核在调度器启动和每个任务上下文切换时对 MPU 进行编程,
以便 MPU 执行授权部分的表格中描述的
授权。
2. 堆栈溢出
威胁类别 - 篡改。
描述 - 堆栈指针增长超出堆栈内存时会发生堆栈溢出,导致内存
损坏。
缓解 - FreeRTOS 内核使用 MPU 区域为非特权任务
授予访问其自身堆栈的权限。MPU 区域的大小和起始地址与堆栈的大小和起始地址相匹配,
因此在堆栈外部写入会导致内存保护故障。
应用程序编写者必须确保堆栈大小和对齐遵守
由 MPU 硬件施加的任何限制。应用程序编写者还必须确保堆栈附近的内存
无法由相同任务访问。
3. 堆栈操作攻击
威胁类别 - 篡改、特权提升。
描述 - 非特权任务具有自身堆栈的写入权限。攻击者可通过此功能利用
未能在使用之前初始化堆栈内存的内核函数。
缓解- 在仅特权代码可访问的独立堆栈上执行系统调用
。
4. 利用以指针为参数的系统调用来实现任意读取或写入
威胁类别 - 篡改、信息披露。
描述 - 攻击者可以向系统调用传递不正确的参数,以欺骗内核代码从任何内存中读取或
写入任何内存。
缓解 - 系统调用实施严格的参数检查,包括指针参数的访问权限检查。
5. 利用以函数指针为参数的系统调用实现任意代码
执行
威胁类别 - 特权提升。
描述 - 攻击者可以通过将函数的地址传递给系统调用来提升其特权。
实现特权提升时会从特权上下文中执行提供的函数。
缓解 - 通过审核所有系统调用来缓解,以确保接受以函数指针为
参数的系统调用仅在调用任务的上下文中执行函数。
6. 利用系统调用实现拒绝服务
威胁类别 - 拒绝服务。
描述 - 攻击者可以使用 FreeRTOS 系统调用来干扰其他任务或整个系统。
缓解 - 可能被用于干扰其他任务或整个系统的 FreeRTOS 系统调用
仅局限于特权代码。
7. 假内核对象句柄
威胁类别 - 篡改、信息披露。
描述 - 攻击者可以通过传递精心制作的内存块地址欺骗内核任意读取或写入内存,
而不是将内核对象句柄作为系统调用的参数。
缓解 - 内核对象句柄是不透明且可间接验证的整数,
并非地址。
8. 使用攻击者控制的内存创建内核对象
威胁类别 - 篡改、信息披露。
描述 - 静态分配的内核对象使用应用程序编写者提供的内存。使用
攻击者提供的内存可以使攻击者操作内核。
缓解 - 非特权任务无法访问静态分配内存中用于创建内核对象的
系统调用。对象可通过特权任务中的静态分配内存创建或
在调度器启动之前创建。
9. 覆盖内核 MPU 保护
威胁类别 - 篡改、信息披露、特权提升。
描述 - 攻击者可以通过重叠 MPU 区域来规避内核内存保护(在
MPU 硬件支持下)。
缓解 - ARMv7-M MPU 是允许重叠 MPU 区域的唯一受支持 MPU
。在该架构上,高编号 MPU 区域优先于低编号 MPU 区域,
因此内核使用最高的区域编号(无法覆盖)来保护
自身代码和数据。
10. 换出后操作任务上下文
威胁类别 - 篡改、特权提升。
描述 - 任务的上下文既包括通用寄存器,也包括特殊寄存器。内核存储
每个未运行任务的上下文,以便未来再次运行任务。攻击者可以
通过操作已保存的上下文来劫持控制流或提升任务的特权。
缓解 - 任务上下文存储在任务控制块 (TCB) 中,属于内核
内部数据结构,因此非特权代码无法访问。
11. 特权提升尝试
威胁类别 - 特权提升。
描述 - 攻击者可以执行系统调用使用的程序集指令来提升特权。
缓解 - 仅当源自系统调用时才授予特权提升
。
12. 通过堆栈泄漏信息
威胁类别 - 信息披露。
描述 - 通过系统调用存储在堆栈上的机密数据可以保留在堆栈上,
在系统调用返回后可由非特权任务访问。
缓解 - 通过在仅可由特权代码访问的单独堆栈上执行系统调用来缓解。
内核未缓解的威胁
1. 通过寄存器泄露信息
威胁类别 - 信息披露。
描述 - 通过系统调用存储在通用寄存器中的机密数据可以保留在寄存器中,
在系统调用返回后可由非特权任务访问。
缓解 - 此威胁被视为低风险。由于内核系统调用不使用
在非特权任务读取时可能会出现问题的数据,因此此威胁未缓解。使用
机密数据的应用程序编写者添加的系统调用必须采取适当措施
在返回之前从寄存器中删除数据。
应用程序需要缓解的威胁
1. 调度器启动之前不受信任的代码执行
威胁类别 - 篡改、信息披露、特权提升。
描述 - 微控制器 (MCU) 启动,进入并保持特权模式,直至调度器启动。
调度器启动之前,内核不针对不受信任的代码执行提供任何保护。
缓解 - 应用程序编写者必须确保调度器启动之前
未执行不受信任的代码。强烈建议使用仅启动已验证且已签名映像的安全启动序列,
并且仅执行非特权任务中不受信任的代码。
2. ISR 中不受信任的代码执行
威胁类别 - 篡改、信息披露、特权提升。
描述 - MCU 在执行 ISR 之前进入特权模式。内核不针对
进入 ISR 与 ISR 返回或降低其特权之间不受信任的代码执行提供任何保护。
缓解 - 应用程序编写者必须确保任何 ISR 中
均未执行不受信任的代码。强烈建议使用仅启动已验证且已签名映像的安全启动序列,
以尽可能缩短 ISR,并将大多数中断处理推迟至非特权
任务。为所有 ISR 安装单一入口点有助于管理特权级别。
3. 配置不正确
威胁类别 - 篡改、信息披露。
描述 - 应用程序可能无法正确导出以下链接器变量:
__FLASH_segment_start__
和 __FLASH_segment_end__
- 包含所有代码的内存开始和结束。
__privileged_functions_start__
和 __privileged_functions_end__
- 包含位于 privileged_functions 部分中的内核代码的内存开始和结束。
__syscalls_flash_start__
和 __syscalls_flash_end__
- 包含位于 freertos_system_calls 部分中的 FreeRTOS 系统调用的内存开始和结束。
__privileged_data_start__
和 __privileged_data_end__
- 包含位于 privileged_data 部分中的内核数据的内存开始和结束。
应用程序编写者必须确保上述内存区域的大小和对齐符合
MPU 硬件施加的任何限制。应用程序编写者必须
为 ARMv8-M 移植将 configENABLE_MPU
定义为 1。
缓解 - 应用程序编写者必须确保 FreeRTOS 配置正确。
4. 物理攻击
威胁类别 - 篡改、信息披露。
描述 - 终端产品可能遭受物理攻击,例如故障或旁路攻击。
缓解 - MPU 保护不能抵御所有物理攻击。应用程序
编写者必须制定针对物理攻击的保护措施,或为
环境中运行了 FreeRTOS 的设备部署物理访问限制(如需要)。
5. 源代码完整性
威胁类别 - 篡改。
描述 - 应用程序编写者可以修改 FreeRTOS 源代码,这可能会引入漏洞。
缓解 - 应用程序编写者不得修改 FreeRTOS 源代码。
6. 应用程序二进制完整性
威胁类别 - 篡改。
描述 - 终端产品中运行的二进制文件被修改后可能引入漏洞。
缓解 - 应用程序编写者必须使用硬件信任根、
安全启动和加密签名验证等机制确保应用程序二进制完整性。
7. 非特权任务通过合法系统调用访问有效的内核对象
威胁类别 - 篡改、信息披露。
描述 - 非特权任务可以通过合法系统调用访问本不该访问的
有效内核对象。
缓解 - 应用程序编写者必须确保非特权任务不会
访问其不该访问的任何内核对象。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.