
在本案例研究中,我将演示 Arm Trust-Zone 技术在构建“Trust IoT”设备中的应用。主要目标是保护关键数据,包括通信通道的加密密钥和 IoT 固件认证程序,以防止潜在的信息泄露和固件攻击。
项目设计:该项目的主要目标是利用 Raspberry Pi 作为基础平台,构建一个安全的“Trust IoT 设备”,采用 ARM Trust-Zone 技术来保护关键数据,例如通信通道的加密密钥和 IoT 固件认证程序,以防止潜在的信息泄露和固件攻击。为了实现这一目标,我们将开发一个“Trust Client”程序,并利用 OPTEE (Open Portable Trusted Execution Environment) 库在 Raspberry Pi 3B+ 上建立一个可信执行环境 (TEE)。Trust 功能将在此 TEE 中运行,以确保安全性。固件认证代码将集成到 Trust-Zone 中运行的 trust 功能中,以验证 IoT 设备(Raspberry Pi Model 3)上可执行固件的完整性。
该系统由两个主要组件组成:
- Trust IoT 固件认证服务器:此服务器程序在 IoT 控制中心(云端)运行。它负责将加密的 PATT(基于物理的认证)请求和参数传输到相应的 Trust-Client。随后,它验证来自 Trust Client 的响应,以确定 IoT 设备是否已被入侵。
- Trust IoT 固件认证客户端:Trust-Client 程序部署在 IoT 设备(Raspberry Pi 3B+)上,并在 Normal World 和 TrustZone Secure World 中运行。Normal World 中的通信模块将来自 Trust 固件认证服务器的加密消息转发到安全世界功能。随后,它根据服务器的请求对目标固件/应用程序执行 PATT 检查。完成后,Trust Client 将加密的结果发送回服务器进行验证。
version: v_0.1.2
Copyright: Copyright (c) 2021 LiuYuancheng
License: MIT License
简介
随着逆向工程技术的进步,黑客可以很容易地通过剖析应用程序类型的固件文件,从基于 Linux 的 IoT 设备中提取部分源代码。例如,考虑这样一种情况:我们利用 pyInstaller 将我们的 CV 分析程序编译成 Raspbian OS 上的可执行文件,并将其部署在 Raspberry Pi 上以创建一个运动检测摄像头。如果黑客获得了这样的摄像头,他们可以使用 pyinstxtractor 等工具来解包固件,然后使用 uncompyle6 来反编译它,从而获得部分源代码的访问权限。随后,掌握了这些知识后,他们可以制作恶意固件程序来发起攻击。即使我们在 IoT 设备中加入固件认证程序,黑客也可以尝试反编译它,以识别漏洞并绕过安全措施。
为了减轻这些风险,我们建议将关键功能(例如固件认证逻辑)迁移到 Raspberry Pi 的 ARM Trust-Zone。通过这样做,我们可以使认证程序免受黑客的反编译尝试。此外,我们将安全地将 Arm 芯片的唯一 Device identification UDID 和我们的认证消息 RSA 加密密钥存储在 Trust-Zone 中。在 Trust-Zone 中运行的 ARM 芯片验证程序将检索 ARM 的 Device identification UDID 并将其与存储的记录进行比较。如果它们不匹配,则认证过程将失败。因此,即使黑客将所有组件克隆到另一台 Raspberry Pi 上,他们仍然无法实施重放攻击。
此外,认证结果将在 trust 环境中使用存储在 Trust-Zone 中的加密密钥进行加密。这确保了即使黑客拦截了 IoT 中心服务器和设备之间的通信,他们也无法解密消息并发起中间人 (MITM) 攻击。
一般的 trust 客户端工作流程如下所示:

