
Go Trusted Execution Environment (TEE)
Das GoTEE-Framework ermöglicht die gleichzeitige Instanziierung von auf TamaGo basierenden Unikerneln im privilegierten und unprivilegierten Modus, die über den Monitor-Modus und benutzerdefinierte Systemaufrufe miteinander interagieren.
Mit diesen Fähigkeiten implementiert GoTEE eine TamaGo basierte Trusted Execution Environment (TEE) und bringt Go-Speichersicherheit, Komfort und Fähigkeiten in die Bare-Metal-Ausführung innerhalb der ARM TrustZone Secure World oder der RISC-V-Supervisor-Execution-Environments.
GoTEE kann freistehende Trusted Applets auf Basis von reinem Go, Rust oder C überwachen, die die GoTEE-API implementieren, sowie jedes Betriebssystem, das in der ARM TrustZone Normal World oder im RISC-V-S-Modus ausgeführt werden kann, wie z. B. Linux.
Isolierte Ausführungskontexte für den ARM User Mode, die TrustZone Normal World oder den RISC-V Supervisor Mode
API für die Trusted-OS-Implementierung (Syscall-, JSON-RPC- und Ausnahme-Handler)
Die Hauptdokumentation, die ein Tutorial enthält, finden Sie im Projekt-Wiki.
Die API-Dokumentation des Pakets finden Sie auf pkg.go.dev.
Die folgende Tabelle fasst die derzeit unterstützten SoCs und Boards zusammen.
In der TEE-Nomenklatur wird der privilegierte Unikernel üblicherweise als Trusted OS bezeichnet, während der unprivilegierte ein Trusted Applet darstellt.
Das GoTEE-Beispiel demonstriert den gleichzeitigen Betrieb von Go-Unikerneln, die als Trusted OS, Trusted Applet und Main OS fungieren.
[!WARNING] Das Main OS kann ein beliebiges „Rich“-OS sein (z. B. Linux); TamaGo wird lediglich für ein in sich geschlossenes Beispiel verwendet. Gleiches gilt für das Trusted Applet, das jede Bare-Metal-Anwendung sein kann, die im User Mode ausgeführt werden kann und die GoTEE-API implementiert, wie z. B. freistehende C- oder Rust-Programme.
Ein Rust-Beispiel kann verwendet werden, indem beim Erstellen
trusted_applet_godurchtrusted_applet_rustersetzt wird.
Die Beispiel-Kombination aus Trusted OS und Applet führt grundlegende Tests der gleichzeitigen Ausführung von drei TamaGo Unikerneln auf verschiedenen Privilegstufen durch:
Das Main OS gibt mit einem Monitor-Aufruf die Kontrolle zurück.
Das Trusted Applet schläft 5 Sekunden lang, bevor es versucht, auf den Speicher des Trusted OS zuzugreifen. Dadurch wird eine Ausnahme ausgelöst, die vom Supervisor behandelt wird und das Trusted Applet beendet.
Die GoTEE-Syscall-Schnittstelle ist für die Kommunikation zwischen dem Trusted OS und dem Trusted Applet implementiert.
Wird die Anwendung auf der USB armory Mk II gestartet, ist die Beispielanwendung per SSH über Ethernet over USB (ECM-Protokoll, unter Linux- und macOS-Hosts unterstützt) erreichbar:
$ ssh [email protected]
tamago/arm • TEE security monitor (Secure World system/monitor)
allgptr # memory forensics of applet goroutines
csl # show config security levels (CSL)
csl <periph> <slave> <hex csl> # set config security level (CSL)
dbg # show ARM debug permissions
exit, quit # close session
gotee # TrustZone example w/ TamaGo unikernels
help # this help
linux <uSD|eMMC> # boot NonSecure USB armory Debian base image
lockstep <fault %> # tandem applet example w/ fault injection
peek <hex offset> <size> # memory display (use with caution)
poke <hex offset> <hex value> # memory write (use with caution)
reboot # reset device
sa # show security access (SA)
sa <id> <secure|nonsecure> # set security access (SA)
stack # stack trace of current goroutine
stackall # stack trace of all goroutines
>
Das Beispiel kann mit dem Befehl gotee gestartet werden, der das Main OS
zweimal erzeugt, um das Verhalten vor und nach dem Inkrafttreten der
TrustZone-Beschränkungen mithilfe echter Hardware-Peripherie zu demonstrieren.
Zusätzlich kann der Befehl linux verwendet werden, um das
USB-armory-Debian-Basisabbild
als nicht-sicheres Main OS zu starten.
[!NOTE] Für den Nicht-Secure-Betrieb werden nur USB-armory-Debian-Basisabbild-Versionen >= 20211129 unterstützt.

