使用加密芯片为物联网器件设计增加安全引导

作者:Stephen Evanczuk

投稿人:DigiKey 北美编辑

尽管开发人员已经采取最大努力,但是仍然可能将物联网 (IoT) 设计暴露在预期用来维护安全性的代码攻击之下。黑客经常会用受损代码替换固件,以攻击看似安全的设计。安全引导方法可以缓解这些攻击,但可能难以确保正确实现。

开发人员需要更简单的方法来实现安全引导,将其作为确保物联网器件安全性的整体策略的一部分。

本文简要回顾了物联网器件设计中的常见攻击面,以及安全密钥存储、加密和身份验证等基本安全方法的作用;然后介绍了一种安全芯片,能让开发人员在整体策略所需的其他功能中添加安全引导,以确保物联网器件的安全。

物联网器件漏洞

对于黑客而言,物联网器件带来了可用以破坏器件本身、其网络甚至是最终应用的多个入口点。虽然开发人员可以使用各种技术来增强网络和应用安全性,但由于物联网器件上可用的存储器和处理资源有限,因此确保其安全性仍是一项挑战。

尽管开发人员在采用加密方法来保护数据,但许多器件都不具备所需的安全身份验证功能,无法防止黑客伪装成授权服务器、网关或其他物联网器件来拦截通信。某些情况下,如果器件使用有效但较弱的身份验证方法,仍然容易受到复杂的漏洞程序攻击,这些攻击会拦截看似私密的通信会话中所用的有效安全密钥,然后加以重复使用。

物联网器件更新

一个更加底层的安全漏洞涉及数量快速增长的物联网器件中内置的空中升级 (OTA) 功能。空中升级为快速发展的物联网市场提供了一项重要功能。开发人员可通过升级已部署器件的固件,响应客户对新功能不断变化的需求(或修复错误)。在典型的空中升级流程中,物联网器件将定期寻找更新,在新代码可用时下载新代码,并执行一系列系统调用以完成更新流程。

例如,对于 Microchip Technology 基于 SAM D21 MCU 的物联网器件,其固件将包含空中升级代码,用于从某个预设端点下载镜像,之后固件会检查是否执行成功,然后切换到新的固件集(列表 1)。在 Microchip 高级软件框架包提供的这个列表中,OTA 固件初始化 (m2m_ota_init()) 之后,回调例程 OtaUpdateCb() 会在 OTA 固件下载新代码镜像后,切换到新固件集 (m2m_ota_switch_firmware()),然后系统复位即会引导 MCU 重启到已更新的固件。

副本

static void OtaUpdateCb(uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus)

{

    if(u8OtaUpdateStatusType == DL_STATUS) {

        if(u8OtaUpdateStatus == OTA_STATUS_SUCSESS) {

            //switch to the upgraded firmware

            m2m_ota_switch_firmware();

        }

    }

    else if(u8OtaUpdateStatusType == SW_STATUS) {

        if(u8OtaUpdateStatus == OTA_STATUS_SUCSESS) {

            M2M_INFO("Now OTA successfully done");

            //start the host SW upgrade then system reset is required (Reinitialize the driver)

        }

    }

}

 

void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg)

{

    case M2M_WIFI_REQ_DHCP_CONF:

    {

        //after successfully connection, start the over air upgrade

        m2m_ota_start_update(OTA_URL);

    }

    break;

    default:

    break;

}

 

int main (void)

{

    tstrWifiInitParam param;

    tstr1xAuthCredentials gstrCred1x    = AUTH_CREDENTIALS;

    nm_bsp_init();

   

    m2m_memset((uint8*)&param, 0, sizeof(param));

    param.pfAppWifiCb = wifi_event_cb;

   

    //Initialize the WINC Driver

    ret = m2m_wifi_init(&param);

    if (M2M_SUCCESS != ret)

    {

        M2M_ERR("Driver Init Failed <%d>\n",ret);

        while(1);

    }

    //Initialize the OTA module

    m2m_ota_init(OtaUpdateCb,NULL);

    //connect to AP that provide connection to the OTA server

    m2m_wifi_default_connect();

 

    while(1)

    {

       

        //Handle the app state machine plus the WINC event handler                                                                    

        while(m2m_wifi_handle_events(NULL) != M2M_SUCCESS) {

           

        }

       

    }

}

