乐鑫大中华区代理ESP32运行TensorFlow模型ESP故障注入漏洞影响分析,随著机器学习领域的发展,在嵌入式和IoT设备上部署/运行机器学习模型成为可能。本文只对ESP32上的TensorFlow模型的部署/运行进行了讨论。
AI之父AlanTuring早些时候就预言过“有一天,人们会带着电脑到公园里散步,然后彼此对彼此说,今天早晨我的电脑说了一个非常有趣的事情。”
人们一直在努力使机器拥有智能,也被称为“ArtificialIntelligence”。自20世纪50年代以来,人工智能先后进入“推理期”和“知识期”,在这两个阶段,机器按照人类制定的规律和概括的知识运行,永远不可能超越创作者。出现了机器学习方法,人工智能进入了“机器学习时代”。机器学习的核心是“用算法分析数据,从算法中学习,然后对世界上的事物作出决策或预测。”这就是说,你不需要明确的去写一些程序,而是告诉电脑怎样开发一个算法来完成这个任务。
随著机器学习领域的发展,在嵌入式和IoT设备上部署/运行机器学习模型成为可能。本文只对乐鑫大中华区代理ESP32上的TensorFlow模型的部署/运行进行了讨论。“HelloWorld!”将在create_sine_model.ipynb文章中介绍。有关正弦模型的代码。
TensorFlow是一种面向端的开源机器学习平台。他有一个全面灵活的生态系统,其中包含了各种工具、图书馆和社区资源,这使得研究人员能够促进机器学习领域中先进技术的开发,并且使开发人员能够轻松地构建和部署由机器学习提供支持的应用。
TensorFlowLite是一套工具,可以帮助开发者在移动,嵌入式和IoT设备上部署/运行TensorFlow模型。TensorFlowLite使设备上的机器学习推理具有低延时的特点,并且可以减少可执行程序。
TensorFlowLite包含两个主要的组件:
TensorFlowLite解释器可以运行在多种不同的硬件类型(包括电话、嵌入式Linux设备和微处理器)上,其中包括手机、嵌入式Linux设备和微处理器。
TensorFlowLite转换器将TensorFlow模型转换成一个有效的解释器使用,并对模型进行了优化,以提高可执行程序的大小和性能。
下一步,我们通过两种方法讨论如何在乐鑫大中华区代理ESP32上运行TensorFlowLite:
1.使用ESP-IDF。
2.使用PlatformIO平台。
用ESP-IDF。
1.建立ESP-IDF开发环境。
按照ESP-IDFProgrammingGuide安装工具链和ESP-IDF。
确认已正确安装ESP-IDF环境:
确保已设置了IDF_PATH环境变量。
请检查PATH环境变量中是否存在idf.py和xtensa-esp32-elf-*工具链。
2.克隆TensorFlow。
使用以下命令将TensorFlow克隆到本地:
gitclonehttps://github.com/tensorflow.git。
3.生成一个hello_world样例项目。
按照以下命令,您可以使用tensorflow目录生成hello_world样例项目:
make-ftensorflow/lite/micro/tools/make/MakefileTARGET=espgenerate_hello_world_esp_project。
4.部署到乐鑫大中华区代理ESP32上。
从hello_worldProjects目录下,编译,hello_world向ESP32可执行程序编译:
cdtensorflow/lite/micro/tools/make/gen/esp_xtensa-esp32/prj/hello_world/esp-idf。
idf.py--port/dev/ttyUSB0flashmonitor。
使用 PlatformIO 平台
1.安装TensorFlowLite环境(PlatformIO)
需要安装PlatformIO,并打开终端输入:
pipinstall-Uplatformio。
2.建立新的PlatformIO项目。
下一步您可以开始构建软件框架,具体步骤:
1.创建包含src、lib、include文件夹的工程目录。
2.创建一个新的platformio.ini文件:
[env:esp32doit-devkit-v1]
platform=espressif32。
board=esp32doit-devkit-v1。
framework=arduino。
board_build.partitions=custom.csv。
lib_deps=tfmicro。
3.创建新的custom.csv文件:
#Name,类型,订阅类型,Offset,Size,Flags。
nvs,data,nvs,0x9000,20K,
otadata、data、ota、0xe000、8K
firm,app,ota_0,,3400K,
eeprom、data、0x99×4K
spiffs、data、spiffs、444K
3.生成一个hello_world样例项目。
1.在项目目录下,克隆TensorFlow仓库。
2.gitclonehttps://github.com/tensorflow/tensorflow.git。
3.生成ESP32样例项目,获得在Tensorflow目录下的tfmicro库和一个样例模型,运行:
make-ftensorflow/lite/micro/tools/make/MakefileTARGET=espgenerate_hello_world_esp_project。
结果项目示例所在:
tensorflow/tensorflow/lite/micro/tools/make/gen/esp_xtensa-esp32/prj/hello_world/
4.修改PlatformIO项目。
1.将tfmicro文件夹复制到hello_world/esp-idf目录下的lib文件夹。
2.将sin_model_data.cc复制到项目目录下的src文件夹中,复制sine_model_data.h到项目目录下的include文件夹。
3.将flatbuffers目录复制到third_party/flatbuffers目录下的tfmicro文件夹.
4.从third_party/gemmlowp目录将fixedpoint和internal目录复制到tfmicro文件夹.
5.从third_party目录复制kissfft目录到tfmicro文件夹.
6.将flatbuffers文件夹复制到third_party/flatbuffers/include目录。
7.在lib/tfmicro/flatbuffers目录下打开base.h,将如下代码片段。
8.#ifdefined(ARDUINO)&!defined(ARDUINOSTL_M_H)#include#else#endif。
9.#include。
10.接着修改"HelloWorld"sin模型用于测试TensorFlowLite是否可以运行,在GitHub仓库可以看到完整的源代码。
5.部署乐鑫大中华区代理ESP32
向终端输入下面的命令以将可执行程序烧录到ESP32:
platformiorun-tupload-port/dev/ttyUSB0。
通过在终端输入下列命令,就会打开串口交互终端,输入浮点数,程序将给出sin模型预测的值:
说明:screen/dev/ttyUSB0115200。
制定工作流程:
这里是在微处理器中部署TensorFlow模型的过程:
1.创建或获得TensorFlow模型,它必须很小,才能在转换后适应目标设备。仅可使用支持的操作。您可以提供您自己的实现,如果您希望使用目前不支持的操作。
2.将模型转换为TensorFlowLiteFlatBuffer您将使用TensorFlowLite转换器将模型转换成标准TensorFlowLite格式。你也许想要输出一个量化的模型,因为它们更小,执行更有效。
3.将FlatBuffer转换成Cbyte数组模型保存在只读程序存储器中,并且作为一个简单的C文件。可以使用标准的工具把FlatBuffer转换成C阵列。
4.集成TensorFlowLiteforMicrocontrollers的C++库,用C++库来执行推理。
5.部署到你的设备。
建立一个程序,并在你的设备上部署它。
乐鑫大中华区代理ESP32故障注入漏洞-影响分析,近年来,安全研究者提出了一种针对ESP32的故障注入攻击,其存在着安全隐患,从而导致意外信息泄漏。但ESP32的安全性能仍然满足绝大多数产品的需求,请看下文。
实际上,由于故障注入攻击不能脱离物理接入途径,所以乐鑫大中华区代理ESP32的安全性设计对绝大多数产品来说是有效的。至于受到影响的产品,乐鑫已提供一条迁移到新版SoC(ESP32ECOV3)的途径。然而,在决定迁移到一个新的版本之前,我们建议用户先理解故障注入攻击的影响,并且评估他们的产品是否确实受到了影响。以下细节将对此提供帮助。
理解故障注入攻击。
失效注入攻击是一种以物理方式注入故障,破坏电子系统性能的技术。具体地说,攻击者可能会在芯片的外部控制部件上引入小错误,从而干扰芯片的正常工作。如果错误是专门针对安全子系统的,那么攻击者就有可能获得内部使用的加密密钥,或绕过必要的安全检查,然后利用所得到的密钥,进一步读取和修改加密信息,如Flash设备中存储的固件和数据。可以通过多种物理方法来实现故障注入,如严格定时的电压或时钟波动,外部温度变化,激光照射或采用强磁场。
在我们看来,暴露在这种攻击风险下的芯片,不仅仅是乐鑫大中华区代理ESP32SoC,还包括其它商业芯片。
LimitedResults披露了对ESP32进行了以下几个具体的攻击:
1.泄漏安全引导密钥,从而绕过安全引导检查并运行不可信固件;
2.将flash加密密钥公开给应用程序固件和flash内容。
一定要注意下列与攻击有关的事项:
1.攻击者必须对乐鑫大中华区代理ESP32SoC具有物理访问权限,以便从电路板或模块中删除某些组件,从而完成攻击。攻击者在进入到故障注入设备之前,还必须先切断或修改线路板的走线。
2.攻击者必须向SoC的特定电源插头注入一个电压故障注入装置,然后重复尝试,以便获得特定的时序电压波动来实施攻击。
学习ESP32安全启动和Flash加密,要理解以上攻击的影响,我们将对ESP32的安全性启动和Flash加密功能进行简要概述。
安全性引导(安全引导)
打开安全引导功能后,该芯片首次启动时,它的软件加载器将在eFuse中生成并编程出一个“每个设备惟一的”安全启动密钥。下一步,芯片将使用AES-256密钥向软件加载器提供信息汇总,并将这些汇总到闪存中。之后,bootROM将使用这个AES-256键,将存储在flash中的信息汇总与真实的软件加载器文件进行比较,以完成验证。
软体加载器将ECDSA算法用于验证固件的正确性(ECDSA算法)。软体加载器只包含公共密匙,私钥仍然由开发者保管。所以,即使攻击者用故障注入攻击破解了该芯片的软件加载器,也只能得到ECDSA公钥,不能用这个公钥来签发固件或取得私钥。结果,设备不能运行任何非法固件。
Flash加密(闪光加密)
打开Flash加密功能之后,该芯片一次启动,它的软件加载器就会生成一个flash加密密钥,“每台设备都是唯一的”flash密钥,然后用这个密钥加密指定区域的闪存数据。
ESP32受到攻击的影响
理解了安全引导和Flash加密特性后,就不难分析丢失flash加密密钥或者绕过安全引导检查所带来的影响。
正如上面所述,因为每个乐鑫大中华区代理ESP32芯片都拥有自己唯一的flash加密密钥,所以即使攻击者通过故障注入攻击获得了特定ESP32上的flash加密密钥,那么影响范围也只限于攻击者手中的这唯一ESP32芯片。这就是说,这个攻击者只能从这个ESP32芯片获得flash信息和加密数据,其它芯片都不受影响。
和flash加密密钥一样,每个ESP32芯片的安全启动密钥也是惟一的。所以,绕过安全性引导检查也仅用于此ESP32芯片。攻击者不能使用特定芯片的安全启动密钥来远程控制其它ESP32芯片执行不可信应用。
说到底,因为每个芯片都有一个独特的闪光加密密钥和一个安全的启动加密密钥,所以这种攻击的影响范围只局限于攻击者手中的芯片,而不适用于同一款型号的其他芯片。
对于你的产品有什么影响?
为判断你的产品是否会受到这类攻击的影响,你应该考虑在下一个条件中确定你的产品是否有效:
1.您的产品被部署在户外或公共场所,可能会被物理损坏,并且可能连接到故障注入设备。
2.同一系列或同一型号产品共享的一些机密被储存在您的产品中,并且这些机密被存储在一个连接到ESP32的闪存中。
如前所述,我们建议你在你的产品设计中使用新版本的SoC,即乐鑫大中华区代理ESP32ECOV3。
假如你的产品不符合上面所提到的任何一种,使用当前的ESP32SoC芯片的攻击几乎没有影响。
ESP32ECOV3如何解决这个威胁,ESP32ECOV3有以下增强,可以保护产品免遭物理故障注入攻击:
1.ESP32ECOV3支持一个基于PKI(RSA)的安全引导方案,它的eFuse只包含通过哈希算法加密的公钥,而私钥总是由您保存。这就保证了攻击者不能创建一个有签名的引导加载器,也就是说,攻击者所写的非法加载器不会长期存在或者在闪存中运行。
2.乐鑫大中华区代理ESP32ECOV3经过加强,能够抵御硬件和软件中的故障注入攻击,从而防止由于电压故障而导致的密钥泄漏。