Das Beispiel kann auch unter QEMU-Emulation ausgeführt werden.
[!NOTE] Emulierte Läufe führen aufgrund der fehlenden vollständigen TrustZone/PMP-Unterstützung von QEMU nur partielle Tests durch.
make qemu
...
> gotee
00:00:00 tamago/arm • TEE security monitor (Secure World system/monitor)
00:00:00 SM loaded applet addr:0x9c000000 entry:0x9c072740 size:4940275
00:00:00 SM loaded kernel addr:0x80000000 entry:0x8007100c size:4577643
00:00:00 SM waiting for applet and kernel
00:00:00 SM starting mode:USR sp:0x9e000000 pc:0x9c072740 ns:false
00:00:00 SM starting mode:SYS sp:0x00000000 pc:0x8007100c ns:true
00:00:00 tamago/arm (go1.19.1) • TEE user applet
00:00:00 tamago/arm (go1.19.1) • system/supervisor (Non-secure)
00:00:00 supervisor is about to yield back
00:00:00 SM stopped mode:SYS sp:0x8146bf54 lr:0x801937a4 pc:0x80193884 ns:true err:exit
00:00:00 applet obtained 16 random bytes from monitor: b4cc4764dd30291a52545b182313003c
00:00:00 applet requests echo via RPC: hello
00:00:00 applet received echo via RPC: hello
00:00:00 applet will sleep for 5 seconds
00:00:01 applet says 1 mississippi
...
00:00:05 applet says 5 mississippi
00:00:05 applet is about to read secure memory at 0x98010000
00:00:05 r0:98010000 r1:9c8240c0 r2:98010000 r3:00000000
00:00:05 r4:00000000 r5:00000000 r6:00000000 r7:9c86bec8
00:00:05 r8:00000007 r9:0000003d r10:9c8020f0 r11:9c342f41 cpsr:600001d7 (ABT)
00:00:05 r12:00000061 sp:9c86bf08 lr:9c1b1be8 pc:9c011330 spsr:600001d0 (USR)
00:00:05 SM stopped mode:USR sp:0x9c86bf08 lr:0x9c1b1be8 pc:0x9c011330 ns:false err:ABT
Erstellen Sie den TamaGo-Compiler (oder verwenden Sie die neueste Binärversion):
wget https://github.com/usbarmory/tamago-go/archive/refs/tags/latest.zip
unzip latest.zip
cd tamago-go-latest/src && ./all.bash
cd ../bin && export TAMAGO=`pwd`/go
Erstellen Sie die ausführbaren Dateien des Beispiel-Trusted-Applet und -Kernels wie folgt:
git clone https://github.com/usbarmory/GoTEE-example
cd GoTEE-example && export TARGET=usbarmory && make nonsecure_os_go && make trusted_applet_go && make trusted_os
[!NOTE] Ersetzen Sie für ein Rust-TA-Beispiel
trusted_applet_godurchtrusted_applet_rust; dies erfordert Rust Nightly und diearmv7a-none-eabi-Toolchain.
Die finalen ausführbaren Dateien werden im Unterverzeichnis bin erstellt;
trusted_os_usbarmory.imx sollte für die native Ausführung verwendet werden.
Die folgenden Ziele sind verfügbar:
TARGET | Board | Ausführen und Debuggen |
|---|---|---|
usbarmory | USB armory Mk II | usbarmory |
Die Ziele unterstützen sowohl die native Ausführung (siehe entsprechende
Dokumentationslinks in der obigen Tabelle) als auch die emulierte Ausführung
(z. B. make qemu).
Erstellen Sie die ausführbaren Dateien des Beispiel-Trusted-Applet und -Kernels wie folgt:
git clone https://github.com/usbarmory/GoTEE-example
cd GoTEE-example && export TARGET=sifive_u && make nonsecure_os_go && make trusted_applet_go && make trusted_os
[!NOTE] Ersetzen Sie für ein Rust-TA-Beispiel
trusted_applet_godurchtrusted_applet_rust; dies erfordert Rust Nightly und dieriscv64gc-unknown-none-elf-Toolchain.
Die finalen ausführbaren Dateien werden im Unterverzeichnis bin erstellt.
Verfügbare Ziele:
TARGET | Board | Ausführen und Debuggen |
|---|---|---|
sifive_u | QEMU sifive_u | sifive_u |
Das Ziel wurde bisher nur mit emulierter Ausführung getestet (z. B. make qemu)
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
GoTEE | https://github.com/usbarmory/GoTEE
Copyright (c) The GoTEE authors. All Rights Reserved.
Diese Quelldateien werden unter der BSD-Lizenz verteilt, die in der LICENSE-Datei zu finden ist.
| SoC | Board | SoC-Paket | Board-Paket |
|---|
| NXP i.MX6ULZ | USB armory Mk II | imx6ul | usbarmory/mk2 |
| NXP i.MX6ULL | MCIMX6ULL-EVK | imx6ul | mx6ullevk |
| SiFive FU540 | QEMU sifive_u | fu540 | qemu/sifive_u |