列表 1:这是来自 Microchip 高级软件框架包的无线 (OTA) 代码样例,一个 Wi-Fi 事件句柄回调函数 wifi_event_cb() 使用指定 URL 启动空中升级 m2m_ota_start_update(OTA_URL),并在成功完成 OtaUpdateCb() 后,切换至新固件 m2m_ota_switch_firmware()。(代码来源:Microchip Technology)

为了检查下载的代码是否有效,开发人员长期依赖由认可的认证机构颁发的代码签名证书。即便如此,安全数据存储、验证技术实现和证书保护方面的不足也为黑客提供了操纵侵入物联网器件的途径。

即使使用传统的安全技术,器件自身的固件更新流程也可能遭受侵害,有效代码被替换成受损代码。在重启时,器件会成为黑客用来更深入地渗透物联网网络、物联网应用甚至企业内部资源的工具。

在这种情况下,安全引导物联网器件的能力便成为一道关键防线。但是,对于开发人员而言,要实现安全引导,在安全存储、加密、身份验证和代码验证机制方面需满足多种要求。

有些攻击方法侧重于从器件存储中检索安全密钥、拦截加密数据、欺骗身份验证机制以及破坏代码验证算法,如果以软件方式实现安全引导,更新流程将暴露于这些危险之中。实际上,物联网设计通常缺乏额外的存储器和处理能力,而这正是软件解决方案在所有情况下都需要的。即便如此,硬件实现也无法始终保证安全性。

为了在硬件中实现安全引导,物联网器件往往需要大量专用器件,而这会大幅增加设计复杂性和成本,这种情况直到最近才有所改观。即使开发人员集成了这些独立器件,意向坚决的黑客也可以轻松获取目标物联网器件的样件,并通过其总线和信号互连攻击单个安全器件。相比之下,Microchip Technology 的 ATECC608A 是一种单芯片解决方案,允许开发人员在不暴露底层机密或安全机制的情况下添加安全引导。

安全 IC

ATECC608A 是一款 8 引脚安全器件,可通过简单的串行接口为主机 MCU 提供先进的安全功能补充(图 1)。

Microchip Technology ATECC608A 是一款 8 引脚加密协处理器图片

图 1:ATECC608A 是一款 8 引脚加密协处理器,具有基于硬件的安全密钥存储器。(图片来源:Microchip Technology)

该器件提供基于硬件的完整安全解决方案,将其集成的加密加速器与片载安全存储器相结合,支持各种加密算法,包括 SHA-256、AES-128 以及稳健的椭圆曲线算法,如椭圆曲线数字签名 (ECDSA)、椭圆曲线 Diffie-Hellman (ECDH) 和 NIST 曲线 P-256 等。除了这些加密机制,该器件还支持包括 TLS 1.3 在内的更高级别的传输层安全 (TLS) 协议。与早期器件不同,ATECC608A 可以生成并安全存储会话密钥,这有助于减轻使用 TLS 身份验证时常见的威胁来源。

这些功能在确保物联网器件正常运行方面发挥着重要作用,但 ATECC608A 对安全引导的支持将安全覆盖范围扩展到基本固件更新流程。ATECC608A 会验证新代码集,并向 MCU 返回表示成功或失败的消息。此时,根据现有安全策略,MCU 可以重试更新,向安全监视器端点发送警告消息,暂停或忽略更新并重启进入原始代码。

硬件集成

对于开发人员而言,在向基于 MCU 的设计添加安全引导和其他安全功能方面,ATECC608A 带来的额外要求相对较少。在硬件方面,设计人员需要处理最多四个连接:VCC、GND、串行时钟输入 (SCL) 和串行数据 (SDA)。其余四个引脚未连接。除了将 VCC 连接到 2.0 V 至 5.5 V 电源外,唯一待确定的是与 MCU 的串行连接。

设计人员可以将器件的 SCL 和 SDA 引脚连接到 MCU,以实现传统的 I2C 连接。或者,设计人员可以利用器件对 Microchip 单线接口的支持。这里,开发人员将器件的 SDA 端口连接到 MCU GPIO 引脚,并使用 Microchip 的单线时序协议传输逻辑 0 和 1 值(图 2)。

Microchip 单线串行协议示意图

图 2:在 Microchip 单线串行协议中,一个指定持续时间的波形转换序列发出逻辑 0 或逻辑 1 信号。(图片来源:Microchip Technology)

在此协议中,ATECC608A 与 MCU 之间的逻辑值传输始于指定持续时间的起始脉冲 (tSTART)。在起始脉冲之后,协议将逻辑 0 定义为指定了持续时间的一个循环,由零传输高脉冲 (tZHI) 与随后的零传输低脉冲 (tZLO) 组成。同样,持续的高电平表示逻辑 1 传输。

