تفعيل إضافة وضع علامات الذاكرة

يقدّم الإصدار 9 من Arm ذاكرة الذراع إضافة وضع العلامات (MTE)، وهي عبارة عن تنفيذ أجهزة الذكريات التي تم وضع علامة عليها.

على المستوى العالي، تضع ميزة MTE علامات على كل عملية تخصيص أو تخصيص للذاكرة بيانات تعريف إضافية. وتعيّن علامة على أحد مواقع الذاكرة، والذي يمكن بالمؤشرات التي تشير إلى موقع الذاكرة هذا. وحدة المعالجة المركزية (CPU) في وقت التشغيل يتحقق من تطابق المؤشر وعلامات البيانات الوصفية عند كل عملية تحميل وتخزين.

في Android 12، يمكن لأداة تخصيص نواة ذاكرة الكوميد وUserspace زيادة لكل تخصيص مع بيانات التعريف. يساعد ذلك في رصد عمليات الشراء والاستخدام بعد الاستخدام أخطاء تجاوز سعة المخزن المؤقت، وهي المصدر الأكثر شيوعًا لأخطاء أمان الذاكرة في قواعد التعليمات البرمجية لدينا.

أوضاع التشغيل الخاصة بـ MTE

تتضمن إضافة وضع علامة MTE ثلاثة أوضاع تشغيل:

  • الوضع المتزامن (المزامنة)
  • الوضع غير المتزامن (ASYNC)
  • الوضع غير المتماثل (ASYMM)

الوضع المتزامن (المزامنة)

تم تحسين هذا الوضع للتحقق من صحة رصد الأخطاء مقارنةً بالأداء إمكانية استخدامها كأداة دقيقة لكشف الأخطاء، وذلك في حالة ارتفاع أعباء الأداء مقبول. عند تفعيل هذه الميزة، تعمل ميزة MTE SYNC كإجراء للحدّ من الأمان. عند عدم تطابق علامة، يلغي المعالج التنفيذ على الفور إنهاء العملية باستخدام SIGSEGV (الرمز) SEGV_MTESERR) ومعلومات كاملة حول الوصول إلى الذاكرة عنوان خاطئ.

ننصحك باستخدام هذا الوضع أثناء الاختبار كبديل HWASan/KASAN أو في مرحلة الإنتاج عندما تمثل العملية المستهدفة ثغرة أمنية الأجزاء المُعرضة للهجوم. بالإضافة إلى ذلك، عندما أشار وضع ASYNC إلى وجود خطأ، يمكن الحصول على تقرير خطأ دقيق باستخدام واجهات برمجة التطبيقات لوقت التشغيل للتبديل التنفيذ إلى وضع المزامنة.

عند التشغيل في وضع "المزامنة"، يسجّل تخصيص Android عمليات تتبُّع تسلسل استدعاء الدوال البرمجية لجميع التطبيقات. والمخصصات والصفقات لتقديم تقارير أخطاء أفضل تتضمّن شرحًا لإحدى الذكريات مثل "Use-after-free" أو "تجاوز سعة المخزن المؤقت" وعمليات "تتبع تسلسل استدعاء الدوال البرمجية" أحداث الذاكرة ذات الصلة. توفر هذه التقارير مزيدًا من المعلومات السياقية تسهيل تتبع الأخطاء وإصلاحها.

الوضع غير المتزامن (ASYNC)

تم تحسين هذا الوضع ليتناسب مع أدائه مقارنةً بدقة تقارير الأخطاء، ويمكن لهذا الوضع أن يكون محسَّنًا تُستخدم ككشف النفقات العامة للكشف عن أخطاء أمان الذاكرة.
في حال عدم تطابق العلامة، يستمر المعالج في التنفيذ حتى أقرب إدخال kernel (على سبيل المثال، syscall أو مقاطعة مؤقت)، حيث يتم إنهاؤه العملية باستخدام SIGSEGV (الرمز SEGV_MTEAERR) بدون تسجيل العنوان الخطأ أو الوصول إلى الذاكرة.
ننصحك باستخدام هذا الوضع في قناة الإصدار العلني على قواعد رموز تم اختبارها جيدًا، حيث يكون من المعروف أن أخطاء أمان الذاكرة منخفضة، وهو ما يتم تحقيقه باستخدام وضع المزامنة أثناء الاختبار.

الوضع غير المتماثل (ASYMM)

