
GoTEE - aplicación de ejemplo
El framework GoTEE implementa la instanciación concurrente de unikernels basados en TamaGo en modos privilegiado y no privilegiado, los cuales interactúan entre sí mediante el modo monitor y llamadas al sistema personalizadas.
Con estas capacidades, GoTEE implementa un Entorno de Ejecución Confiable (TEE) basado en TamaGo, aportando la seguridad de memoria, la conveniencia y las capacidades de Go a la ejecución bare metal dentro del Secure World de ARM TrustZone o los entornos de ejecución de supervisor de RISC-V.
GoTEE puede supervisar Trusted Applets independientes (freestanding) basados en Go, Rust o C puros, que implementen la API de GoTEE, así como cualquier sistema operativo capaz de ejecutarse en el Normal World de ARM TrustZone o en el modo S de RISC-V, como Linux.
Contextos de ejecución aislados para el modo usuario de ARM, el Normal World de TrustZone o el modo Supervisor de RISC-V
API para la implementación del Trusted OS (Syscall, JSON-RPC y manejadores de excepciones)
La documentación principal, que incluye un tutorial, se puede encontrar en la wiki del proyecto.
La documentación de la API del paquete se puede encontrar en pkg.go.dev.
La siguiente tabla resume los SoCs y placas actualmente compatibles.
| SoC | Placa | Paquete del SoC | Paquete de la placa |
|---|---|---|---|
| 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 |
En la nomenclatura TEE, el unikernel privilegiado se conoce comúnmente como Trusted OS, mientras que el no privilegiado representa un Trusted Applet.
El ejemplo de GoTEE demuestra la operación concurrente de unikernels Go que actúan como Trusted OS, Trusted Applet y Main OS.
[!WARNING] El Main OS puede ser cualquier SO "completo" (p. ej., Linux); TamaGo se usa simplemente para un ejemplo autocontenido. Lo mismo se aplica al Trusted Applet, que puede ser cualquier aplicación bare metal capaz de ejecutarse en modo usuario e implementar la API de GoTEE, como programas C o Rust independientes (freestanding).
Se puede usar un ejemplo en Rust reemplazando
trusted_applet_goportrusted_applet_rustal compilar.
La combinación de ejemplo trusted OS/applet realiza pruebas básicas de ejecución concurrente de tres unikernels TamaGo en diferentes niveles de privilegio:
El Main OS cede el control mediante una llamada al monitor.
El Trusted Applet se suspende durante 5 segundos antes de intentar leer la memoria del Trusted OS, lo que desencadena una excepción gestionada por el supervisor que termina el Trusted Applet.
La interfaz de syscall de GoTEE está implementada para la comunicación entre el Trusted OS y el Trusted Applet.
Cuando se lanza en la USB armory Mk II, la aplicación de ejemplo es accesible vía SSH mediante Ethernet sobre USB (protocolo ECM, compatible con hosts Linux y 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
>
El ejemplo se puede lanzar con el comando gotee, que genera el Main OS dos veces
para demostrar el comportamiento antes y después de que las restricciones de
TrustZone estén en vigor, utilizando periféricos de hardware reales.
Adicionalmente, el comando linux se puede utilizar para generar la
imagen base Debian de USB armory
como Main OS no seguro.
[!NOTE] Solo se admiten versiones de la imagen base Debian de USB armory >= 20211129 para operación no segura.