
GoTEE - example application
GoTEEフレームワークは、TamaGoベースのユニカーネルを特権モードと非特権モードで同時にインスタンス化し、モニターモードとカスタムシステムコールを介して相互にやり取りします。
これらの機能により、GoTEEはTamaGoベースのTrusted Execution Environments(TEE)を実装し、ARM TrustZone Secure WorldまたはRISC-V Supervisor Execution Environments内のベアメタル実行にGoのメモリ安全性、利便性、および機能をもたらします。
GoTEEは、GoTEE APIを実装する純粋なGo、Rust、またはCベースのフリースタンディングTrusted Appletに加えて、LinuxなどARM TrustZone Normal WorldまたはRISC-V Sモードで実行可能な任意のオペレーティングシステムを監視できます。
ARMユーザーモード、TrustZone Normal World、またはRISC-Vスーパーバイザーモード用の分離された実行コンテキスト
Trusted OS実装のためのAPI(Syscall、JSON-RPC、例外ハンドラ)
チュートリアルを含むメインのドキュメントは、プロジェクトwikiにあります。
パッケージAPIドキュメントはpkg.go.devにあります。
次の表は、現在サポートされているSoCとボードをまとめたものです。
TEEの用語では、特権ユニカーネルは一般にTrusted OSと呼ばれ、非特権ユニカーネルはTrusted Appletを表します。
GoTEEのサンプルは、Trusted OS、Trusted Applet、Main OSとして動作するGoユニカーネルの同時動作を示しています。
[!WARNING] Main OSは任意の「リッチ」OS(例: Linux)を使用できます。TamaGoは単に自己完結型のサンプルのために使用されています。これはTrusted Appletにも同様に当てはまり、ユーザーモードで実行でき、GoTEE APIを実装する任意のベアメタルアプリケーション(フリースタンディングCまたはRustプログラムなど)を使用できます。
ビルド時に
trusted_applet_goをtrusted_applet_rustに置き換えることで、Rustのサンプルを使用できます。
このサンプルのTrusted OS/アプレットの組み合わせは、異なる特権レベルでの3つのTamaGoユニカーネルの同時実行の基本的なテストを実行します。
Main OSはモニターコールで制御を戻します。
Trusted Appletは、Trusted OSのメモリを読み取ろうとする前に5秒間スリープします。これにより、スーパーバイザーが処理する例外がトリガーされ、Trusted Appletが終了します。
GoTEEのsyscallインターフェースは、Trusted OSとTrusted Applet間の通信のために実装されています。
USB armory Mk IIで起動した場合、サンプルアプリケーションはEthernet over USB(ECMプロトコル、LinuxおよびmacOSホストでサポート)経由でSSHを使用してアクセスできます。
$ 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コマンドで起動でき、実際のハードウェアペリフェラルを使用して、TrustZone制限が有効になる前後の動作を示すためにMain OSを2回起動します。
さらに、linuxコマンドを使用して、USB armory Debianベースイメージを非セキュアなメインOSとして起動できます。
[!NOTE] 非セキュア動作では、USB armory Debianベースイメージのリリース>= 20211129のみがサポートされています。

サンプルはQEMUエミュレーションでも実行できます。
[!NOTE] エミュレーション実行は、QEMUによる完全なTrustZone/PMPサポートがないため、部分的なテストのみ行います。
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コンパイラは、Makefileによってgo toolとして自動的にダウンロードおよびコンパイルされます。
または、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] Rust TAのサンプルでは、
trusted_applet_goをtrusted_applet_rustに置き換えてください。これには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] Rust TAのサンプルでは、
trusted_applet_goをtrusted_applet_rustに置き換えてください。これには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.
これらのソースファイルは、LICENSEファイルに記載されているBSDスタイルのライセンスの下で配布されています。
| 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 |