ميزة إضافية في إصدار Arm v8.7-A، وتوفّر وضع MTE غير المتماثل معلومات متزامنة والتحقق من قراءات الذاكرة والتدقيق غير المتزامن لعمليات الكتابة على الذاكرة، بأداء مشابه لأداء وضع ASYNC. في معظم الحالات، تحسينًا على وضع ASYNC، وننصحك باستخدامه بدلاً من ASYNC حيثما كان متاحًا.

لهذا السبب، لا يذكر أي من واجهات برمجة التطبيقات الموضحة أدناه القيمة غير المتماثلة الحالي. بدلاً من ذلك، يمكن تهيئة نظام التشغيل لاستخدام الوضع غير المتماثل دائمًا عندما يتم طلب البيانات غير المتزامنة. الرجاء الرجوع إلى صفحة "تهيئة وحدة المعالجة المركزية مستوى MTE المفضّل" للحصول على المزيد من المعلومات.

إضافة وضع علامات الذاكرة (MTE) في مساحة المستخدم

توضّح الأقسام التالية كيفية تفعيل إضافة وضع علامات الذاكرة (MTE) لعمليات النظام. والتطبيقات. تكون إضافة وضع علامات الذاكرة (MTE) غير مفعَّلة تلقائيًا، ما لم يتم استيفاء أحد الخيارات أدناه. لضبطها لعملية معيّنة (يمكنك الاطّلاع على المكوّنات التي تم تفعيل ميزة MTE فيها أدناه).

تفعيل إضافة وضع علامات الذاكرة (MTE) باستخدام نظام التصميم

باعتباره خاصية على مستوى العملية، يتم التحكم في MTE من خلال إعداد وقت الإصدار الملف التنفيذي الرئيسي. تسمح الخيارات التالية بتغيير هذا الإعداد أو ملفات تنفيذية فردية أو عن دلائل فرعية كاملة في شجرة المصدر. تشير رسالة الأشكال البيانية إعداد يتم تجاهله في المكتبات أو أي هدف غير قابل للتنفيذ الاختبار.

1. تفعيل إضافة وضع علامات الذاكرة (MTE) في Android.bp (مثال)، لمشروع معين:

وضع MTE الإعدادات
تطبيق MTE غير المتزامن
  sanitize: {
  memtag_heap: true,
  }
تطبيق MTE المتزامن
  sanitize: {
  memtag_heap: true,
  diag: {
  memtag_heap: true,
  },
  }

أو في Android.mk:

وضع MTE الإعدادات
Asynchronous MTE LOCAL_SANITIZE := memtag_heap
Synchronous MTE LOCAL_SANITIZE := memtag_heap
LOCAL_SANITIZE_DIAG := memtag_heap

2. تفعيل ميزة MTE في دليل فرعي في شجرة المصدر باستخدام منتج المتغير:

وضع MTE تضمين القائمة استبعاد القائمة
غير متزامن PRODUCT_MEMTAG_HEAP_ASYNC_INCLUDE_PATHS MEMTAG_HEAP_ASYNC_INCLUDE_PATHS PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS MEMTAG_HEAP_EXCLUDE_PATHS
مزامنة PRODUCT_MEMTAG_HEAP_SYNC_INCLUDE_PATHS MEMTAG_HEAP_SYNC_INCLUDE_PATHS

أو

وضع MTE الإعدادات
تطبيق MTE غير المتزامن MEMTAG_HEAP_ASYNC_INCLUDE_PATHS
تطبيق MTE المتزامن MEMTAG_HEAP_SYNC_INCLUDE_PATHS

أو من خلال تحديد مسار الاستبعاد لملف تنفيذي:

وضع MTE الإعدادات
تطبيق MTE غير المتزامن PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS MEMTAG_HEAP_EXCLUDE_PATHS
تطبيق MTE المتزامن

مثال، (استخدام مشابه لـ PRODUCT_CFI_INCLUDE_PATHS)

  PRODUCT_MEMTAG_HEAP_SYNC_INCLUDE_PATHS=vendor/$(vendor)
  PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS=vendor/$(vendor)/projectA \
                                    vendor/$(vendor)/projectB

تفعيل إضافة وضع علامات الذاكرة (MTE) باستخدام خصائص النظام

يمكن إلغاء إعدادات الإصدار المذكورة أعلاه في وقت التشغيل من خلال ضبط خاصية النظام التالية:

arm64.memtag.process.<basename> = (off|sync|async)

يشير الرمز basename إلى الاسم الأساسي للملف التنفيذي.

على سبيل المثال، لضبط /system/bin/ping أو /data/local/tmp/ping لاستخدام إضافة MTE غير المتزامنة، عليك استخدام adb shell setprop arm64.memtag.process.ping async.

