
GoTEE - example application
Фреймворк GoTEE реализует одновременное создание unikernel'ов на основе TamaGo в привилегированном и непривилегированном режимах, взаимодействующих друг с другом через режим монитора и пользовательские системные вызовы.
Благодаря этим возможностям GoTEE реализует доверенные среды выполнения (TEE) на основе TamaGo, привнося безопасность работы с памятью, удобство и возможности Go в выполнение на «голом железе» в среде ARM TrustZone Secure World или супервизорных средах исполнения RISC-V.
GoTEE может контролировать автономные Trusted Applet'ы, написанные на чистом Go, Rust или C и реализующие API GoTEE, а также любые операционные системы, способные работать в ARM TrustZone Normal World или S-режиме RISC-V, например Linux.
Изолированные контексты выполнения для пользовательского режима ARM, Normal World TrustZone или супервизорного режима RISC-V
Оппортунистический программный lockstep для обнаружения сбоев
API для реализации Trusted OS (обработчики Syscall, JSON-RPC и исключений)
Основная документация, включающая руководство, находится в вики проекта.
API-документация пакета доступна на pkg.go.dev.
В следующей таблице перечислены поддерживаемые SoC и платы.
В терминологии TEE привилегированный unikernel обычно называют Trusted OS, а непривилегированный — Trusted Applet.
Пример GoTEE демонстрирует одновременную работу Go unikernel'ов, выступающих в роли Trusted OS, Trusted Applet и Main OS.
[!WARNING] В роли Main OS может выступать любая «полноценная» ОС (например, Linux); TamaGo используется лишь для автономного примера. То же самое относится к Trusted Applet, которым может быть любое приложение на «голом железе», способное работать в пользовательском режиме и реализующее API GoTEE, например автономные программы на C или Rust.
Пример на Rust можно использовать, заменив
trusted_applet_goнаtrusted_applet_rustпри сборке.
Комбинация примера Trusted OS/applet выполняет базовую проверку одновременного выполнения трёх unikernel'ов TamaGo на разных уровнях привилегий:
Main OS возвращает управление с помощью вызова монитора.
Trusted Applet засыпает на 5 секунд, прежде чем попытаться прочитать память Trusted OS, что вызывает исключение, обрабатываемое супервизором, который завершает работу Trusted Applet.
Интерфейс syscall GoTEE реализован для взаимодействия между Trusted OS и Trusted Applet.
При запуске на USB armory Mk II пример приложения доступен по SSH через Ethernet поверх USB (протокол ECM, поддерживается в Linux и 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
>
Пример можно запустить командой gotee, которая порождает Main OS дважды, чтобы продемонстрировать поведение до и после вступления в силу ограничений TrustZone, используя реальную периферию.
Кроме того, команда linux может использоваться для запуска базового образа USB armory Debian в качестве небезопасной main OS.
[!NOTE] Для работы в небезопасном режиме поддерживаются только выпуски базового образа USB armory Debian >= 20211129.

Пример также можно запустить в эмуляции QEMU.
[!NOTE] Эмулируемые запуски выполняют частичные проверки из-за отсутствия полной поддержки TrustZone/PMP в 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
Компилятор TamaGo автоматически загружается и собирается как go tool с помощью Makefile.
В качестве альтернативы переменную окружения TAMAGO можно переопределить, чтобы использовать последний бинарный релиз:
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
Соберите исполняемые файлы примера trusted applet и ядра следующим образом:
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] Замените
trusted_applet_goнаtrusted_applet_rustдля примера Rust TA; для этого требуется Rust nightly и тулчейнarmv7a-none-eabi.
Готовые исполняемые файлы создаются в подкаталоге bin; для нативного выполнения следует использовать trusted_os_usbarmory.imx.
Доступны следующие цели:
TARGET | Плата | Выполнение и отладка |
|---|---|---|
usbarmory | USB armory Mk II | usbarmory |
Цели поддерживают нативное (см. соответствующие ссылки на документацию в таблице выше) и эмулируемое выполнение (например, make qemu).
Соберите исполняемые файлы примера trusted applet и ядра следующим образом:
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] Замените
trusted_applet_goнаtrusted_applet_rustдля примера Rust TA; для этого требуется Rust nightly и тулчейнriscv64gc-unknown-none-elf.
Готовые исполняемые файлы создаются в подкаталоге bin.
Доступные цели:
TARGET | Плата | Выполнение и отладка |
|---|---|---|
sifive_u | QEMU sifive_u | sifive_u |
Цель была протестирована только с эмулируемым выполнением (например, make qemu).
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
GoTEE | https://github.com/usbarmory/GoTEE
Copyright (c) The GoTEE authors. All Rights Reserved.
Эти исходные файлы распространяются на условиях лицензии BSD-типа, указанной в файле LICENSE.
| SoC | Плата | Пакет SoC | Пакет платы |
|---|
| 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 |