في المقالات السابقة ، نظرنا في جهاز TrustZone وتشغيل آلية المراقبة الآمنة. سنركز اليوم على نظام التشغيل الموثوق به (TEE) وتطبيقاته. وإذا كانت هناك أشياء منخفضة المستوى في المرة الأخيرة ، فسيكون كل شيء الآن على مستوى عالٍ جدًا - على مستوى نظام التشغيل.
ما هو TEE؟
ما هو TEE؟ هذه هي بيئة التنفيذ الموثوق بها (بيئة تنفيذ موثوقة) ، في المقام الأول - هذه هي بيئة تنفيذ البرامج. نحن نصفه من حيث الوظيفة والخصائص ، ولكن ليس بمعنى البرمجة ، ولكن بالمعنى الفلسفي.
على سبيل المثال ، القطار والقطار وسيارة الأجرة لمسافات طويلة لديهم واحدة من أهم الوظائف - لنقل الناس. لكن حسب خصائصهم ، فإنهم يختلفون ، على سبيل المثال: قطار ينقل بين المدن ، قطار كهربائي - خارج المدينة ، وسيارة أجرة - بشكل رئيسي في المدينة. قطار وقطار للتذاكر ، سيارات الأجرة - لا. وهكذا دواليك.
وظيفة TEE هي تخزين بعض البيانات بشكل آمن لنا وإطلاق التطبيقات بالنسبة لنا. نريد إرسال أوامر TEE: قم بتشغيل مثل هذا التطبيق ، وأخذ مثل هذه البيانات والقيام بذلك وذاك معهم. في الوقت نفسه ، لا يمكننا رؤية رمز التطبيق ، وكذلك البيانات. سوف نحصل على النتيجة فقط. التفاعل مع TEE يشبه إلى حد بعيد RPC.
هذه الوظيفة مثالية للعديد من التشفير ، على سبيل المثال ، للتوقيع الإلكتروني: يتم تخزين المفاتيح في TEE ، ونطلب من TEE توقيع البيانات المرسلة باستخدام مفتاح مخزَّن في TEE. نحصل على النتيجة ، ولكن ليس لدينا حق الوصول إلى المفتاح.
تحتوي TEE على عدد من الخصائص ، ولكن أهمها: أ) نحن نثق في تنفيذه ، و ب) يتم فصله بشكل موثوق عن نظام التشغيل الرئيسي للجهاز ، محميًا ، من الصعب كسره أو كسره. هناك خصائص أخرى ، لكننا نسميها نظام تشغيل موثوقًا لذلك. الخاصية ب) أهم شيء هو أن يتم فصل TEE ويصعب كسرها ، أي أنها محمية.
إذا نظرت إلى TEE من خلال منظور الوظائف والخصائص ، يصبح من الواضح أن TEE لا تتعلق حتى بـ TrustZone. TrustZone هي إحدى طرق فصل TEE عن نظام التشغيل (الضيف) الرئيسي.
خيارات تنفيذ TEE
إذا كانت الخصائص الرئيسية لـ TEE هي أنها منفصلة ويصعب كسرها ، فيمكننا التوصل إلى خيارات مختلفة لتطبيق TEE:
- استخدم TrustZone - نحصل على فصل TEE ونظام التشغيل الرئيسي داخل قلب المعالج نفسه.
- قم بتشغيل TEE على قلب منفصل داخل النظام على شريحة والتواصل معه من خلال واجهة الأجهزة. بعض المعالجات المتخصصة لديها نوى موثوقة منفصلة لتشغيل TEE ، ولكن لا يمكنك شرائها في المتجر ، للأسف. ولكن يمكنك أن تأخذ بلورة ثنائية النواة ، على سبيل المثال ، Cortex-A + Cortex-M0 / M4 وتشغيلها على Cortex-M TEE.
- قم بتشغيل TEE في شريحة منفصلة وإنشاء اتصال آمن معها عبر واجهة خارجية ، على سبيل المثال ، SPI أو SMbus. لحماية الاتصال ، استخدم طرق التشفير.
تُستخدم هذه الطريقة عند إنشاء اتصال ببطاقة ذكية ، مثل بطاقة دفع بلاستيكية على رقاقة. بمعنى ما ، يتم تنفيذ TEE في الشريحة ، لأنه بناءً على طلبنا ، فإنه يقوم بكل ثقة بإجراء المعاملات المالية ، وتخزين البيانات ، وما إلى ذلك.
يتم استخدام نفس الطريقة في TPM (الوحدة النمطية للنظام الأساسي الموثوق به) لبنية الكمبيوتر الحديثة.
سنتحدث فقط عن تنفيذ TEE في TrustZone ، لأن هذه نسخة شائعة جدًا من تنفيذ TEE. لكن الكثير مما سبق سيطبق على TEE بشكل عام.
TEE كنظام تشغيل
في المقالات السابقة ، أطلقنا طوال الوقت اسم TEE على نظام تشغيل موثوق به وقلنا إنه يشبه إلى حد كبير أنظمة التشغيل الحقيقية.
نقول أن معظم TEE يحتوي على:
- التطبيقات والعمليات: يمكن لـ TEE تنزيل التطبيقات وتنفيذها ؛
- فصل العملية وذاكرة kernel: تستخدمها MMU لحماية مساحة ذاكرة العملية وحماية ذاكرة TEE الأساسية ؛
- خيوط ، تفاعلات العملية ؛
- تخزين البيانات.
يمكنك التوصل إلى إصدارات أكثر اقتطاعًا من TEE ، على سبيل المثال ، بدون تحميل ديناميكي للتطبيقات ، بدون تفاعل العملية ، بدون مؤشرات ترابط ، ولكن التطبيقات نفسها ، وتخزين البيانات وفصل ذاكرة العملية ومساحة النواة ستبقى.
نص مخفييمكن رؤية مثال على TEE مقطوع الآن في مشروع ARM Trusted Firmware-M للجيل الجديد من وحدات التحكم الدقيقة Cortex-M على منصة ARMv8-M. هذا هو TEE مجرد لأسفل ، والآن هناك دعم للمتحكم الدقيق على نوى Cortex-M23 و Cortex-M33. هذه هي وحدات التحكم الدقيقة القائمة على الفلاش ، وتعادل تقريبًا Cortex-M0 و Cortex-M3 ، ولكن مع دعم TrustZone. لديهم القليل من ذاكرة الوصول العشوائي ، يعمل البرنامج بشكل أساسي من Flash ، وبالتالي في TEE لا يوجد تحميل ديناميكي للبرامج. في الوقت الحالي ، يكون TF-M مترابطًا أيضًا.
واجهة برنامج TEE
للتفاعل مع مكونات البرامج الأخرى ، لدى TEE واجهة برمجة تطبيقات:
- يوفر TEE واجهة برمجة تطبيقات للبرامج من خلال مكالمات النظام (مكالمة المشرف ، أمر SVC) ؛
- يوفر TEE واجهة برمجة التطبيقات لعالم عادي من خلال المكالمات إلى Secure Monitor (أمر SMC).
من خلال مكالمات النظام ، تقوم البرامج بحفظ البيانات واستدعاء وظائف نظام التشغيل. مثل أي نظام تشغيل لائق ، تحاول TEE تجريد البرامج من الأجهزة إلى درجة أو أخرى.
على سبيل المثال ، تعمل ملخصات Linux مع الملفات من خلال مكالمات مفتوحة وقراءة وكتابة وإغلاق - جميع وظائف stdio تقع بشكل أساسي على مكالمات نظام التشغيل. كما تسمح TEE لتطبيقاتها بالعمل مع البيانات المخزنة من خلال المكالمات التي تقوم بتخزين وتحميل الكائنات (كتل البيانات) بشكل مجرد إلى التخزين. يمكن لـ TEE أيضًا توفير بعض وظائف التشفير على مستوى النظام ، إلخ.
هناك مجموعة من مواصفات
GlobalPlatform لـ TEE ، وهي تصف واجهات برمجة التطبيقات والمتطلبات وسيناريوهات الاستخدام وما إلى ذلك.
يتم وصف واجهات برمجة تطبيقات TEE الأساسية لبرامجها في مواصفات TEE الداخلية الأساسية API. يصف وظائف تخزين البيانات ، وظائف التشفير ، إلخ. ويصف "واجهة برمجة تطبيقات عميل TEE" كيفية استدعاء التطبيقات من Normal World.
إذا قام TEE الخاص بك بتطبيق واجهات برمجة التطبيقات هذه ، فستكون كتابة تطبيق لها أمرًا سهلاً للغاية. بفضل واجهة برمجة تطبيقات واحدة ، يتم أيضًا تنفيذ قابلية نقل البرامج.
الاختلافات بين TEE ونظام التشغيل العادي
الاختلافان الرئيسيان بين TEE و Linux وأنظمة التشغيل الشائعة الأخرى المألوفة لنا هما:
- تقوم TEE بتنفيذ إجراءات ليس بأمر المستخدم ، ولكن بأمر من Normal World ؛
- TEE في TrustZone ليس لديها جدولة خاصة بها.
في نظام التشغيل العادي ، يقوم المستخدم بإنشاء بعض المدخلات - إدخال الأوامر ، والنقر على الرموز ، ويقوم نظام التشغيل بمعالجة هذا الإدخال ، ونقله إلى البرامج ، ومعالجة البرامج. في إصدار الخادم ، لا يأتي الإدخال من المستخدم ، ولكن من عملاء معينين ، على الأرجح عبر الشبكة. لكن نظام التشغيل يعمل على أساس المدخلات الخارجية.
لا تقوم TEE بمعالجة البيانات الخارجية أو نقلها إلى التطبيقات. بدلاً من ذلك ، يعالج الأوامر والبيانات المرسلة من Normal World من خلال واجهة برمجة تطبيقات عميل TEE ، وهذا كل شيء تقريبًا. اتضح أن TEE تعمل لنظام التشغيل مثل بعض المكتبات مع واجهة RPC ، والتي تسمى وظائفها. بعد معالجة الوظائف ، قد لا تفعل TEE أي شيء.
الفارق الثاني يتبع من الأول. يشارك TEE في Trustee وقت CPU مع Normal World ويطلق عليه كمكتبة. لا تقوم TEE بتخصيص وقت المعالج باستمرار لنفسها ، فهي تنفق الكثير من الوقت الذي تحتاجه لإكمال الطلب ، ثم تنقل التحكم إلى Normal World. وإذا كان الأمر كذلك ، فلا ينبغي أن يكون لديها جدول زمني خاص بها - فهي تحتاج إلى جدولة نظام تشغيل الضيف.
ينقل مجدول نظام التشغيل الرئيسي التحكم إلى TEE بشكل غير مباشر:
- يحدد المجدول المهمة المراد إكمالها ؛
- تستدعي المهمة استدعاء نظام kernel ؛
- استدعاء نظام يستدعي TEE ، إذا لزم الأمر ؛
- تعمل TEE طالما كان ذلك ضروريًا لإكمال الطلب وإعادة التحكم إلى Normal World.
تطبيقات TEE
تسمى التطبيقات التي تعمل على TEE Trustlets - على غرار التطبيقات الصغيرة التي تعمل على البطاقات الذكية.
اقتباس من ويكيبيديا:
التطبيق الصغير (Eng. التطبيق الصغير من التطبيق - التطبيق والبرنامج - لاحقة صغيرة) هو مكون برمجي غير مستقل يعمل في سياق تطبيق آخر كامل الوزن ، مصمم لمهمة ضيقة واحدة وليس له قيمة بمعزل عن التطبيق الأساسي.
Trustlet هو تطبيق موثوق به. هذا برنامج لـ TEE ، كما اكتشفنا بالفعل ، فإنه يتواصل مع TEE من خلال مكالمات النظام ، ولديه دورة حياة ، وما إلى ذلك.
ولكن مع ذلك ، يشير الاسم إلى أنه مكون غير مستقل. هنا ، يتم التعبير عن الاستقلال في حقيقة أن Trustlet ستجري مكالمات من Normal World ، ثم تنقطع مع TEE. إذا كان يدور في حلقة لا نهائية ، فسوف يتوقف قلب المعالج عن العمل كنظام تشغيل ، وسيتوقف كل شيء في النهاية. لكن البرنامج لنظام تشغيل عادي يمكن أن يدور في حلقة لا نهاية لها ومنجم لحساب بعض المهام ، وهذا أمر طبيعي تمامًا للبرنامج. في هذا الصدد ، فهي مستقلة عن Trustlet.
يجب أن يكون لدى Trustlet نوعًا من المعرّف حتى يمكن لـ Normal World أن تطلق عليه. من المعتاد إعطاء Trustlets كمعرِّفات فريدة من نوعها.
دورة حياة Trustlet
ضع في اعتبارك كيفية إطلاق trastlet وتنفيذ الأوامر.
قد يكون من المنطقي تحميل Trustlet إلى الذاكرة وبدء العمل ، ولكن في GlobalPlatform TEE Client API ، لبدء Trustlet ، تحتاج إلى إنشاء سياق وتأسيس جلسة مع Trustlet.
إنشاء سياق هو إنشاء اتصال بين Normal World و TEE. في هذه الحالة ، تفترض مواصفات GlobalPlatform أن الجهاز يمكن أن يحتوي على العديد من TEEs ، وفي وقت إنشاء السياق ، يمكنك اختيار TEE للاتصال.
في GlobalPlatform TEE Client API ، يتم توفير وظيفة لهذا:
TEEC_Result TEEC_InitializeContext (con char * name، TEEC_Context * السياق)
يتم استدعاء هذه الوظيفة من تطبيق "العالم العادي". يشير الاسم هنا إلى TEE القابل للتحديد. إذا كنا نريد TEE افتراضيًا أو تأكدنا من وجود TEE واحد فقط ، فإننا نستبدل NULL. في السياق ، يتم حفظ السياق الذي تم إنشاؤه.
بعد إنشاء السياق ، تحتاج إلى إنشاء جلسة مع الثقة. هنا UUID من Trustlet مفيد لنا. للقيام بذلك ، تسمى الوظيفة:
TEEC_Result TEEC_OpenSession (
سياق TEEC_Context * ، جلسة TEEC_Session * ،
وجهة const TEEC_UUID * ، uint32_t connectionMethod ،
const باطلة * connectionData ، TEEC_Operation * العملية ،
uint32_t * returnOrigin)
تعادل الجلسة العمل مع مثيل البرنامج في نظام تشغيل عادي: يمكن أن يكون هناك العديد من مثيلات البرنامج نفسه في نظام التشغيل ، وستعمل بشكل مستقل. ولكن هناك العديد من الجلسات في TEE ، وهي في جوهرها روابط إلى حالات فريدة من المجموعة الموثوقة في الذاكرة. في هذه الحالة ، من المرجح أن تكون منطقة التعليمات البرمجية هي نفسها ، ويتم تعيينها عبر MMU على ذاكرة العمليات المختلفة. ولكن سيكون لكل عملية منطقة بيانات خاصة بها ، مما يسمح للمثيل بالعمل بشكل مستقل. تمامًا مثل Linux.
عندما يتم استدعاء TEEC_OpenSession ، يتم إرسال سياق وثقة UUID للوجهة كمدخل. سيتم حفظ الجلسة المحددة في "الجلسة". فيما يلي بعض المعايير التي لن نأخذها بعين الاعتبار ، فهي ليست مهمة جدًا في الفهم.
في وقت إنشاء الجلسة ، يمكن تحميل مجموعة الثقة في الذاكرة. هذا ما يحدث مع التطبيقات على نظام التشغيل. في TEE الكبير ، يكون الرابط هو المسؤول عن ذلك ، ويقوم بتنزيل الصورة الثنائية للرابط الصغير ، وهذا هو ملف ELF موقع. إذا كان هذا TEE صغيرًا ، فيجب تحميل Trustlet بالفعل في الذاكرة - يمكن ربطه بشكل ثابت أو ، بالنسبة إلى وحدات التحكم الدقيقة فلاش ، مكتوب على ذاكرة فلاش على العنوان المحدد.
لنفترض أن لدينا TEE كبير ونحن بحاجة لتحميل Trustlet في الذاكرة. من أين أتى؟ من حيث المبدأ ، يحتاج TEE في وقت التحميل إلى كائن مع UUID معين ، ويمكن أن تكون آلية الحصول على هذا الكائن:
- قد يكون الكائن في الذاكرة بالفعل ؛
- يمكن وضع الكائن بشكل ثابت في ذاكرة فلاش (لأجهزة التحكم الدقيقة) ؛
- يمكن ربط الكائن بشكل ثابت بـ TEE - لمصارف النظام ؛
- أخيرًا ، يمكنك تنزيل الملف إلى ذاكرة الوصول العشوائي من نظام الملفات ، أو حتى عبر الشبكة.
اسأل نفسك لاحقًا ، كيف يقوم TEE بتنزيل البيانات من نظام ملفات أو عبر شبكة؟ !!!
بعد تنزيل صورة المجموعة ، يتم التحقق من توقيعه الرقمي. يتم استخدام نظام الشهادة ، وسوف تتحقق TEE من أن الثقة موقعة من طرف تثق به TEE. هذا مهم جدًا لأنه يلغي إمكانية تنزيل مجموعة موثوق بها مخادعة مع بعض البرامج الضارة.
عندما يتم استلام صورة Trustlet ويتم التحقق من التوقيع ، يقوم TEE بإنشاء مساحة العنوان لنسخة Trustlet في MMU ، ويقوم الرابط بتحميل منطقة الرمز في الذاكرة ، وتعيينها إلى مساحة عنوان Trustlet وتهيئة منطقة البيانات. والنتيجة هي نسخة مبدئية بالكامل من Trustlet للعمل مع تطبيق الاستدعاء المحدد - هذا هو إنشاء الجلسة.
بعد إنشاء الجلسة ، تكون مجموعة الثقة جاهزة تمامًا ويمكنها تنفيذ الطلبات من تطبيق الاستدعاء. من أجل استدعاء وظائف Trustlet من نظام التشغيل ، يتم استخدام الوظيفة:
TEEC_Result TEEC_InvokeCommand (
جلسة TEEC_Session * ،
uint32_t commandID ،
عملية TEEC_Operation * ،
uint32_t * returnOrigin)
هنا ، تشير "الجلسة" إلى جلستنا ، أي مثيل TEE ونسخة Trustlet التي نعمل معها.
يشير "CommandID" إلى الدالة المطلوبة من مجموعة الثقة. هذه هي دالة Trustlet ، وليس دالة TEE. كل ما تهتم به TEE هو بدء تشغيل أوامر Trustlet وإرسال الأوامر ، وأي أرقام CommandID لتعيينها للتواصل مع Trustlet أمر متروك لك ، ولا توجد قاعدة أو قائمة عمومية بالوظائف.
إذا كنت بحاجة إلى تمرير المعلمات إلى الوظيفة المطلوبة ، فسيتم تمريرها من خلال العملية - وهذا مؤشر إلى بنية TEEC_Operation. لن نتعمق كثيرًا الآن ، فقط لاحظ أن هذا الهيكل يحتوي على ما يصل إلى 4 معلمات دالة (اكتب TEEC_Parameter). يمكن أن تكون المعلمات قيمة TEEC_Value بسيطة أو مؤشرًا للذاكرة. تحتوي المعلمات أيضًا على تصنيف في الاتجاه: TEEC_VALUE_INPUT (إدخال) أو TEEC_VALUE_OUTPUT (خرج) أو TEEC_VALUE_INOUT (ثنائي الاتجاه).
إذا مررنا مؤشرًا إلى بنية TEEC_Operation ، فيجب علينا أولاً تهيئته: تعيين جميع القيم والاتجاهات. عند الانتهاء من المكالمة ، يمكننا التحقق من القيم التي تم إرجاعها في هذه البنية (لـ TEEC_VALUE_OUTPUT و TEEC_VALUE_INOUT).
خلال الجلسة ، يمكننا استدعاء وظائف Trustlet عدة مرات كما نحتاج. في نهاية العمل ، ستحتاج إلى إنهاء الجلسة وإطلاق السياق عن طريق الاتصال بـ TEEC_CloseSession و TEEC_FinalizeContext.
كل هذا يذكرنا بـ RPC ، أليس كذلك؟ من حيث المبدأ ، يتم تصور جميع العمليات مع TEE على أنها RPC ، وبفضل هذا ، يمكنك العمل مع مجموعة متنوعة من تطبيقات TEE: في TrustZone ، في قلب منفصل ، في شريحة منفصلة.
الدعاء
أعلاه ، سألنا أنفسنا: كيف تقوم TEE بتنزيل البيانات من نظام ملفات أو عبر شبكة؟
إذا فكرت في الأمر ، فإن TEE نفسها لا يمكنها الوصول إلى نظام ملفات نظام التشغيل. أي أن TEE المنفذة في TrustZone يمكن أن يكون لها مثل هذا الوصول ، ولكن بعد ذلك يجب أن تشاركه مع Normal World ، وهذا ليس بهذه البساطة. على سبيل المثال ، يعمل Linux باستمرار مع نظام الملفات ، وحالته الحالية موجودة فقط في ذاكرة kernel Linux ، وليس على القرص. إذا كانت TEE تريد التدخل والعمل بنظام الملفات بالتوازي ، فسيكون ذلك صعبًا للغاية. مع مشاركة الشبكة نفسها.
بالإضافة إلى ذلك ، فإن TEE هو نظام تشغيل صغير نوعًا ما ، وسيكون من غير المربح تنفيذ برامج تشغيل منخفضة المستوى للعمل مع الوسائط ، مع وحدة تحكم الشبكة ، ودعم مكدس الشبكة أو برنامج تشغيل FS. بالإضافة إلى ذلك ، هذا يزيد بشكل كبير من سطح الهجوم - سيكون هناك فرصة لكسر TEE عن طريق انزلاق inode غير عادي على ext2 أو شيء من هذا القبيل. لا نريد ذلك.
لذلك ، عند بدء تشغيل نظام التشغيل ، يتم تحميل ما يسمى المتصل - وهو برنامج مساعد. وهو متصل دائمًا بـ TEE ، ويستخدمه TEE للوصول إلى موارد العالم العادي.
لذلك ، إذا كانت TEE تريد تنزيل صورة Trustlet من نظام الملفات ، فإنها تستدعي Supplicant:
TEE: ماذا عن كائن مع UUID؟
المستدعي: (يحمِّل شيئًا من نظام الملفات) آسف يا سيدي!بالطبع ، يجب التحقق من سلامة هذه المكالمات. في هذه الحالة ، نتحقق من التوقيع في مجموعة الثقة ولا نتحمل أي مخاطرة تقريبًا - إما أن يكون التوقيع صحيحًا وتذهب المجموعة إلى العمل ، أو أن التوقيع غير صحيح. هذا يعني أننا نخاطر - قد لا يكون هناك موثوق ، قد لا يتم إطلاقه ، ولكن هذا جزء آخر من نموذج التهديد.
مكتبة مساحة المستخدمين
يتم تنفيذ واجهة البرنامج (المكالمات إلى TEEC_OpenSession ، وما إلى ذلك) باستخدام مكتبة تنقل مكالمة من مستوى التطبيق إلى TEE.
عند تنفيذ TEE في TrustZone ، لهذا ، يجب على المكتبة أولاً نقل المكالمة إلى مستوى نواة نظام التشغيل ، حيث أن نواة نظام التشغيل فقط هي التي يمكنها استدعاء SMC (مكالمة مراقب آمن).
في حزمة Linux + OP-TEE ، تكون مكتبة مساحة المستخدمين هي libteec. يقوم بترجمة مكالمات GlobalPlatform TEE Client API إلى برنامج تشغيل kernel من خلال عمليات ioctl على ملف الجهاز: عند بدء تشغيل نظام التشغيل ، يتم تحميل وحدة kernel (برنامج التشغيل) ، ويقوم برنامج التشغيل بإنشاء ملف الجهاز. من خلال فتح ملف الجهاز باستخدام libteec ، يمكن لبرنامج المستخدم العمل مع TEE Client API.
أي أن هذا التصميم يعمل:
التطبيق> libteec> ملف الجهاز> برنامج تشغيل kernel> SMC> TEE> الثقة.
مثال على Trustlet
إليك كيفية عملها في تطبيق حقيقي:

هنا ، يتم استخدام Trustlet لتوقيع المستندات إلكترونيًا. يقوم برنامج من Linux باستدعاء Trustlet ، ولهذا الغرض يتم إنشاء سياق TEE ، وجلسة مع Trustlet ، يتم إرسال بيانات التوقيع ، ويتم إرجاع التوقيع الإلكتروني.
الخلاصة
في هذه المقالة ، اكتشفنا ما هي TEE و Trustlets. التقينا بواجهة برمجة تطبيقات TEE وتعلمنا كيفية استدعاء Trustlets.
لقد تركنا عن عمد الكثير من الأشياء ، مثل استخدام الذاكرة المشتركة وكتابة تراستلاتس ، لأن المقالة لا تدعي أنها دليل شامل.
إذا كنت مهتمًا بموضوع TEE ، فتابع الدراسة بنفسك: يمكنك البدء بدراسة مواصفات GlobalPlatform أو باستكشاف OP-TEE. يمكنك أيضًا إرسال سيرة ذاتية تحمل علامة TrustZone.