Raspberry Pi 上的 Trust Client 程序由三个关键部分组成:
-
Normal World 程序:此部分在应用程序级别的 Normal World 中运行,处理大多数程序功能,促进信息传输到 IoT 控制中心,并将数据传递到 Secure World 中的 trust 功能。
-
Trust 存储常量:所有关键信息和参数,例如固件认证结果、Device identification UDID 和 RSA 加密密钥,都将作为常量或签名存储在 Secure World 中,供 trust 功能使用。
-
Trust 执行功能:此组件在 Secure World 中运行,包含必要的安全功能代码,例如消息 RSA 加密、Arm 芯片 UDID 验证代码和认证算法功能,以降低逆向工程攻击的风险。
背景知识
ARM Trust Zone
Trust-Zone 是 ARM Holdings 开发的一项技术,可在基于 ARM 的处理器上提供基于硬件的安全功能。它创建了两个独立的执行环境:“Normal World”和“Secure World”。这些环境在同一处理器上同时运行,但具有不同的访问级别和权限。每个世界都独立运行,拥有自己的一组资源、权限和执行环境。以下是 ARM Trust-Zone 工作原理的基本概述:
-
Normal World:这是常规操作系统(例如 Android、Linux 或其他 RTOS)与用户应用程序一起运行的地方。它以非安全状态运行,并且可以访问常规资源和内存。
-
Secure World:这是一个独立的隔离环境,运行受信任的操作系统,通常称为“安全监视器”或“安全内核”。Secure World 具有更高的权限,可以访问安全资源,例如加密功能、安全存储和安全启动机制。它确保关键系统功能和敏感数据受到保护,免受未经授权的访问或篡改。
Trust-Zone 技术支持安全启动、安全存储、安全通信通道以及需要高安全级别的应用程序的安全执行环境,例如移动支付系统、数字版权管理 (DRM) 和企业安全解决方案。它为构建可信执行环境 (TEE) 奠定了基础,在这些环境中,可以高度保证地执行敏感操作,以防止攻击。
Trust Execution Environment 和 OP-TEE
Trusted Execution Environment (TEE):Trusted Execution Environment (TEE) 是 Trust-Zone 环境中的一个安全区域,受信任的应用程序可以在其中以更高的安全性和机密性级别运行。Trust-Zone 将 ARM 处理器划分为两个独立的世界:Normal World 和 Secure World。TEE 是一个安全执行环境,用于在 Secure World 中运行关键安全功能和受信任的应用程序。它是一个受信任的运行环境,为敏感操作和应用程序提供隔离和保护。TEE 提供了一个安全的运行时环境,受信任的应用程序(例如安全支付解决方案、数字版权管理 (DRM) 系统和安全身份验证机制)可以在其中以机密性、完整性和可靠性运行。
本质上,Trust-Zone 提供了创建安全执行环境所需的硬件支持,而 TEE 利用此环境来运行受信任的应用程序并执行关键安全功能。TEE 利用 Trust-Zone 提供的安全功能,例如硬件隔离、安全启动、安全存储和安全通信通道,以确保敏感数据和操作的机密性和完整性。
OP-TEE 是一个可信执行环境 (TEE),旨在作为在 Arm 上运行的非安全 Linux 内核的配套;使用 Trust-Zone 技术的 Cortex-A 内核。OP-TEE 实现了 TEE Internal Core API v1.1.x,它是暴露给可信应用程序的 API,以及 TEE Client API v1.0,它是描述如何与 TEE 通信的 API。这些 API 在 Global Platform API 规范中定义。
参考:https://www.trustedfirmware.org/projects/op-tee/
Trust-Zone 如何确保安全
由于强大的安全机制,黑客访问存储在 Trust-Zone 存储中的数据极具挑战性。Trust-Zone 在 Normal World 和 Secure World 之间提供硬件强制隔离,确保存储在 Secure World 中的数据受到保护,免受未经授权的访问。
以下是一些黑客难以访问保存在 Trust-Zone 存储中的数据的原因:
-
硬件隔离:Trust-Zone 利用硬件强制隔离机制来分离 Normal World 和 Secure World。这可以防止在 Normal World 中运行的代码直接访问或篡改存储在 Secure World 中的数据。
-
安全启动:Trust-Zone 支持安全启动机制,确保只有经过身份验证和受信任的代码才能在 Secure World 中加载和执行。这可以防止未经授权的代码访问存储在 Trust-Zone 存储中的数据。
-
安全存储:存储在 Trust-Zone 存储中的数据经过加密并受到加密算法的保护。即使黑客设法获得对物理内存的访问权限,他们仍然需要解密数据,这通常在没有适当的加密密钥的情况下具有挑战性。
-
安全监视器:安全监视器是一个受信任的固件,负责管理 Normal World 和 Secure World 之间的转换,有助于确保存储在 Trust-Zone 存储中的数据的完整性和安全性。
虽然理论上,复杂的攻击者可能会利用 Trust-Zone 或安全监视器固件中的漏洞,但这样做需要大量的专业知识、资源以及对专用设备的访问权限。此外,制造商不断努力提高 Trust-Zone 的安全性,并通过软件更新和补丁解决任何已发现的漏洞。总的来说,Trust-Zone 为存储在 Secure World 中的数据提供了高水平的安全性,使得黑客极难访问。
项目设计
trust IoT 固件认证程序遵循下面概述的工作流程图,我们将把它分解为三个不同的步骤,以说明一轮固件认证:

