移植Amazon IoT无线更新库 - FreeRTOS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

移植Amazon IoT无线更新库

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

  • 将固件映像部署到单个设备、一组设备或整个机群。

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

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

  • 监控部署进度。

  • 调试失败的部署。

  • 使用 Amazon IoT 的代码签名对固件进行数字签名。

有关更多信息,请参阅 。FreeRTOS 更新中的FreeRTOS 用户指南以及 Amazon IoT无线更新文档.

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

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

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

  • NIST P256 曲线

  • SHA-256 哈希

注意

目前,设备认证不需要移植 FreerTOS OTA 更新库。

Prerequisites

移植平台

您必须提供 OTA 可移植抽象层 (PAL) 的实现,才能将 OTA 库移植到新设备。这些区域有:freertos/vendors/vendor/boards/board/ports/ota_pal_for_aws/目录包含ota_pal.hota_pal.c模板文件。这些区域有:ota_pal.c文件包含一组平台抽象层 (PAL) 函数的空定义。您必须至少实现下表中列出的函数集。有关示例,请参阅视窗模拟器 OTA PAL 实现.

函数名称

说明

otaPal_Abort

停止 OTA 更新。

otaPal_CreateFileForRx

创建文件来存储接收到的数据块。

otaPal_CloseFile

关闭指定的文件。如果您使用实现加密保护的存储,这可能会对文件进行身份验证。

otaPal_WriteBlock

按照指定偏移量将数据块写入指定文件。在成功时,函数将返回写入的字节数。否则,函数将返回负数错误代码。块大小将始终是 2 的幂,因此将被对齐。有关更多信息,请参阅 。OTA 库配置文档.

otaPal_ActivateNewImage

激活或启动新的固件映像。对于某些端口,如果以编程方式同步重置设备,此函数可能不会返回。

otaPal_SetPlatformImageState

执行平台所需的任何操作来接受或拒绝最新的 OTA 固件映像(或包)。要确定如何实现此函数,请参阅您的主板(平台)的文档以了解详细信息和架构。

otaPal_GetPlatformImageState

获取 OTA 更新映像的状态。

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

函数名称

说明

otaPal_CheckFileSignature

验证指定文件的签名。

otaPal_ReadAndAssumeCertificate

从文件系统读取指定的签署人证书并将其返回给调用方。

otaPal_ResetDevice

重置设备。

注意

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

附加信息

便携式抽象层 (PAL) 使 OTA 更新库能够独立于任何特定的硬件平台。OTA 库依赖于接口来保持独立于操作系统和 MQTT 协议实现。如果您的应用程序通过 HTTP 执行 OTA,则还有一个用于 HTTP 协议实现的接口。FreeRTOS 中的示例应用程序使用这些接口的端口,这些端口对所有平台都是通用的。因此,PAL 是唯一必须在新平台使用 OTA 库之前移植的接口。有关这些接口的信息可在用于 OTA 更新库的 FreerTOS 文档.

IoT 设备引导加载程序

移植引导加载程序演示

这些区域有:版本包含一个用于 PIC32MZEF 微芯片平台的演示启动加载程序应用程序。有关更多信息,请参阅 。Microchip Curiosity PIC32MZEF 的演示启动加载程序中的FreeRTOS 用户指南. 您可以将此演示移植到其他平台。如果您没有将该演示移植到您的平台,可以使用自己的启动加载程序应用程序。有关如何编写自己的安全启动加载程序应用程序的更多信息,请参阅。IoT 设备引导加载程序的威胁建模.

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

Background

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

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

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

引导加载程序使用案例

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

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

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

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

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

数据流程图

Threats

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

威胁:

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

    缓解措施示例

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

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

    缓解措施示例

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

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

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

    缓解措施示例

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

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

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

    缓解措施示例

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

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

    缓解措施示例

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

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

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

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

    缓解措施示例

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

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

进一步的威胁建模

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

对手的目标

  • 敲诈钱财

  • 诋毁声誉

  • 伪造数据

  • 转移资源

  • 远程监视目标

  • 实际访问站点

  • 造成严重破坏

  • 灌输恐怖

主要资产

  • 私有密钥

  • 客户端证书

  • CA 根证书

  • 安全凭证和令牌

  • 客户的个人身份信息

  • 商业机密实施

  • 传感器数据

  • 云分析数据存储

  • 云基础设施

入口点

  • DHCP 响应

  • DNS 响应

  • 基于 TLS 的 MQTT

  • HTTPS 响应

  • OTA 软件映像

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

  • 实际访问总线

  • 开封 IC

Testing

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

设置 IDE 测试项目

如果使用 IDE 进行移植和测试,您必须先将一些源文件添加到 IDE 测试项目中,然后才能测试移植的代码。这包括 OTA 库、PAL 端口和 OTA 测试代码的代码。

