
Go: доверенная среда исполнения (TEE)
Фреймворк GoTEE обеспечивает одновременный запуск юникернелов на основе TamaGo в привилегированном и непривилегированном режимах, взаимодействующих друг с другом через режим монитора и пользовательские системные вызовы.
Благодаря этим возможностям GoTEE реализует доверенные среды выполнения (TEE) на основе TamaGo, привнося безопасность памяти Go, удобство и возможности в исполнение на «голом железе» в рамках ARM TrustZone Secure World или RISC-V Supervisor Execution Environments.
GoTEE может контролировать Trusted Applets на чистом Go, Rust или C, реализующие API GoTEE, а также любые операционные системы, способные работать в ARM TrustZone Normal World или RISC-V S-mode, такие как Linux.
Изолированные контексты выполнения для ARM User mode, TrustZone Normal World или RISC-V Supervisor Mode
API для реализации Trusted OS (Syscall, JSON-RPC и обработчики исключений)
Основная документация, включая руководство, находится в вики проекта.
Документация по API пакета доступна на pkg.go.dev.
В следующей таблице представлены поддерживаемые в настоящее время SoC и платы.
| SoC | Board | SoC package | Board package |
|---|---|---|---|
| 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 |
В терминологии TEE привилегированный unikernel обычно называют Trusted OS, а непривилегированный — Trusted Applet.
Пример GoTEE демонстрирует одновременную работу Go-юникернелов в роли 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 выполняет базовую проверку одновременного выполнения трех TamaGo юникернелов на различных уровнях привилегий:
Main OS возвращает управление с помощью вызова монитора.
Trusted Applet спит 5 секунд, прежде чем попытаться прочитать память Trusted OS, что вызывает исключение, обрабатываемое супервизором, который завершает работу Trusted Applet.
Интерфейс GoTEE syscall реализован для связи между Trusted OS и Trusted Applet.
При запуске на USB armory Mk II пример приложения доступен по SSH через Ethernet over 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 base image
в качестве небезопасной (Non-secure) основной ОС.
[!NOTE] Поддерживаются только выпуски USB armory Debian base image >= 20211129 для работы в небезопасном режиме (Non-secure).

Пример также можно выполнять под эмуляцией QEMU.
[!NOTE] Эмулируемые запуски выполняют частичное тестирование из-за отсутствия полной поддержки TrustZone/PMP в QEMU.