
GoTEE - example application
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.
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.
[!NOTE] Execuções emuladas realizam testes parciais devido à falta de suporte completo a TrustZone/PMP por parte do 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
O compilador TamaGo é automaticamente
baixado e compilado como uma go tool pelo Makefile.
Alternativamente, a variável de ambiente TAMAGO pode ser sobrescrita para usar a
versão binária mais recente:
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
Compile os executáveis de exemplo do Trusted Applet e do kernel da seguinte forma:
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] Substitua
trusted_applet_goportrusted_applet_rustpara um exemplo TA em Rust; isso requer Rust nightly e a toolchainarmv7a-none-eabi.
Os executáveis finais são criados no subdiretório bin,
trusted_os_usbarmory.imx deve ser usado para execução nativa.
Os seguintes alvos estão disponíveis:
TARGET | Placa | Execução e depuração |
|---|---|---|
usbarmory | USB armory Mk II | usbarmory |
Os alvos suportam execução nativa (veja os links de documentação relevantes na tabela acima)
bem como execução emulada (ex.: make qemu).
Compile os executáveis de exemplo do Trusted Applet e do kernel da seguinte forma:
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] Substitua
trusted_applet_goportrusted_applet_rustpara um exemplo TA em Rust; isso requer Rust nightly e a toolchainriscv64gc-unknown-none-elf.
Os executáveis finais são criados no subdiretório bin.
Alvos disponíveis:
TARGET | Placa | Execução e depuração |
|---|---|---|
sifive_u | QEMU sifive_u | sifive_u |
O alvo foi testado apenas com execução emulada (ex.: make qemu)
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
GoTEE | https://github.com/usbarmory/GoTEE
Copyright (c) The GoTEE authors. All Rights Reserved.
Estes arquivos de origem são distribuídos sob a licença estilo BSD encontrada no arquivo LICENSE.
| 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 |