重要

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

在此过程中,您将 OTA 库、OTA 端口和 OTA 测试代码的文件添加到测试 IDE 项目中。

设置 IDE 测试项目

  1. 将 OTA 库代码添加到您的项目:

    1. 在文本编辑器中打开freertos/libraries/ota_for_aws/otaFilePaths.cmake文件来查看与构建 OTA 库相关的各种 CMake 变量。

    2. 添加变量中列出的文件OTA_SOURCESOTA_OS_FREERTOS_SOURCESOTA_HTTP_SOURCES(用于通过 HTTP 进行 OTA 演示),以及OTA_MQTT_SOURCES添加到 IDE 项目中。

    3. 添加变量中列出的包含路径OTA_INCLUDE_PUBLIC_DIRSOTA_INCLUDE_PRIVATE_DIRS, 和OTA_INCLUDE_OS_FREERTOS_DIRS添加到 IDE 项目中。

  2. 将 OTA PAL 代码添加到项目中:

    1. Addfreertos/vendors/vendor/boards/board/ports/ota_pal_for_aws/添加到包含路径。

    2. ota_pal.cota_pal.h文件位于freertos/vendors/vendor/boards/board/ports/ota_pal_for_aws/目录添加到您的项目中。

    3. 将任何特定于平台的文件或包含路径添加到您的项目。

  3. 将 OTA 测试源文件添加到项目:

    1. 将位于的所有源文件添加freertos\tests\integration_test\ota_pal及其子目录添加到您的项目中。

    2. Addfreertos\tests\integration_test\ota_palfreertos\tests\integration_test\ota_pal\test_files添加到测试项目的包含路径。

  4. 将 OTA 相关的配置文件添加到测试项目:

    1. ota_config.h文件(用于 aws_demo 项目)和aws_test_ota_config.h文件(适用于 aws_test 项目)的配置文件目录freertos/vendors/vendor/boards/board/aws_tests/config_files.

      您可以在freertos/vendors/vendor/boards/board/aws_tests/config_files目录。

有关 OTA IDE 测试项目的示例,请参阅GitHub网站。

配置 CMakeLists.txt 文件

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

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

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

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

# Over-the-air Updates afr_mcu_port(ota) target_sources( AFR::ota::mcu_port INTERFACE "${afr_ports_dir}/ota_pal_for_aws/ota_pal.c" "${afr_ports_dir}/ota_pal_for_aws/ota_pal.h" # Add platform specific files that are required to build ota_pal.c. ) target_include_directories( AFR::ota::mcu_port INTERFACE "${afr_ports_dir}/ota_pal_for_aws" # Add platform specific include paths that are required to build ota_pal.c. ) target_link_libraries( AFR::ota::mcu_port INTERFACE AFR::crypto AFR::ota # Add platform specific target dependencies that are required to build ota_pal.c. ) # The qualification tests for the OTA PAL port requires this include path to run. if(AFR_ENABLE_TESTS) target_include_directories( AFR::ota::mcu_port INTERFACE "${PROJECT_SOURCE_DIR}/tests/integration_test/ota_pal" ) endif()

您可以找到一个示例CMakeLists.txt文件中的GitHub.

OTA PAL 测试

设置本地测试环境

为 OTA PAL 测试配置源文件和标头文件

  1. 在文本编辑器中打开freertos/vendors/vendor/boards/board/aws_tests/config_files/aws_test_runner_config.h文件,然后将testrunnerFULL_OTA_PAL_ENABLED1以启用 PAL 测试。

  2. 打开freertos/vendors/vendor/boards/board/aws_tests/config_files/aws_test_ota_config.h文件,并针对您的平台进行配置。您可以在配置文件中找到有关存在哪些配置以及如何设置这些配置的具体详细信息。

  3. freertos/tests/integration_test/ota_pal/test_files 中为您的设备选择签名证书。在 OTA 测试中,将使用这些证书进行验证。

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

    • RSA/SHA1

    • RSA/SHA256

    • ECDSA/SHA256

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

运行测试

运行 OTA PAL 测试

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

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

如果有 25 个测试运行失败,0 个忽略,您的平台通过 OTA PAL 测试。此时,如果您已经配置了演示项目,您的平台可以用于运行 OTA 演示。

Validation

要正 FreeRTOS 对设备进行资格认证,您需要使用Amazon IoTDevice Tester。按照中的说明进行操作使用Amazon IoT适用于的 FeerTos 的 Device Tester。在 FreeRTOS 用户指南中设置设备测试器以进行端口验证。要测试特定库的移植,必须在 Device Tester configs 文件夹下面的 device.json 文件中启用正确的测试组。

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

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