-
设备验证和服务器连接:在此初始步骤中,程序验证设备并建立与服务器的连接。它涉及验证服务器的完整性并确保设备和服务器之间的相互信任。
-
验证结果上传和固件认证参数获取:在设备验证之后,程序将验证结果上传到服务器并检索固件认证参数。此步骤对于获取必要的数据和指令以继续进行固件认证过程至关重要。
-
运行 PATT 固件认证并上传结果:最后,程序使用获取的参数执行固件认证算法。然后,它将认证结果上传到服务器进行验证。此步骤确保固件的完整性并增强设备的整体安全性。
设备验证和服务器连接
在 Trust Client 程序初始化期间,trust IoT 固件认证模块加载 IoT 配置文件,并将 IoT 信息注册到 Trust Server。这允许服务器相应地准备认证密钥和参数。随后,程序读取 Raspberry Pi 的 ARM 芯片的 Device identification UDID 并启动 OPTEE 会话以将 UDID 传输到 trust 环境。如果 UDID 与 Trust Zone Storage 中预先保存的数据匹配,则设备验证成功,从而解锁下一步的 PATT 固件认证功能。相反,如果没有匹配,表明存在潜在的克隆尝试(黑客将内容从合法的 IoT 复制到新的 Raspberry Pi 上),则 trust 功能会将 IoT 视为未经授权。因此,它会拒绝来自 Normal World 的任何进一步的 OPTEE 连接请求。设备验证的工作流程如下所示:

如果在 IoT 注册后,服务器未在指定的超时时间内收到加密的设备验证消息,则它会将 IoT 设备标记为高风险或已入侵。
验证结果上传和固件认证参数获取
Trust Client 将采取 3 个步骤将芯片验证结果上传到服务器并获取固件认证参数以运行 PATT 算法。该过程将遵循以下工作流程:

