移植 OTA 库 - FreeRTOS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

移植 OTA 库

借助 FreeRTOS 无线 (OTA) 更新,您可以执行以下操作:

  • 将新的固件映像部署到单个设备、一组设备或整个队列中。

  • 在将设备添加到组,或重置或重新预置设备时,将固件部署到设备。

  • 在新固件部署到设备之后,验证其真实性和完整性。

  • 监控部署进度。

  • 调试失败的部署。

有关更多信息,请参阅 FreeRTOS 用户指南 中的 FreeRTOS 无线更新

您可以使用 OTA 代理库,将 OTA 功能集成到您的 FreeRTOS 应用程序中。有关更多信息,请参阅 FreeRTOS 用户指南 中的 FreeRTOS OTA 代理库

FreeRTOS 设备必须在它们接收到的 OTA 固件映像上强制实施加密代码签名验证。我们建议采用下列算法:

  • 椭圆曲线数字签名算法 (ECDSA)

  • NIST P256 曲线

  • SHA-256 哈希

注意

目前,资格认证不需要移植 FreeRTOS OTA 更新库。

先决条件

要移植 OTA 代理库,需要具备以下条件:

移植

/vendors/vendor/boards/board/ports/ota/aws_ota_pal.c 包含一组平台抽象层 (PAL) 函数的空定义。至少实现此表中列出的一组函数。

功能 说明
prvPAL_Abort 中止 OTA 更新。
prvPAL_CreateFileForRx 创建文件来存储收到的数据块。
prvPAL_CloseFile 关闭指定的文件。如果使用实现加密保护的存储,这可能会对文件进行身份验证。
prvPAL_WriteBlock 按照指定偏移量将数据块写入指定文件。在成功时,将返回写入的字节数。否则,将返回负数错误代码。
prvPAL_ActivateNewImage 激活或启动新的固件映像。对于某些端口,如果以编程方式同步重置设备,此函数可能不会返回。
prvPAL_SetPlatformImageState 执行平台所需的任何操作来接受或拒绝最新的 OTA 固件映像(或包)。要确定如何实现此函数,请参阅您的主板(平台)的文档以了解详细信息和架构。
prvPAL_GetPlatformImageState 获取 OTA 更新映像的状态。

如果您的设备已内置相应支持,实施此表中的函数。

功能 说明
prvPAL_CheckFileSignature 验证指定文件的签名。
prvPAL_ReadAndAssumeCertificate 从文件系统读取指定的签署人证书并将其返回给调用方。

确保您有支持 OTA 更新的引导加载程序。有关移植随 FreeRTOS 提供的引导加载程序演示应用程序或创建 IoT 设备引导加载程序的说明,请参阅IoT 设备引导加载程序

IoT 设备引导加载程序

移植引导加载程序演示

FreeRTOS 包含一个用于 PIC32MZEF Microchip 平台的演示引导加载程序应用程序。有关更多信息,请参阅 FreeRTOS 用户指南 中的 Microchip Curiosity PIC32MZEF 的演示引导加载程序。您可以将此演示移植到其他平台。

如果选择不将演示移植到您的平台,您可以使用自己的引导加载程序。IoT 设备引导加载程序的威胁建模讨论了威胁建模,以帮助您编写自己的安全引导加载程序应用程序。

IoT 设备引导加载程序的威胁建模

背景

作为工作定义,该威胁模型引用的嵌入式 IoT 设备是基于微控制器的产品,它们与云服务进行交互。它们可以部署在消费者、商业或工业环境中。IoT 设备可以收集有关用户、患者、机器或环境的数据,并且可以控制从灯泡和门锁到工厂机器的任何事物。

从假设对手的角度看,威胁建模是一种保护安全的方法。通过考虑对手的目标和方法,创建了一个威胁列表。威胁是对手对资源或资产发起的攻击。该列表具有优先级,并用于确定或创建缓解措施。在选择缓解措施时,实施和维护这些措施的成本应与它们提供的实际安全价值相平衡。可以使用多种威胁模型方法。每种方法可以支持开发安全且成功的 IoT 产品。