无论哪种情况下,协议都希望信号在指定位时间 (tBIT) 内降低。在一系列位传输之后,如果串行线路在指定的 IO 超时持续时间后变为非活动状态,则可以将器件编程为自动进入休眠模式。但是,使用 ATECC608A 的开发人员很少需要关注此协议的时序细节:Microchip 定义的关键时序参数与在 230.4 Kbaud 运行的标准 UART 兼容。

器件配置

在器件级别,ATECC608A 需要的配置设置最少。开发人员可以使用 I2C 或单线串行接口加载 I2C 地址等设置,或设置一些功能,如唤醒或开机时自检。该器件确实提供了与超低功耗物联网设计特别相关的配置设置。

在这些设计中,ATECC608A 在其空闲或休眠模式下增加的总功耗预算相对较少,这两种模式可能是典型物联网设计中的最常见状态。在空闲模式下,器件功耗约为 800 微安 (μA);在休眠模式下,功耗为 150 纳安 (nA) 或更低,具体取决于配置。当 MCU 唤醒器件执行某些安全流程时,器件的功耗在有效工作期间仍只有 14 毫安 (mA)。即便如此,具有严格功耗预算的设计也可能需要甚至更低的有功功率水平。

为了支持这些设计,该器件提供了一个配置选项,允许开发人员选择三种不同的工作模式,通过减缓执行速度来实现更低的功耗。因此,开发人员可通过相应减缓执行速度,将有功功率从最大执行速度下的 14 mA 降至 6 mA 或 3 mA。

除了各种低级配置项之外,如果在开发之前已落实安全器件(如 ATECC608A)的安全信息,会更为有效。开发过程中所执行安全密钥和证书的错误或漏洞甚至会致使最佳安全措施失效。为解决这一可能的威胁,Microchip 的可信配置服务会在制造过程中加载包括密钥和证书在内的安全数据。

在工厂的安全环境中加载安全信息后,即使器件通过供应链中的正常处理流程,也可以保护其不被意外或故意发现。ATECC608A 包含一种特殊的传输锁定功能,在使用从最终主机 MCU 传输的已知密钥以加密方式启用器件前,禁止使用器件。

一旦被主机 MCU 启用,ATECC608A 就会随机生成一个与 MCU 共享的称为 IO 保护密钥的密钥。ATECC608A 与 MCU 之间的后续通信使用此 IO 保护密钥进行加密——这是一种在安全引导和其他安全流程中提供额外身份验证的机制。

如果黑客希望切断与 ATECC608A 的连接并将自己的“成功”信号馈送给 MCU 以欺骗验证流程,此 IO 保护密钥机制将导致 MCU 忽略错误信号。即使黑客以某种方式破坏 ATECC608A 器件并尝试在不同的系统上使用它,IO 保护密钥机制也会有效阻止其使用。

软件集成

ATECC608A 具有所有精致的功能和保护机制,可以直接应用到基于 MCU 的设计。除了实现前面提到的简单硬件接口和配置设置之外,开发人员还可使用抽象出操作细节的应用编程接口 (API)。Microchip 的 CryptoAuthLib 加密认证库提供一个全面的软件包,其中包含充分利用 ATECC608A 功能所需的定义、结构和 API 调用。此库充当硬件中立层,通过硬件抽象层 (HAL) API 和用于特定硬件目标的驱动程序来运作(图 3)。

Microchip CryptoAuthLib 库图片

图 3:Microchip 的 CryptoAuthLib 库在应用和底层硬件之间提供了一个加密服务层,可通过硬件特定驱动程序之上的硬件抽象层访问该服务层,从而实现跨不同硬件组的可移植性。(图片来源:Microchip Technology)

开发人员使用 CryptoAuthLib API 例程(如 io_protection_set_key())创建 IO 保护密钥,并使用 atcab_secureboot() 对照调用参数中包含的代码摘要或签名,执行 ATECC608A 的安全引导验证机制。

虽然 API 命令很简单,但实现安全性所需的特定设置、管理和操作步骤可能颇具挑战性。如果关键步骤缺失或未按顺序执行,开发人员试图实现的安全机制可能会导致延迟。

