
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.
| 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 |
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.