
GoTEE - aplicação de exemplo
O framework GoTEE implementa a instanciação concorrente de unikernels baseados em TamaGo em modos privilegiado e não privilegiado, interagindo entre si através do modo monitor e chamadas de sistema personalizadas.
Com essas capacidades, o GoTEE implementa um Ambiente de Execução Confiável (TEE) baseado em TamaGo, trazendo segurança de memória, conveniência e capacidades da linguagem Go para execução bare metal no ARM TrustZone Secure World ou nos ambientes de execução supervisor do RISC-V.
O GoTEE pode supervisionar Trusted Applets freestanding baseados em Go, Rust ou C puros, que implementam a API GoTEE, bem como qualquer sistema operacional capaz de executar no ARM TrustZone Normal World ou no RISC-V S-mode, como Linux.
Contextos de execução isolados para ARM User mode, TrustZone Normal World ou RISC-V Supervisor Mode
API para implementação de Trusted OS (Syscall, JSON-RPC e manipuladores de exceção)
A documentação principal, que inclui um tutorial, pode ser encontrada na wiki do projeto.
A documentação da API do pacote pode ser encontrada em pkg.go.dev.
A tabela a seguir resume os SoCs e placas atualmente suportados.
| SoC | Placa | Pacote SoC | Pacote da 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 |
Na nomenclatura de TEE, o unikernel privilegiado é normalmente referido como Trusted OS, enquanto o não privilegiado representa um Trusted Applet.
O exemplo do GoTEE demonstra a operação concorrente de unikernels Go atuando como Trusted OS, Trusted Applet e Main OS.
[!WARNING] O Main OS pode ser qualquer SO "rico" (ex.: Linux); o TamaGo é simplesmente usado para um exemplo autocontido. O mesmo se aplica ao Trusted Applet, que pode ser qualquer aplicação bare metal capaz de executar em modo de usuário e implementar a API GoTEE, como programas freestanding em C ou Rust.
Um exemplo em Rust pode ser usado substituindo
trusted_applet_goportrusted_applet_rustao compilar.
A combinação de exemplo Trusted OS/Applet realiza testes básicos da execução concorrente de três unikernels TamaGo em diferentes níveis de privilégio:
O Main OS cede o controle com uma chamada de monitor.
O Trusted Applet dorme por 5 segundos antes de tentar ler a memória do Trusted OS, o que aciona uma exceção tratada pelo supervisor, que encerra o Trusted Applet.
A interface syscall do GoTEE é implementada para comunicação entre o Trusted OS e o Trusted Applet.
Quando iniciado no USB armory Mk II, a aplicação de exemplo fica acessível via SSH através de Ethernet over USB (protocolo ECM, suportado em hosts 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
>
O exemplo pode ser iniciado com o comando gotee, que instancia o Main OS
duas vezes para demonstrar o comportamento antes e depois de as restrições da TrustZone estarem
em vigor usando periféricos de hardware reais.
Além disso, o comando linux pode ser usado para instanciar a
imagem base USB armory Debian
como Main OS não seguro.
[!NOTE] Apenas versões da imagem base USB armory Debian >= 20211129 são suportadas para operação não segura.

O exemplo também pode ser executado sob emulação QEMU.