يتم وضع علامة تلقائيًا على أقسام الرمز القابلة للتنفيذ للبرامج الثنائية لنظام AArch64. التنفيذ فقط (غير قابل للقراءة) كتخفيف التشديد مقابل التعليمات البرمجية في الوقت المناسب وإعادة استخدام الهجمات. التعليمة البرمجية التي تمزج بين البيانات والتعليمات البرمجية معًا وإجراء التعليمات البرمجية عن قصد يفحص هذه الأقسام (بدون إعادة تخصيص أجزاء الذاكرة أولاً كقابلة للقراءة) لم تعد تعمل. التطبيقات التي تتضمّن 10 حزمة تطوير برامج (SDK) مستهدَفة (المستوى 29 من واجهة برمجة التطبيقات أو المستويات الأعلى) تتأثر إذا حاول التطبيق قراءة أقسام الرمز البرمجي مكتبات النظام التي تم تفعيل ميزة "التنفيذ فقط" فيها (XOM) في الذاكرة بدون أولاً وضع علامة على القسم كقابل للقراءة.
وللاستفادة بشكل كامل من إجراءات التخفيف هذه، يتم توفير كل من دعم الأجهزة والنواة مطلوبة. وبدون هذا الدعم، قد يتم تنفيذ التخفيف جزئيًا فقط. تشير رسالة الأشكال البيانية تحتوي النواة الشائعة في Android 4.9 على التصحيحات المناسبة لتقديم رموز برمجية كاملة وتتم إتاحة ذلك على الأجهزة التي تتضمّن معالجات ARMv8.2.
التنفيذ
تفترض برامج AArch64 التي تم إنشاؤها بواسطة برنامج التجميع أن التعليمات البرمجية والبيانات ليست مختلط. لا يؤثر تفعيل هذه الميزة سلبًا على أداء الجهاز.
بالنسبة إلى الرمز البرمجي الذي يتطلّب مراجعة متعمّدة للذاكرة
القابلة للتنفيذ، يستحسن استدعاء mprotect
على
أجزاء من التعليمات البرمجية تتطلب الفحص للسماح بقراءتها، ثم
وإزالة الوضوح عند اكتمال الفحص.
تؤدّي عملية التنفيذ هذه إلى تلقّي قراءات في أجزاء الذاكرة التي تم وضع علامة عليها بأنّها
تنفيذه فقط ليؤدي إلى خطأ في التصنيف (SEGFAULT
).
قد يحدث هذا نتيجة لخطأ أو ثغرة أو بيانات مختلطة
(التجميع الحرفي)، أو التأمل الداخلي.
دعم الجهاز وتأثيره
الأجهزة المزودة بأجهزة سابقة أو بنواات قديمة (أقل من 4.9) بدون
قد لا تدعم التصحيحات المطلوبة هذه الميزة أو تستفيد منها بشكل كامل. الأجهزة
بدون دعم النواة، إلى عدم فرض وصول المستخدم إلى ذاكرة التنفيذ فقط،
ولكن رمز النواة (النواة) الذي يتحقّق صراحةً مما إذا كانت الصفحة قابلة للقراءة أم لا
فرض هذه السمة، مثل process_vm_readv()
.
يجب ضبط علامة النواة CONFIG_ARM64_UAO
في النواة على
التأكد من أن النواة تراعي صفحات أرض المستخدم التي تم وضع علامة "للتنفيذ فقط" عليها. الإصدار السابق من ARMv8
أو الأجهزة التي تتضمّن معالجات ARMv8.2 التي تم إيقاف إعداد "تجاوز وصول المستخدم" (UAO) فيها
يستفيدون بشكل كامل من هذه الميزة وقد يظلون قادرين على قراءة صفحات التنفيذ فقط باستخدام
وsyscalls.
إعادة بناء التعليمات البرمجية الحالية
قد يحتوي التعليمة البرمجية التي تم نقلها من AArch32 على بيانات مختلطة
التعليمات البرمجية، مما يتسبب في ظهور مشكلات. في كثير من الحالات، يكون إصلاح هذه المشكلات بسيطًا
مثل نقل الثوابت إلى قسم .data
في ملف التجميع.
قد تحتاج إلى إعادة ضبط طريقة التركيب المكتوبة بخط اليد لتكون مجمّعة محليًا. والثوابت.
أمثلة:
من المفترض ألا تحتوي البرامج الثنائية التي تم إنشاؤها بواسطة برنامج التحويل البرمجي Clang على أي مشكلات مع البيانات اختلاط الرموز البرمجية. إذا كان الرمز الذي تم إنشاؤه لمجموعة المحول البرمجي GNU (GCC) (من مكتبة ثابتة)، افحص البرنامج الثنائي للمخرجات ضمان عدم تجميع الثوابت في أقسام الرمز البرمجي.
إذا كانت عملية التدقيق الداخلي في التعليمات البرمجية ضرورية في أقسام
التعليمات البرمجية القابلة للتنفيذ،
بـ mprotect
لأول مرة لوضع علامة على الرمز ليكون قابلاً للقراءة. ثم بعد العملية
مكتملة، يُرجى الاتصال بخدمة mprotect
مرة أخرى لوضع علامة "غير مقروءة" عليها.
تفعيل XOM
يتم تفعيل التنفيذ فقط تلقائيًا لجميع البرامج الثنائية 64 بت في الإصدار. .
إيقاف XOM
يمكنك إيقاف التنفيذ فقط على مستوى الوحدة، أو من خلال شجرة دليل فرعي بالكامل، أو عالميًا لبناء كامل.
يمكن إيقاف XOM للوحدات الفردية التي لا يمكن إعادة ضبط إعداداتها أو التي تحتاج إلى قراءة
رمز تنفيذي، من خلال ضبط LOCAL_XOM
وxom
إلى false
.
// Android.mk LOCAL_XOM := false // Android.bp cc_binary { // or other module types ... xom: false, }
في حال إيقاف ذاكرة التنفيذ فقط في مكتبة ثابتة، ينطبق نظام التصميم.
على جميع الوحدات التابعة لتلك المكتبة الثابتة. يمكنك إلغاء
باستخدام xom: true,
.
لإيقاف ذاكرة التنفيذ فقط في دليل فرعي معيّن (على سبيل المثال،
foo/bar/)، اضبط القيمة على XOM_EXCLUDE_PATHS
.
make -j XOM_EXCLUDE_PATHS=foo/bar
ويمكنك بدلاً من ذلك ضبط السمة PRODUCT_XOM_EXCLUDE_PATHS
.
المتغير في تهيئة المنتج.
يمكنك إيقاف البرامج الثنائية التنفيذ فقط بشكل عام من خلال التمرير.
ENABLE_XOM=false
إلى الأمر make
.
make -j ENABLE_XOM=false
التحقُّق
لا تتوفّر CTS أو اختبارات التحقّق للتنفيذ فقط.
الذاكرة. يمكنك إثبات ملكية البرامج الثنائية يدويًا باستخدام readelf
والتحقّق
علامات الشريحة.