تفعيل إضافة وضع علامات الذاكرة (MTE) باستخدام متغيّر بيئة

هناك طريقة أخرى لإلغاء إعداد الإصدار، وهي تحديد البيئة المتغيّر: MEMTAG_OPTIONS=(off|sync|async) إذا تم تحديد كل من متغير البيئة وخاصية النظام، للمتغير الأولوية.

تفعيل إضافة وضع علامات الذاكرة (MTE) للتطبيقات

إذا لم يتم تحديد MTE، تكون غير مفعّلة تلقائيًا ولكن بإمكان التطبيقات التي تريد استخدام وضع MTE إجراء ذلك من خلال ضبط android:memtagMode. بموجب <application> أو علامة <process> في قسم AndroidManifest.xml

android:memtagMode=(off|default|sync|async)

عند ضبطها على العلامة <application>، تؤثر في جميع العمليات التي يستخدمها التطبيق، ويمكن تجاوزها للعمليات الفردية من خلال تعيين العلامة <process>

بالنسبة إلى التجارب، التوافق التغييرات لتعيين القيمة التلقائية memtagMode لتطبيق يفعل ذلك عدم تحديد أي قيمة في البيان (أو تحديد default).
يمكن العثور على هذه التصنيفات ضمن System > Advanced > Developer options > App Compatibility Changes في قائمة الإعدادات العامة. الإعداد يؤدي NATIVE_MEMTAG_ASYNC أو NATIVE_MEMTAG_SYNC إلى تفعيل MTE. لتطبيق معين.
وبدلاً من ذلك، يمكن ضبط هذا الإعداد باستخدام am. على النحو التالي:

$ adb shell am compat enable NATIVE_MEMTAG_[A]SYNC my.app.name

إنشاء صورة لنظام MTE

ننصح بشدة بتفعيل ميزة MTE على جميع البرامج الثنائية الأصلية أثناء إنشائها. وطرحها. يساعد هذا الإجراء في اكتشاف أخطاء أمان الذاكرة في مرحلة مبكرة وتوفير تفاصيل واقعية تغطية المستخدم، إذا تم تفعيلها في إصدارات الاختبار.

ننصح بشدة بتفعيل ميزة MTE في الوضع المتزامن على جميع البرامج الثنائية الأصلية أثناء التطوير.

SANITIZE_TARGET=memtag_heap SANITIZE_TARGET_DIAG=memtag_heap m

كما هو الحال مع أي متغيّر في نظام الإصدار، يمكن تنفيذ SANITIZE_TARGET يُستخدم كمتغير للبيئة أو كإعداد make (على سبيل المثال، في ملف product.mk).
يُرجى ملاحظة أنّ هذا يسمح بـ MTE لجميع العمليات الأصلية، وليس التطبيقات (التي يتم تشغيلها بشكل متشعّب من zygote64) والتي يمكن تفعيل إضافة وضع علامات الذاكرة (MTE) لها مفعّلة باتّباع التعليمات أعلاه.

ضبط مستوى MTE المفضَّل الخاص بوحدة المعالجة المركزية (CPU)

في بعض وحدات المعالجة المركزية (CPU)، قد يكون أداء إضافة MTE في ASYMM أو حتى أوضاع المزامنة مشابهة الخاصة بـ ASYNC. وهذا يجعل من المجدي تمكين عمليات تحقق أكثر صرامة على وحدات المعالجة المركزية هذه عند طلب وضع فحص أقل صرامة، من أجل الحصول على مزايا اكتشاف الأخطاء الناتجة عن عمليات التحقق الأكثر صرامة دون والجوانب السلبية للأداء.
بشكل تلقائي، سيتم تشغيل العمليات التي تم ضبطها في وضع ASYNC في ASYNC على جميع وحدات المعالجة المركزية. لتهيئة النواة لتشغيل هذه العمليات في وضع المزامنة على يجب كتابة مزامنة القيمة مع وحدة المعالجة المركزية (CPU)، إدخال واحد (sysfs) /sys/devices/system/cpu/cpu<N>/mte_tcf_preferred عند التمهيد الوقت. ويمكن القيام بذلك باستخدام نص init. على سبيل المثال، لضبط وحدات المعالجة المركزية 0-1 لتشغيل عمليات وضع ASYNC في وضع SYNC، وتشغيل وحدات المعالجة المركزية 2-3 في وضع ASYMM، يمكن إضافة ما يلي إلى عبارة init الخاصة بالنص init للمورد:

  write /sys/devices/system/cpu/cpu0/mte_tcf_preferred sync
  write /sys/devices/system/cpu/cpu1/mte_tcf_preferred sync
  write /sys/devices/system/cpu/cpu2/mte_tcf_preferred asymm
  write /sys/devices/system/cpu/cpu3/mte_tcf_preferred asymm