步骤 1:ARM 芯片 UDID 验证完成后,Trust-Zone 功能会生成一个 256 位随机数,并构造一个包含各种元素的验证字符串:message index、message element sequence type、verification result checksum、firmware information 和 random number#1 本身。随后,Trust 功能使用存储在 trust 存储中的 2048 位 RSA 密钥加密此字符串。然后,通过使用在 Raspberry Pi 的 Normal World 中运行的通信模块将生成的加密数据传输到服务器端。
步骤 2:收到加密数据后,服务器会解密消息以提取 IoT 固件信息。然后,它从 IoT trust 功能中提取 random number #1,附加另一个 256 位随机数 (random number #2),并包含所有 PATT 执行参数(例如随机内存地址起始种子)以生成固件认证请求字符串。此请求字符串也使用 RSA2048 加密,然后再发送到 Trust Client。
步骤 3:收到来自 Trust Client 的通信模块的加密固件认证后,Trust 环境会解密消息。然后,Trust 功能会验证消息是否包含它生成的随机数 (random number #1),从而验证服务器的身份并阻止黑客尝试利用过时的服务器进行潜在的重放攻击。
运行 PATT 固件认证并上传结果
一旦服务器端被验证为正确且值得信赖,Trust 功能将继续使用提供的参数执行 PATT 固件认证算法。然后,它将内存地址发送到 Trust Client,Trust Client 从内存中检索数据并将其转发到 Trust 功能。
PATT 迭代完成后,最终结果与 Random Number #2(由 trust 服务器在固件认证参数获取部分中生成)组合以创建结果字符串。Trust 功能使用 RSA-2048 加密此消息,并且 trust 客户端的通信模块会将其发送到 trust 服务器。
在服务器端,固件在 IoT 仿真环境中使用相同的 PATT 参数执行,以获得 PATT 值。收到并解密来自 Trust Client 的结果消息后,服务器会验证 Random Number #2 是否与上一节中生成的数字匹配。然后,它将获得的 PATT 值与本地计算的值进行比较。如果两个值都匹配,则 IoT 设备被识别为“Trust 设备”;否则,它将被标记为未经授权且具有高安全风险。
工作流程如下所示:

备注:标记为 Random Number #1 和 Random Number #2 的随机数用作一次性密码 (OTP),以建立 IoT 设备和服务器之间的相互信任。这些 OTP 用于验证双方:确保 IoT 设备可以信任服务器,反之亦然,服务器可以信任 IoT 设备。项目中使用的随机数生成库是:线性同余随机数生成器
程序设置
硬件需求
Raspberry PI 3B+ 和 IoT 传感器:

详细配置步骤
按照以下步骤构建可信 IoT 设备:
步骤 1:准备安装了 Raspbian 系统的 Raspberry PI (mode 3)
Dev Env: Windows 10/7
-
将 16GB SD 卡插入 Windows 机器,并使用“SD Memory card formatter”格式化 SD 卡。从以下位置下载 SD memory card formatter:https://www.sdcard.org/downloads/formatter/ 并遵循所有默认设置。
-
从以下位置下载 Raspberry PI Raspbian OS(32-bit):https://www.raspberrypi.org/downloads/raspbian/ 。
-
从以下位置下载 FlashFlawless:https://www.balena.io/etcher/ 并将 Raspbian 镜像刷入 SD 卡,将 SD 卡放入 Raspberry PI 中,以再次确认其工作正常。
步骤 2:构建启用 Trust Environment 的 Raspbian
Dev Env: Ubuntu 20.04
2.1 安装启动 OPTEE 需要安装的软件包:
$ sudo apt-get install android-tools-adb android-tools-fastboot autoconf \
automake bc bison build-essential cscope curl device-tree-compiler \
expect flex ftp-upload gdisk iasl libattr1-dev libc6:i386 libcap-dev \
libfdt-dev libftdi-dev libglib2.0-dev libhidapi-dev libncurses5-dev \
libpixman-1-dev libssl-dev libstdc++6:i386 libtool libz1:i386 make \
mtools netcat python-crypto python-serial python-wand unzip uuid-dev \
xdg-utils xterm xz-utils zlib1g-dev
2.2 下载并安装交叉编译工具链:
-
Lib
AARCH64&AARCH32都是必需的,并且AARCH32版本必须 > 6.0,来自linaro官方网站: https://releases.linaro.org/components/toolchain/binaries/ -
安装以下交叉编译工具链:
arm-linux-gnueabihf和aarch64-linux-gnu并在cmake配置config.mk文件中设置路径:

2.3 下载带有 OPTEE 支持的 Raspbian 项目,并按照链接中的步骤操作:https://github.com/benhaz1024/raspbian-tee 并设置配置文件 (Config.mk) 如下:
export CROSS_COMPILE := /path/to/your/linaro/aarch32/bin/arm-linux-gnueabihf-
export CROSS_COMPILE_AARCH64 := /path/to/your/linaro/aarch64/bin/aarch64-linux-gnu-
2.4 安装构建工具包:
$ sudo apt-install u-boot-tools
2.5 构建并检查结果:
$ ./prepare-env.sh # if your had download all packages, skip this.
$ make patch # this will patch linux kernel & ATF, if you have done before, skip this.
$ make
步骤 3:创建一个新的 OPTEE Trust Application 并进行测试
3.1 将配置 OPTEE 文件复制到 Raspberry PI Raspbian OS 启动文件夹
$ cp ./out/boot/* /media/user/boot
$ sudo cp -r ./out/rootfs/* /media/user/rootfs
3.2 从以下位置下载 OPTEE 简单信任应用程序示例:https://github.com/linaro-swg/hello_world 并将文件夹放入 raspbian-optee 文件夹 dev/teepriv #。使用所有 32 位设置定义工具链和环境变量并执行 make:
$ export TEEC_EXPORT=$PWD/../optee_client/out/export
$ export HOST_CROSS_COMPILE=$[The arm-linux-gnueabihf position in <2.2>]/aarch32/bin/arm-linux-gnueabihf-
$ export TA_CROSS_COMPILE=$[The arm-linux-gnueabihf position in <2.2>/aarch32/bin/arm-linux-gnueabihf-
$ export TA_DEV_KIT_DIR=$PWD/../optee_os/out/arm/export-ta_arm32
$ make
3.3 将文件复制到系统并进行测试:1. 将普通世界程序 host\hello_world 复制到 \media\user\rootfs\bin 文件夹,并将安全世界文件 ta\7aaaf200-2450-11e4-abe2-0002a5d5c51b.ta 复制到 \media\user\rootfs\lib\optee_armtz\ 文件夹。Raspbian OS 启动文件夹的文件系统结构应如下所示:

3.4 将 SD 卡放入 Raspberry PI 并启动。登录后,测试在信任环境中运行的数字增加功能是否正常:
$ ls /dev/tee*
/dev/tee0 /dev/teepriv0 # this prove tee driver & optee-os works.
$ sudo tee-supplicant &
$ sudo optee_example_hello_world
如果在普通世界中,信任函数将数据发送回如下所示,这意味着信任环境工作正常,OPTEE 已成功设置:

现在我们可以在 Raspberry PI 上设置我们的固件证明信任客户端。
程序执行
构建 Trust Client
步骤 1:设置设备验证常量
我们可以修改 OPTEE 信任示例,从https://github.com/linaro-swg/hello_world 构建我们的信任客户端。在我们编译我们的信任函数之前,我们需要获取 Raspberry PI 的 Arm 芯片的 UDIP,运行以下简单的 python 程序来获取 UDID 值:
import subprocess
import uuid
def get_raspberry_pi_uuid():
# Execute command to get CPU serial number
serial = subprocess.check_output(["cat", "/proc/cpuinfo"]).decode().split("\n")[1].split(":")[1].strip()
# Generate UUID based on serial number
mac = ':'.join(['{:02x}'.format((uuid.getnode() >> elements) & 0xff) for elements in range(0,2*6,2)][::-1])
mac = mac.replace("ff", "00")
return mac + "-" + serial
if __name__ == "__main__":
raspberry_pi_uuid = get_raspberry_pi_uuid()
print("Raspberry Pi UDID:", raspberry_pi_uuid)
确保您具有访问 /proc/cpuinfo 的必要权限才能运行此脚本。此外,请注意,CPU 序列号可能因 Raspberry Pi 型号和硬件修订版而异。
然后,我们将 Arm Chip UDID 硬编码为信任客户端的源代码文件 main.c 中的常量。更改主机 main.c 和 ta\hello_world_ta.c 程序后,我们需要在文件中设置信任函数的 UUID,以使 ta 不与现有的 ta 冲突,在 ta\Android.mk 和 ta\Makefile 中设置一个 UUID
LOCAL_PATH := $(call my-dir)
local_module_UUID := 7aaaf200-2450-11e4-abe2-0002a5d5c51b.ta
include $(BUILD_OPTEE_MK)
要生成 UUID,您可以使用此在线工具:https://www.uuidgenerator.net/
步骤 2:构建项目并将 Trust Client 复制到 Raspberry PI SD 卡中
使用所有 32 位设置定义工具链和环境变量,并编译信任应用程序:
export TEEC_EXPORT=$PWD/../optee_client/out/export
export HOST_CROSS_COMPILE=$[The arm-linux-gnueabihf position in <2.2> ]/aarch32/bin/arm-linux-gnueabihf-
export TA_CROSS_COMPILE=$[The arm-linux-gnueabihf position in <2.2> /aarch32/bin/arm-linux-gnueabihf-
export TA_DEV_KIT_DIR=$PWD/../optee_os/out/arm/export-ta_arm32
make
将普通世界执行文件从 host\hello_world 复制到 Raspbian OS bin 文件夹,即 \media\user\rootfs\bin 文件夹
将信任函数二进制文件 ta\ 7aaaf200-2450-11e4-abe2-0002a5d5c51b.ta 复制到 \media\user\rootfs\lib\optee_armtz
启动 Raspberry PI 并检查结果:

步骤 3:运行 Trust Client Normal World Module
设置配置文件并运行普通世界信任客户端 python 包装器:
python3 IOT_Att.py
运行 Trust Server
在服务器端,运行证明信任服务器程序
python3 firmwTAServer.py
参考
项目主要技术特点及参考
如前一节所述,该项目包含以下概述的几个关键技术特性:
主要技术特点
-
在 Raspberry Pi Model 3 上实现开放式便携可信执行环境 (OPTEE),在 Raspbian 环境中建立 Trust Zone 功能。
-
建立安全客户端-服务器通信,利用 TCP 与 Trust_Application 促进的 RSA-2048 加密/解密。
-
在客户端的 Trust Zone 和服务器组件中独立计算 IoT 文件的 PATT(平台证明令牌)值,然后进行结果比较。
-
检索 Raspbian 下运行程序的执行信息,包括相关文件描述符和内存偏移量。
我们遵循/使用/学习完成项目的相关参考文档或项目:
-
Raspberry PI Mode 3 上的 OPTEE Trust-Zone:OP-TEE > 链接:https://github.com/OP-TEE/optee_os
-
带有 OP-TEE 支持的 Raspbian OS 配置:benhaz1024 > 链接:https://github.com/benhaz1024/raspbian-tee
-
构建信任应用程序的示例:linaro-swg > 链接:https://github.com/linaro-swg/hello_world
-
基于物理的控制系统证明论文链接:https://www.usenix.org/system/files/raid2019-ghaeini.pdf
感谢您的阅读,如果您有任何问题和建议,请随时给我留言。如果您能提供一些意见并分享任何改进建议,我们将不胜感激,以便我们能够改进我们的工作~
Last edit by LiuYuancheng([email protected]) at 30/10/2025, if you have any problem please free to message me.
No comment for this article.