
GoTEE - applicazione di esempio
Il framework GoTEE implementa l'istanziazione concorrente di unikernel basati su TamaGo in modalità privilegiata e non privilegiata, che interagiscono tra loro tramite la modalità monitor e chiamate di sistema personalizzate.
Con queste capacità GoTEE implementa Ambienti di Esecuzione Fidati (TEE) basati su TamaGo, portando la sicurezza della memoria, la praticità e le capacità di Go all'esecuzione bare metal all'interno dell'ARM TrustZone Secure World o degli Ambienti di Esecuzione Supervisor RISC-V.
GoTEE può supervisionare Trusted Applet freestanding basati su Go, Rust o C puri, che implementano l'API GoTEE, nonché qualsiasi sistema operativo in grado di eseguire in ARM TrustZone Normal World o in modalità S RISC-V, come Linux.
Contesti di esecuzione isolati per la modalità utente ARM, TrustZone Normal World o la modalità Supervisor RISC-V
API per l'implementazione del Trusted OS (Syscall, JSON-RPC e gestori di eccezioni)
La documentazione principale, che include un tutorial, è disponibile sulla wiki del progetto.
La documentazione API del pacchetto è disponibile su pkg.go.dev.
La tabella seguente riassume i SoC e le board attualmente supportati.
| SoC | Board | Pacchetto SoC | Pacchetto Board |
|---|---|---|---|
| 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 |
Nella nomenclatura TEE, l'unikernel privilegiato è comunemente indicato come Trusted OS, mentre quello non privilegiato rappresenta un Trusted Applet.
L'esempio GoTEE dimostra il funzionamento concorrente di unikernel Go che agiscono come Trusted OS, Trusted Applet e Main OS.
[!WARNING] Il Main OS può essere qualsiasi OS "ricco" (ad es. Linux); TamaGo è utilizzato semplicemente per un esempio autonomo. Lo stesso vale per il Trusted Applet, che può essere qualsiasi applicazione bare metal in grado di eseguire in modalità utente e di implementare l'API GoTEE, come programmi C o Rust freestanding.
Un esempio in Rust può essere utilizzato sostituendo
trusted_applet_gocontrusted_applet_rustin fase di compilazione.
La combinazione trusted OS/applet di esempio esegue test di base sull'esecuzione concorrente di tre unikernel TamaGo a diversi livelli di privilegio:
Il Main OS restituisce il controllo con una chiamata al monitor.
Il Trusted Applet dorme per 5 secondi prima di tentare di leggere la memoria del Trusted OS, il che innesca un'eccezione gestita dal supervisor che termina il Trusted Applet.
L'interfaccia syscall di GoTEE è implementata per la comunicazione tra Trusted OS e Trusted Applet.
Quando viene avviata sulla USB armory Mk II, l'applicazione di esempio è raggiungibile via SSH tramite Ethernet over USB (protocollo ECM, supportato su host Linux e 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'esempio può essere avviato con il comando gotee, che genera due istanze del Main OS per dimostrare il comportamento prima e dopo l'attivazione delle restrizioni TrustZone, utilizzando periferiche hardware reali.
Inoltre, il comando linux può essere utilizzato per avviare l'immagine base Debian per USB armory come Main OS Non-secure.
[!NOTE] Solo le release >= 20211129 dell'immagine base Debian per USB armory sono supportate per il funzionamento Non-secure.
