
Environnement d'exécution de confiance (TEE) en Go
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) basé sur TamaGo, apportant la sécurité mémoire, la commodité et les capacités de Go à l'exécution bare metal dans le monde sécurisé ARM TrustZone ou les 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 ou en 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 d'un Trusted OS (gestionnaires Syscall, JSON-RPC et d'exceptions)
La documentation principale, qui comprend un tutoriel, est disponible sur le wiki du projet.
La documentation de l'API du paquet 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 celui non privilégié représente un Trusted Applet.
L'exemple GoTEE démontre le fonctionnement concurrent d'unikernels Go agissant comme 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 le Trusted Applet, qui peut être n'importe quelle application bare metal capable de fonctionner en mode utilisateur et d'implémenter l'API GoTEE, comme des programmes C ou Rust autonomes.
Un exemple 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 rend la main avec un appel moniteur.
Le 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 met fin au Trusted Applet.
L'interface syscall GoTEE est implémentée pour la communication entre le Trusted OS et le Trusted Applet.
Lorsqu'elle est lancée sur l'USB armory Mk II, l'application d'exemple est accessible via SSH par 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 génère deux instances de 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 générer l'image de base USB armory Debian en tant qu'OS principal non sécurisé.
[!NOTE] Seules les versions de l'image de base USB armory Debian >= 20211129 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 du manque 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
Compilez le compilateur TamaGo (ou utilisez 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 l'exemple de trusted applet et de kernel 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 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 pertinents dans le tableau ci-dessus) ainsi que l'exécution émulée (par exemple make qemu).
Compilez les exécutables de l'exemple de trusted applet et de kernel 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 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 | Board | SoC package | Board package |
|---|
| 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 |