
GoTEE - exemple d'application
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.
| 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 |
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é.