
Go بيئة التنفيذ الموثوقة (TEE)
يُنفذ إطار عمل GoTEE إنشاءًا متزامنًا لأنوية يونيكيرنل المستندة إلى TamaGo في الوضعين المميّز وغير المميّز، حيث تتفاعل مع بعضها البعض من خلال وضع المراقب واستدعاءات النظام المخصصة.
وبهذه الإمكانيات، يُنفذ GoTEE بيئات تنفيذ موثوقة (TEE) قائمة على TamaGo، مما يجلب أمان ذاكرة Go وسهولتها وقدراتها إلى التنفيذ على المعدن العاري داخل العالم الآمن ARM TrustZone أو بيئات تنفيذ المشرف في RISC-V.
يمكن لـ GoTEE الإشراف على التطبيقات الموثوقة القائمة بذاتها المكتوبة بلغة Go أو Rust أو C، التي تُنفذ واجهة برمجة GoTEE، بالإضافة إلى أي نظام تشغيل قادر على العمل في العالم الطبيعي ARM TrustZone أو وضع S في RISC-V مثل Linux.
سياقات تنفيذ معزولة لوضع مستخدم ARM، أو العالم الطبيعي TrustZone أو وضع المشرف في RISC-V
واجهة برمجة لتطبيق نظام التشغيل الموثوق (معالجات Syscall وJSON-RPC والاستثناءات)
يمكن العثور على التوثيق الرئيسي، الذي يتضمن برنامجًا تعليميًا، على الويكي الخاص بالمشروع.
يمكن العثور على توثيق واجهة برمجة الحزمة على pkg.go.dev.
يلخص الجدول التالي أنواع SoC واللوحات المدعومة حاليًا.
في مصطلحات TEE، يُشار عادةً إلى اليونيكيرنل المميّز باسم نظام التشغيل الموثوق، بينما يمثل غير المميّز تطبيقًا موثوقًا.
يُوضح مثال الخاص بـ GoTEE التشغيل المتزامن لأنوية Go يونيكيرنل التي تعمل كنظام تشغيل موثوق، وتطبيق موثوق، ونظام تشغيل رئيسي.
[!WARNING] يمكن أن يكون نظام التشغيل الرئيسي أي نظام تشغيل "غني" (مثل Linux)، ويُستخدم TamaGo ببساطة من أجل مثال مكتفٍ بذاته. وينطبق الأمر نفسه على التطبيق الموثوق الذي يمكن أن يكون أي تطبيق معدني عارٍ قادر على العمل في وضع المستخدم و تنفيذ واجهة برمجة GoTEE، مثل برامج C أو Rust القائمة بذاتها.
يمكن استخدام مثال بلغة Rust باستبدال
trusted_applet_goبـtrusted_applet_rustعند البناء.
يقوم مزيج نظام التشغيل/التطبيق الموثوق المثال بإجراء اختبار أساسي للتنفيذ المتزامن لثلاثة أنوية يونيكيرنل TamaGo على مستويات امتياز مختلفة:
يُعيد نظام التشغيل الرئيسي التحكم عبر استدعاء مراقب.
ينام التطبيق الموثوق لمدة 5 ثوانٍ قبل محاولة قراءة ذاكرة نظام التشغيل الموثوق، مما يؤدي إلى استثناء يعالجه المشرف ويُنهي التطبيق الموثوق.
يتم تنفيذ واجهة استدعاء النظام الخاصة بـ GoTEE للاتصال بين نظام التشغيل الموثوق والتطبيق الموثوق.
عند تشغيله على 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 الذي يُولّد نظام التشغيل الرئيسي
مرتين لإظهار السلوك قبل وبعد تفعيل قيود TrustZone باستخدام أجهزة طرفية حقيقية.
بالإضافة إلى ذلك، يمكن استخدام الأمر linux لتوليد
صورة Debian الأساسية لـ USB armory
كنظام تشغيل رئيسي غير آمن.
[!NOTE] الإصدارات >= 20211129 فقط من صورة Debian الأساسية لـ USB armory مدعومة للتشغيل غير الآمن.

يمكن أيضًا تنفيذ المثال تحت محاكاة 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 (أو استخدم أحدث إصدار ثنائي):
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
قم ببناء الملفات التنفيذية للتطبيق الموثوق المثال والنواة كما يلي:
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، وهذا يتطلب إصدار Rust الليلي وسلسلة أدواتarmv7a-none-eabi.
يتم إنشاء الملفات التنفيذية النهائية في الدليل الفرعي bin،
ويجب استخدام trusted_os_usbarmory.imx للتنفيذ الأصلي.
الأهداف التالية متاحة:
TARGET | اللوحة | التنفيذ والتصحيح |
|---|---|---|
usbarmory | USB armory Mk II | usbarmory |
تدعم الأهداف التنفيذ الأصلي (انظر روابط التوثيق ذات الصلة في الجدول أعلاه)
بالإضافة إلى التنفيذ المُحاكى (مثل make qemu).
قم ببناء الملفات التنفيذية للتطبيق الموثوق المثال والنواة كما يلي:
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، وهذا يتطلب إصدار Rust الليلي وسلسلة أدوات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
حقوق الطبع والنشر (c) مؤلفو GoTEE. جميع الحقوق محفوظة.
يتم توزيع ملفات المصدر هذه بموجب ترخيص بنمط 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 |