
Exemple démontrant un environnement d'exécution de confiance basé sur Go sur ARM TrustZone et RISC-V, exécutant des unikernels concurrents en tant qu'OS de confiance, applet de confiance et OS principal.
Le framework GoTEE implémente l'instanciation concurrente d'unikernels basés sur TamaGo en modes privilégié et non privilégié, interagissant entre eux via le mode moniteur et des appels système personnalisés.
Grâce à ces capacités, GoTEE implémente un environnement d'exécution de confiance (TEE - Trusted Execution Environment) basé sur TamaGo, apportant la sécurité mémoire de Go, sa commodité et ses capacités à l'exécution sur métal nu au sein d'ARM TrustZone Secure World ou d'environnements d'exécution superviseur RISC-V.
GoTEE peut superviser des Trusted Applets autonomes en Go, Rust ou C pur, implémentant l'API GoTEE, ainsi que tout système d'exploitation capable de fonctionner dans le monde normal ARM TrustZone (Normal World) ou le mode S RISC-V, comme Linux.
Contextes d'exécution isolés pour le mode utilisateur ARM, le monde normal TrustZone ou le mode superviseur RISC-V
API pour l'implémentation du Trusted OS (Syscall, JSON-RPC et gestionnaires d'exceptions)
La documentation principale, qui inclut un didacticiel, est disponible sur le wiki du projet.
La documentation de l'API du package est disponible sur pkg.go.dev.
Le tableau suivant résume les SoC et cartes actuellement pris en charge.
Dans la nomenclature TEE, l'unikernel privilégié est communément appelé Trusted OS, tandis que l'unikernel non privilégié représente une Trusted Applet.
L'exemple GoTEE démontre le fonctionnement concurrent d'unikernels Go agissant en tant que Trusted OS, Trusted Applet et OS principal.
[!WARNING] L'OS principal peut être n'importe quel OS « riche » (par exemple Linux) ; TamaGo est simplement utilisé pour un exemple autonome. Il en va de même pour la Trusted Applet, qui peut être n'importe quelle application sur métal nu capable de fonctionner en mode utilisateur et d'implémenter l'API GoTEE, comme des programmes C ou Rust autonomes.
Un exemple en Rust peut être utilisé en remplaçant
trusted_applet_gopartrusted_applet_rustlors de la compilation.
La combinaison Trusted OS/Applet de l'exemple effectue des tests de base de l'exécution concurrente de trois unikernels TamaGo à différents niveaux de privilège :
L'OS principal cède la main avec un appel moniteur.
La Trusted Applet dort pendant 5 secondes avant de tenter de lire la mémoire du Trusted OS, ce qui déclenche une exception gérée par le superviseur qui termine la Trusted Applet.
L'interface syscall GoTEE est implémentée pour la communication entre le Trusted OS et la Trusted Applet.
Lorsqu'elle est lancée sur l'USB armory Mk II, l'application d'exemple est accessible via SSH grâce à Ethernet over USB (protocole ECM, pris en charge sur les hôtes Linux et macOS) :
$ 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
>
L'exemple peut être lancé avec la commande gotee, qui lance deux fois l'OS principal pour démontrer le comportement avant et après l'application des restrictions TrustZone, à l'aide de périphériques matériels réels.
De plus, la commande linux peut être utilisée pour lancer l'image de base Debian pour USB armory en tant qu'OS principal non sécurisé.
[!NOTE] Seules les versions >= 20211129 de l'image de base Debian pour USB armory sont prises en charge pour le fonctionnement non sécurisé.

L'exemple peut également être exécuté sous émulation QEMU.
[!NOTE] Les exécutions émulées effectuent des tests partiels en raison de l'absence de prise en charge complète de TrustZone/PMP par QEMU.
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
Le compilateur TamaGo est automatiquement téléchargé et compilé en tant que go tool par le Makefile.
Alternativement, la variable d'environnement TAMAGO peut être redéfinie pour utiliser la dernière version binaire :
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
Compilez les exécutables de la trusted applet d'exemple et du noyau comme suit :
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] Remplacez
trusted_applet_gopartrusted_applet_rustpour un exemple de TA en Rust ; cela nécessite Rust nightly et la chaîne d'outilsarmv7a-none-eabi.
Les exécutables finaux sont créés dans le sous-répertoire bin ; trusted_os_usbarmory.imx doit être utilisé pour l'exécution native.
Les cibles suivantes sont disponibles :
TARGET | Carte | Exécution et débogage |
|---|---|---|
usbarmory | USB armory Mk II | usbarmory |
Les cibles prennent en charge l'exécution native (voir les liens de documentation correspondants dans le tableau ci-dessus) ainsi que l'exécution émulée (par exemple make qemu).
Compilez les exécutables de la trusted applet d'exemple et du noyau comme suit :
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] Remplacez
trusted_applet_gopartrusted_applet_rustpour un exemple de TA en Rust ; cela nécessite Rust nightly et la chaîne d'outilsriscv64gc-unknown-none-elf.
Les exécutables finaux sont créés dans le sous-répertoire bin.
Cibles disponibles :
TARGET | Carte | Exécution et débogage |
|---|---|---|
sifive_u | QEMU sifive_u | sifive_u |
La cible n'a été testée qu'avec l'exécution émulée (par exemple make qemu).
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
GoTEE | https://github.com/usbarmory/GoTEE
Copyright (c) Les auteurs de GoTEE. Tous droits réservés.
Ces fichiers sources sont distribués sous la licence de type BSD disponible dans le fichier LICENSE.
| SoC | Carte | Package SoC | Package carte |
|---|
| 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 |