使用 Microchip 基于 SAM D21 MCU 的 ATSAMD21-XPRO 开发套件及其配备 ATECC608A 的 ATCRYPTOAUTH-XPRO-B 扩展板,开发人员可以快速获得使用这些通用机制和 ATECC608A 特定功能的经验。Microchip 提供在 ATSAMD21-XPRO 和 ATCRYPTOAUTH-XPRO-B 上运行的广泛安全引导软件包,使用 Microchip ATOLED1-XPRO 为样例应用提供基本显示接口(图 4)。

Microchip 基于 SAM D21 MCU 的 ATSAMD21-XPRO 开发套件图片

图 4:开发人员可以使用 Microchip 软件和基于 SAM D21 MCU 的 ATSAMD21-XPRO 开发套件快速评估安全引导流程,其中开发套件结合了配备 ATECC608A 的 ATCRYPTOAUTH-XPRO-B 扩展板和 ATOLED1-XPRO 显示扩展板。(图片来源:Microchip Technology)

包含在 SAM D21 演示包中的完整安全引导例程说明了用于设置、执行和检查安全引导操作状态的关键软件设计模式(列表 2)。通过此硬件平台和演示软件包,开发人员可以快速评估 ATECC608A 的远程引导使用情况,并根据需要修改样例软件以满足自己的要求。

副本

/** \brief Handles secure boot functionality through initialization, execution,

 *         and de-initialization.

 *  \return ATCA_SUCCESS on success, otherwise an error code.

 */

ATCA_STATUS secure_boot_process(void)

{

    ATCA_STATUS status;

    secure_boot_parameters secure_boot_params;

    uint8_t secure_boot_mode;

    bool secure_boot_app_valid = false;

 

    /*Initialize secure boot */

    if ((status = secure_boot_init(&secure_boot_params)) != ATCA_SUCCESS)

    {

        return status;

    }

 

    do

    {

        .

        .

        .

        #if SECURE_BOOT_DIGEST_ENCRYPT_ENABLED

        .

        .

        .

        /*Get IO Protection Key*/

        if ((status = io_protection_get_key(secure_boot_params.io_protection_key)) != ATCA_SUCCESS)

        {

            return status;

        }

 

        if ((status = atcab_secureboot_mac(secure_boot_mode,

                                           (const uint8_t*)&secure_boot_params.app_digest,

                                           (const uint8_t*)&secure_boot_params.memory_params.signature,

                                           (const uint8_t*)secure_boot_params.randomnum,

                                           (const uint8_t*)secure_boot_params.io_protection_key,

                                           &secure_boot_app_valid)) != ATCA_SUCCESS)

        {

            break;

        }

        #else

        if ((status = atcab_secureboot(secure_boot_mode,

                                       0,

                                       (const uint8_t*)&secure_boot_params.app_digest,

                                       (const uint8_t*)&secure_boot_params.memory_params.signature,

                                       NULL)) != ATCA_SUCCESS)

        {

            break;

        }

        secure_boot_app_valid = true;

        #endif

 

        /*Check whether the secure boot command executed successfully with the correct return mac  */

        if (!secure_boot_app_valid)

        {

            break;

        }

        .

        .

        .

    }

    while (0);

 

    /* De-initialize memory interface and release its resources*/

    secure_boot_deinit_memory(&secure_boot_params.memory_params);

 

    return status;

}

列表 2:Microchip SAM D21 演示包的这个代码片段展示了安全引导的关键设计模式,包括检查 IO 保护密钥 (io_protection_get_key()) 以及使用其摘要、签名和其他参数(atcab_secureboot_mac()atcab_secureboot(),具体取决于所选配置)验证固件。(代码来源:Microchip Technology)

总结

物联网器件为意图使用受损器件入侵物联网网络、应用和企业资源的黑客提供了多个威胁面。在解决技术中,安全引导是更广泛安全策略中的关键要素。然而,安全引导的实现本身也有一套要求,如果处理不当,可能会使系统暴露于危险当中。

Microchip Technology 的 ATECC608A 安全 IC 在单个封装中提供一个全面的解决方案,使开发人员能够将其轻松添加到任何基于 MCU 的设计中。开发人员可以利用 ATECC608A 极大地增强安全性并确保其物联网设计中的安全引导。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Stephen Evanczuk

Stephen Evanczuk 拥有 20 多年的电子行业编辑经验,主题涉猎广泛,涵盖硬件、软件、系统以及包括物联网在内的各种应用。他拥有神经网络领域的神经科学博士学位,曾经从事航空航天领域大规模分布式安全系统和算法加速方法方面的工作。目前,他不是在撰写技术和工程文章,就是在研究深度学习在识别和推荐系统方面的应用。

关于此出版商

DigiKey 北美编辑