FreeRTOS 为 IoT 设备提供 OTA(“无线”)软件更新。更新工具将云服务与设备上的软件库和合作伙伴提供的引导加载程序结合使用。该威胁模型明确侧重于针对引导加载程序的威胁。

引导加载程序使用案例

  • 在部署之前对固件进行数字签名和加密。

  • 将新的固件映像部署到单个设备、一组设备或整个队列中。

  • 在新固件部署到设备之后,验证其真实性和完整性。

  • 设备仅运行来自受信任的来源的未修改软件。

  • 设备可以灵活处理通过 OTA 收到的故障软件。

数据流程图

威胁

一些攻击具有多种缓解措施;例如,可以在 TLS 服务器提供的证书和新固件映像的代码签名者证书中验证信任关系,以缓解旨在提供恶意固件映像的网络中间人攻击。为了最大限度提高引导加载程序的安全性,任何非引导加载程序缓解措施都被视为不可靠的。引导加载程序应具有每种攻击的内在缓解措施。设置分层缓解措施被称为纵深防御。

威胁:

  • 攻击者劫持设备到服务器的连接以提供恶意固件映像。

    缓解措施示例

    • 在引导时,引导加载程序使用已知证书验证映像的加密签名。如果验证失败,引导加载程序将回滚到上一个映像。

  • 攻击者利用缓冲区溢出以将恶意行为引入到闪存中存储的现有固件映像。

    缓解措施示例

    • 在引导时,引导加载程序将按照上面所述进行验证。如果验证失败并且没有以前的映像,引导加载程序将停止。

    • 在引导时,引导加载程序将按照上面所述进行验证。如果验证失败并且没有以前的映像,引导加载程序将进入故障保护仅 OTA 模式。

  • 攻击者将设备引导到以前存储的映像,从而可以利用该映像发起攻击。

    缓解措施示例

    • 在成功安装和测试新映像后,将擦除存储上一个映像的闪存扇区。

    • 在每次成功升级时,都会熔断保险丝,每个映像将会重新熔断保险丝才能运行,除非已熔断正确数量的保险丝。

  • OTA 更新提供故障或恶意映像,从而导致设备无法正常运行。

    缓解措施示例

    • 引导加载程序启动硬件监视程序计时器,以触发回滚到上一个映像。

  • 攻击者修补引导加载程序以绕过映像验证,因此,设备将接受未签名的映像。

    缓解措施示例

    • 引导加载程序位于 ROM(只读存储器)中,无法进行修改。

    • 引导加载程序位于 OTP(一次性可编程存储器)中,无法进行修改。

    • 引导加载程序位于 ARM TrustZone 的安全区域中,无法进行修改。

  • 攻击者替换验证证书,因此,设备将接受恶意映像。

    缓解措施示例

    • 证书位于加密协处理器中,无法进行修改。

    • 证书位于 ROM、OTP 或安全区域中,无法进行修改。

进一步的威胁建模

该威胁模型仅考虑引导加载程序。进一步的威胁建模可能会提高整体安全性。建议的方法是列出对手的目标、这些目标针对的资产以及资产的入口点。可以考虑为控制资产而对入口点发起的攻击以创建威胁列表。以下是 IoT 设备的目标、资产和入口点示例列表。这些列表并非详尽无遗,旨在为您提供一些启发。

对手的目标

  • 敲诈钱财

  • 诋毁声誉

  • 伪造数据

  • 转移资源

  • 远程监视目标

  • 实际访问站点

  • 造成严重破坏

  • 灌输恐怖

主要资产

  • 私有密钥

  • 客户端证书

  • CA 根证书

  • 安全凭证和令牌

  • 客户的个人身份信息

  • 商业机密实施

  • 传感器数据

  • 云分析数据存储

  • 云基础设施

入口点

  • DHCP 响应

  • DNS 响应

  • 基于 TLS 的 MQTT

  • HTTPS 响应

  • OTA 软件映像

  • 应用程序指示的其他内容,例如 USB

  • 实际访问总线

  • 开封 IC

测试

如果使用 IDE 构建测试项目,您需要在 IDE 项目中设置库移植。