ستحتوي ملفات Tombstone من عمليات وضع ASYNC التي يتم تشغيلها في وضع SYNC على تتبُّع تسلسل استدعاء الدوال البرمجية بدقة لموقع خطأ الذاكرة. ومع ذلك، لن تضمين تخصيص أو تتبع تسلسل استدعاء الدوال البرمجية. لا تتبع عمليات تتبع تسلسل استدعاء الدوال البرمجية سوى متاحة إذا تمت تهيئة العملية للعمل في وضع المزامنة.

int mallopt(M_THREAD_DISABLE_MEM_INIT, level)

حيث تكون قيمة level تساوي 0 أو 1.
إيقاف تهيئة الذاكرة في إعداد المعاملات، وتجنُّب تغيير علامات الذاكرة ما لم يكن ذلك ضروريًا للتأكد من الصحة.

int mallopt(M_MEMTAG_TUNING, level)

حيث level:

  • M_MEMTAG_TUNING_BUFFER_OVERFLOW
  • M_MEMTAG_TUNING_UAF

اختيار استراتيجية تخصيص العلامة

  • الإعداد التلقائي هو M_MEMTAG_TUNING_BUFFER_OVERFLOW.
  • M_MEMTAG_TUNING_BUFFER_OVERFLOW - يمكّن السمة الحتمية اكتشاف فائض المخزن المؤقت الخطي والأخطاء ذات التدفق الداخلي من خلال تعيين علامة مميزة للتوزيعات المجاورة. هذا الوضع لديه فرصة منخفضة قليلاً اكتشاف أخطاء الاستخدام بعد الفترة المجانية لأن نصف قيم العلامات المحتملة هي فقط لكل موقع جغرافي في الذاكرة. يُرجى الوضع في الاعتبار أن إضافة وضع علامات الذاكرة (MTE) لا يمكنها اكتشاف تجاوز حجم حبيبات العلامة نفسها (مقطع متوافق مع 16 بايت)، ويمكن أن يفوته حجم صغير ويتجاوز حتى في هذا الوضع. لا يمكن أن يكون هذا التجاوز هو سبب الذاكرة حيث لا يتم استخدام الذاكرة الموجودة داخل حبيبات واحدة أبدًا لتكرارات الحصص.
  • M_MEMTAG_TUNING_UAF - لتفعيل العلامات العشوائية بشكل مستقل لاحتمالية موحدة حوالى 93% لاكتشاف كل من الاحتمالية المكانية (تجاوز سعة المخزن المؤقت) الأخطاء المؤقتة (الاستخدام بعد الفترة المجانية).

بالإضافة إلى واجهات برمجة التطبيقات الموضحة أعلاه، قد يرغب المستخدمون ذوو الخبرة في على دراية بما يلي:

  • يمكن أن يؤدي ضبط سجلّ أجهزة PSTATE.TCO مؤقتًا إيقاف عمليات التحقّق من العلامات (مثال). على سبيل المثال، عند نسخ نطاق من الذاكرة يتضمّن محتوى علامة غير معروف، ومعالجة المؤثِّرات السلبية في الأداء في مرحلة متكررة.
  • عند استخدام M_HEAP_TAGGING_LEVEL_SYNC، يعمل معالج أعطال النظام يوفر معلومات إضافية مثل عمليات تتبُّع تسلسل استدعاء الدوال البرمجية والتخصيص. تتطلب هذه الوظيفة الوصول إلى وحدات بت العلامة ويتم تفعيلها من خلال تمرير SA_EXPOSE_TAGBITS عند تعيين معالِج الإشارة. أي برنامج يميّز إشارته الخاصة يفوض أحد الأعطال غير المعروفة إلى النظام الأول ويفوضه بتنفيذ نفسه.

إضافة وضع علامات الذاكرة (MTE) في النواة (النواة)

