
在本案例研究中,我將演示 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-Zone 中的加密金鑰在信任環境中進行加密。這確保了即使駭客攔截了 IoT 中心伺服器和設備之間的通信,他們也將無法解密訊息並發起中間人 (MITM) 攻擊。
一般的 trust client 工作流程如下所示:

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 是一個 Trusted Execution Environment (TEE),旨在作為在 Arm 上運行的非安全 Linux 核心的配套;使用 Trust-Zone 技術的 Cortex-A 核心。OP-TEE 實現了 TEE Internal Core API v1.1.x,它是暴露給 Trusted Applications 的 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 配置文件,並向 Trust Server 註冊 IoT 資訊。這允許伺服器相應地準備認證金鑰和參數。隨後,程式讀取 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 函式。
完成 PATT 迭代後,最終結果與 Random Number #2(由 trust 伺服器在韌體認證參數獲取部分中產生)組合以創建結果字串。Trust 函式使用 RSA-2048 加密此訊息,並且 trust client 的通信模組會將其發送到 trust 伺服器。
在伺服器端,韌體在 IoT 模擬環境中使用相同的 PATT 參數執行,以獲得 PATT 值。收到並解密來自 Trust Client 的結果訊息後,伺服器會驗證 Random Number #2 是否與上一節中產生的隨機數匹配。然後,它將獲得的 PATT 值與本地計算的值進行比較。如果兩個值都匹配,則 IoT 設備被識別為「Trust 設備」;否則,它將被標記為未經授權且具有高安全風險。
工作流程如下所示:

備註:標記為 Random Number #1 和 Random Number #2 的隨機數用作一次性密碼 (OTP),以建立 IoT 設備和伺服器之間的相互信任。這些 OTP 用於驗證雙方:確保 IoT 設備可以信任伺服器,反之亦然,伺服器可以信任 IoT 設備。專案中使用的隨機數產生 lib 是:線性同餘隨機數產生器
程式設定
硬體需求
Raspberry PI 3B+ 和 IoT 感測器:

詳細配置步驟
按照以下步驟構建可信任的 IoT 裝置:
步驟 1:準備安裝了 Raspbian 系統的 Raspberry PI(型號 3)
Dev Env:Windows 10/7
-
將 16GB SD 卡插入 Windows 電腦,並使用「SD Memory card formatter」格式化 SD 卡。從以下網址下載 SD 記憶卡格式化工具: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:構建啟用信任環境的 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 下載並安裝 Cross Build Toolchain:
-
Lib
AARCH64&AARCH32都是必需的,並且AARCH32版本必須 > 6.0,來自linaro官方網站: https://releases.linaro.org/components/toolchain/binaries/ -
安裝以下 cross build tool chain:
arm-linux-gnueabihf和aarch64-linux-gnu,並在cmake配置config.mk檔案中設定路徑:

2.3 下載具有 OPTEE 支援的 Raspbian 專案,並按照連結中的步驟操作:https://github.com/benhaz1024/raspbian-tee,並設定 config 檔案 (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 上設定我們的韌體證明信任用戶端。
程式執行
建置信任用戶端
步驟 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 晶片 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:建置專案並將信任用戶端複製到 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
將一般世界執行檔複製到 Raspbian OS bin 資料夾,從 host\hello_world 到 \media\user\rootfs\bin 資料夾
將信任功能二進位檔 ta\ 7aaaf200-2450-11e4-abe2-0002a5d5c51b.ta 複製到 \media\user\rootfs\lib\optee_armtz
啟動 Raspberry PI 並檢查結果:

步驟 3:執行信任用戶端一般世界模組
設定 Config 檔案並執行一般世界信任用戶端 python 封裝函式:
python3 IOT_Att.py
執行信任伺服器
在伺服器端,執行證明信任伺服器程式
python3 firmwTAServer.py
參考資料
專案主要技術特性和參考資料
如上一節所述,該專案包含以下概述的幾個主要技術特性:
主要技術特性
-
在 Raspberry Pi Model 3 上實作 Open Portable Trusted Execution Environment (OPTEE),在 Raspbian 環境中建立 Trust Zone 功能。
-
建立安全的用戶端-伺服器通訊,利用 TCP 與 Trust_Application 促進的 RSA-2048 加密/解密。
-
在用戶端的 Trust Zone 和伺服器元件中獨立計算 IoT 檔案的 PATT (Platform Attestation Token) 值,然後比較結果。
-
擷取 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.