设置 IDE 测试项目

如果使用 IDE 进行移植和测试,您需要先将一些源文件添加到 IDE 测试项目中,然后才能测试移植的代码。

重要

在以下步骤中,请确保您将源文件从磁盘上位置添加到了 IDE 项目。请勿创建源文件的重复副本。

在 IDE 项目中设置 OTA 库

  1. 将源文件 /vendors/vendor/boards/board/ports/ota/aws_ota_pal.c 添加到 aws_tests IDE 项目中。

  2. 将以下测试源文件添加到 aws_tests IDE 项目:

    • /libraries/freertos_plus/aws/ota/test/aws_test_ota_cbor.c

    • /libraries/freertos_plus/aws/ota/test/aws_test_ota_agent.c

    • /libraries/freertos_plus/aws/ota/test/aws_test_ota_pal.c

    • /demos/ota/aws_iot_ota_update_demo.c

配置 CMakeLists.txt 文件

如果使用 CMake 构建测试项目,您需要在 CMake 列表文件中为库定义一个可移植层目标。

要在 CMakeLists.txt 中定义库的可移植层目标,请按照FreeRTOS 可移植层中的说明进行操作。

/vendors/vendor/boards/board/CMakeLists.txt 中的 CMakeLists.txt 模板列表文件包括示例可移植层目标定义。您可以取消注释要移植的库的定义,并对其进行修改以适合您的平台。

以下是 OTA 库的可移植层目标定义示例。

# OTA afr_mcu_port(ota) target_sources( AFR::ota::mcu_port INTERFACE "path/aws_ota_pal.c" )

有两组 OTA 库移植测试:OTA 代理和 OTA PAL 测试OTA 端到端测试

OTA 代理和 OTA PAL 测试

设置本地测试环境

配置 OTA 代理和 OTA PAL 测试的源文件和标头文件

  1. 打开 /vendors/vendor/boards/board/aws_tests/config_files/aws_test_runner_config.h,然后将 testrunnerFULL_OTA_AGENT_ENABLEDtestrunnerFULL_OTA_PAL_ENABLED 宏设置为 1 以启用代理和 PAL 测试。

  2. ota/test 中为您的设备选择签名证书。在 OTA 测试中,使用该证书进行验证。

    测试代码中提供三种类型的签名证书:

    • RSA/SHA1

    • RSA/SHA256

    • ECDSA/SHA256

    RSA/SHA1 和 RSA/SHA256 仅可用于现有平台。ECDSA/SHA256 建议用于 OTA 更新。如果您有不同方案,请联系 FreeRTOS 工程团队

运行测试

执行 OTA 代理和 OTA PAL 测试

  1. 构建测试项目,然后将其刷写到您的设备以执行该项目。

  2. 在 UART 控制台中检查测试结果。

    ...

OTA 端到端测试

设置并运行端到端 OTA 测试

  1. 按照 README 文件 (/tools/ota_e2e_test/README.md) 中的设置说明进行操作。

  2. 确保运行代理和 PAL 测试不会修改 aws_clientcredential.haws_clientcredential_keys.haws_application_version.haws_ota_codesigner_certificate.h 标头文件。

  3. 要运行 OTA 端到端测试脚本,请按照 README 文件 (/tools/ota_e2e_test/README.md) 中的示例进行操作。

验证

要正式对设备进行 FreeRTOS 资格认证,您需要使用 AWS IoT Device Tester 验证设备的移植源代码。按照《FreeRTOS 用户指南》中的将 AWS IoT Device Tester 用于 FreeRTOS 中的说明操作,设置 Device Tester 以进行移植验证。要测试特定库的移植,必须在 Device Tester configs 文件夹下面的 device.json 文件中启用正确的测试组。

移植 FreeRTOS OTA 库和引导加载程序演示后,可以开始移植低功耗蓝牙库。有关说明,请参阅 移植低功耗蓝牙库

如果您的设备不支持低功耗蓝牙功能,则您已完成并可以开始 FreeRTOS 资格认证流程。有关更多信息,请参阅 FreeRTOS 资格认证指南