لتفعيل KASAN المسرّع بتقنية MTE للنواة، يمكنك تهيئة النواة باستخدام CONFIG_KASAN=y، CONFIG_KASAN_HW_TAGS=y. هذه الإعدادات يتم تفعيلها تلقائيًا على نواة GKI، بدءًا من Android 12-5.10.
يمكن التحكم في ذلك في وقت التشغيل باستخدام وسيطات سطر الأوامر التالية:

  • kasan=[on|off] - تفعيل KASAN أو إيقافه (الإعداد التلقائي: on)
  • kasan.mode=[sync|async] - الاختيار بين الوضع المتزامن وغير المتزامن (الإعداد التلقائي: sync)
  • kasan.stacktrace=[on|off] - ما إذا كان سيتم جمعها عمليات تتبُّع تسلسل استدعاء الدوال البرمجية (القيمة التلقائية: on)
    • تتطلب عملية جمع بيانات تتبُّع تسلسل استدعاء الدوال البرمجية أيضًا stack_depot_disable=off
  • kasan.fault=[report|panic] - ما إذا كنت تريد طباعة التقرير فقط أو القلق بشأن النواة (القيمة التلقائية: report). بغض النظر عن ذلك يتم إيقاف التحقق من العلامات بعد أول خطأ تم الإبلاغ عنه.

ننصح بشدة باستخدام وضع "المزامنة" أثناء عملية الطرح والتطوير اختبار الفرضية. يجب تفعيل هذا الخيار بشكل عام لجميع العمليات التي تستخدم متغيّر البيئة أو من خلال نظام الإصدار. في هذا الوضع، يتم اكتشاف الأخطاء. في وقت مبكر من عملية التطوير، تستقر قاعدة التعليمات البرمجية بشكل أسرع تكلفة اكتشاف الأخطاء لاحقًا في الإنتاج.

ننصح بشدة باستخدام وضع ASYNC في الإنتاج. يوفر هذا انخفاض لرصد وجود أخطاء متعلقة بأمان الذاكرة في إحدى العمليات بالإضافة إلى مزيد من الدفاع العميق. وعند اكتشاف أي خطأ، يمكن لمطوّر البرامج الاستفادة من واجهات برمجة التطبيقات لوقت التشغيل للتبديل إلى وضع "المزامنة" والحصول على تتبُّع دقيق لتسلسل استدعاء الدوال البرمجية من مجموعة مأخوذة من عينة من المستخدمين.

ننصحك بشدة بضبط مستوى MTE المفضّل الخاص بوحدة المعالجة المركزية (CPU) من أجل المنظومة على الرقاقة (SoC). يتميز وضع Asymm عادةً بنفس خصائص الأداء مثل ASYNC، وغالبًا ما يُفضّل ذلك غالبًا ما تُظهر النوى الصغيرة المرتبة متشابهة الأداء في جميع الأوضاع الثلاثة، ويمكن تهيئتها لتفضيل "المزامنة".

على المطوّرين التأكّد من توفُّر الأعطال من خلال التحقّق /data/tombstones, logcat أو من خلال متابعة المورّد DropboxManager لأخطاء المستخدم النهائي. لمزيد من المعلومات حول تصحيح أخطاء الرمز الأصلي في Android، يُرجى الاطّلاع على المعلومات الواردة هنا.

مكونات النظام الأساسي التي تستخدم ميزة MTE

في Android 12، يستخدم عدد من مكوّنات النظام المهمة الأمنية MTE ASYNC للكشف عن أعطال المستخدم والعمل كطبقة إضافية من الدفاع العميق. هذه المكوّنات هي:

  • البرامج الخفيّة للشبكات والأدوات المساعدة (باستثناء netd)
  • البلوتوث وSecureElement وNFC HALs وتطبيقات النظام
  • برنامج خفي "statsd"
  • system_server
  • zygote64 (للسماح للتطبيقات بتفعيل استخدام ميزة MTE)

تم اختيار هذه الاستهدافات استنادًا إلى المعايير التالية:

  • عملية تتمتع بامتيازات خاصة (تُعرَّف بأنها عملية لديها حق الوصول إلى شيء ما الذي لا يستخدمه نطاق unprivileged_app SELinux)
  • معالجة الإدخال غير الموثوق به (القاعدة من اثنتين)
  • بطء الأداء المقبول (التباطؤ لا يؤدي إلى ظهور المستخدم وقت الاستجابة)

ننصح المورّدين بتفعيل ميزة MTE في إنتاج المزيد من المكوّنات. باتباع المعايير المذكورة أعلاه. أثناء التطوير، ننصحك بإجراء اختبار هذه المكونات باستخدام وضع المزامنة، لاكتشاف الأخطاء التي يمكن إصلاحها بسهولة، وتقييم تأثير ASYNC على أدائها.
يخطط Android في المستقبل لتوسيع قائمة مكونات النظام التي تتضمّن ميزة MTE، قيد التمكين، مع اتباع خصائص الأداء لتصميمات الأجهزة القادمة.