
GoTEE - Beispielanwendung
Das GoTEE-Framework implementiert die gleichzeitige Instanziierung von TamaGo-basierten Unikernels 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 Leistungsfähigkeit in die Bare-Metal-Ausführung innerhalb der ARM TrustZone Secure World oder von RISC-V Supervisor Execution Environments.
GoTEE kann reine Go-, Rust- oder C-basierte freistehende Trusted Applets ü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-Benutzermodus, die TrustZone Normal World oder den RISC-V-Supervisor-Modus
API zur Implementierung eines Trusted OS (Syscall-, JSON-RPC- und Exception-Handler)
Die Hauptdokumentation, die auch 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 das privilegierte Unikernel üblicherweise als Trusted OS bezeichnet, während das unprivilegierte ein Trusted Applet darstellt.
Das GoTEE-Beispiel demonstriert den gleichzeitigen Betrieb von Go-Unikernels, die als Trusted OS, Trusted Applet und Main OS fungieren.
[!WARNING] Das Main OS kann ein beliebiges „reichhaltiges" Betriebssystem sein (z. B. Linux); TamaGo wird lediglich für ein in sich geschlossenes Beispiel verwendet. Dasselbe gilt für das Trusted Applet, das eine beliebige Bare-Metal-Anwendung sein kann, die im Benutzermodus ausgeführt werden und die GoTEE-API implementieren kann, wie z. B. freistehende C- oder Rust-Programme.
Beim Erstellen kann ein Rust-Beispiel verwendet werden, indem
trusted_applet_godurchtrusted_applet_rustersetzt wird.
Die Beispielkombination aus Trusted OS und Applet führt grundlegende Tests der gleichzeitigen Ausführung von drei TamaGo- Unikernels auf unterschiedlichen Privilegstufen durch:
Das Main OS gibt mit einem Monitor-Aufruf die Kontrolle zurück.
Das Trusted Applet schläft 5 Sekunden, bevor es versucht, auf den Speicher des Trusted OS zuzugreifen, was eine vom Supervisor behandelte Exception auslöst, die das Trusted Applet beendet.
Die GoTEE-Syscall- Schnittstelle ist für die Kommunikation zwischen dem Trusted OS und dem Trusted Applet implementiert.
Wenn die Beispielanwendung auf der USB armory Mk II gestartet wird, ist sie über SSH mittels Ethernet over USB (ECM-Protokoll, unterstützt auf Linux- und macOS-Hosts) 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 startet, um das Verhalten vor und nach dem Inkrafttreten der
TrustZone-Einschränkungen unter Verwendung realer Hardware-Peripherie zu
demonstrieren.
Zusätzlich kann der Befehl linux verwendet werden, um das
USB armory Debian-Basisimage
als nicht-sicheres Main OS zu starten.
[!NOTE] Für den nicht-sicheren Betrieb werden nur USB armory Debian-Basisimage-Versionen >= 20211129 unterstützt.

Das Beispiel kann auch unter QEMU-Emulation ausgeführt werden.
[!NOTE] Emulierte Ausführungen führen aufgrund der fehlenden vollständigen TrustZone-/PMP-Unterstützung durch 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
Der TamaGo-Compiler wird vom
Makefile automatisch heruntergeladen und als go tool kompiliert.
Alternativ kann die Umgebungsvariable TAMAGO überschrieben werden, um die
neueste Binärversion zu verwenden:
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-Applets 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 endgültigen 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ührung und Debugging |
|---|---|---|
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-Applets 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 endgültigen ausführbaren Dateien werden im Unterverzeichnis bin erstellt.
Verfügbare Ziele:
TARGET | Board | Ausführung und Debugging |
|---|---|---|
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) Die GoTEE-Autoren. Alle Rechte vorbehalten.
Diese Quelldateien werden unter der BSD-Lizenz vertrieben, 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 |