اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release
بدلاً من aosp-main
لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
سلامة تدفّق التحكّم في النواة
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
سلامة تدفق التحكّم (CFI) هي آلية أمان لا تسمح بإجراء تغييرات على
الرسم البياني الأصلي لتدفق التحكّم في ملف ثنائي مُجمَّع، ما يجعل من الصعب بشكلٍ كبير
تنفيذ هذه الهجمات.
في Android 9، فعّلنا ميزة "التحقّق من سلامة الرمز البرمجي" (CFI) من LLVM في المزيد من المكوّنات
وأيضاً في النواة. يكون نظام CFI مفعّلاً بشكلٍ
تلقائي، ولكن عليك تفعيل CFI في kernel.
تتطلّب تقنية CFI في LLVM إجراء عملية الترجمة باستخدام ميزة التحسين في وقت الربط
(LTO). تحافظ تقنية LTO على تمثيل LLVM لرمز البتات في ملفات العناصر إلى وقت الربط، ما يسمح للمجمِّع بتحديد التحسينات التي يمكن إجراؤها بشكل أفضل. يؤدي تفعيل LTO إلى تقليل حجم الملف الثنائي النهائي وتحسين
الأداء، ولكنّه يزيد من وقت الترجمة. في الاختبارات على Android، يؤدي الجمع بين LTO وCFI إلى زيادة طفيفة في حجم الرمز البرمجي وأدائه، وفي حالات محدودة، يؤدي الجمع بينهما إلى تحسين كلاهما.
لمزيد من التفاصيل الفنية حول CFI وكيفية التعامل مع عمليات التحقّق الأخرى من التحكّم في التنفيذ، يُرجى الاطّلاع على مستندات تصميم LLVM.
التنفيذ
تتوفّر تصحيحات kCFI في جميع إصدارات نواة Android المتوافقة. يُفعِّل الخيار CONFIG_CFI_CLANG
مقياس kCFI ويتم ضبطه تلقائيًا في GKI.
تحديد المشاكل وحلّها
بعد تفعيل هذه الميزة، عليك حلّ أي أخطاء عدم تطابق في النوع قد تظهر في
برامج التشغيل. يؤدي استدعاء دالة غير مباشر من خلال مؤشر دالة غير متوافق
إلى إيقاف ميزة CFI. عند رصد خطأ في CFI، يطبع kernel تحذيرًا يضمّ كلاً من الدالة التي تمّ استدعاؤها وتتبُّع تسلسل استدعاء الدوالّ الذي أدّى إلى الخطأ. يمكنك تصحيح ذلك من خلال التأكّد من أنّ مؤشرات الدوال لها دائمًا النوع نفسه
كالدالة التي يتمّ استدعاؤها.
للمساعدة في تصحيح أخطاء CFI، يمكنك تفعيل CONFIG_CFI_PERMISSIVE
،
الذي يطبع تحذيرًا بدلاً من التسبب في حدوث عطل في نظام التشغيل. يجب عدم استخدام "الوضع المرخّص"
في مرحلة الإنتاج.
التحقُّق
لا يتوفّر حاليًا اختبار CTS مخصّص لـ CFI. بدلاً من ذلك، تأكَّد من اجتياز
اختبارات CTS مع تفعيل CFI أو بدونه للتحقّق من أنّ CFI لا يؤثر في
الجهاز.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Kernel control flow integrity\n\n[Control flow\nintegrity](https://clang.llvm.org/docs/ControlFlowIntegrity.html) (CFI) is a security mechanism that disallows changes to the\noriginal control flow graph of a compiled binary, making it significantly harder\nto perform such attacks.\n\n\nIn Android 9, we enabled LLVM's implementation of CFI in more components and\nalso in the kernel. [System CFI](/docs/security/test/cfi) is on by\ndefault, but you need to enable kernel CFI.\n\n\nLLVM's CFI requires compiling with [Link-Time Optimization\n(LTO)](https://llvm.org/docs/LinkTimeOptimization.html). LTO preserves the LLVM bitcode representation of object files until\nlink-time, which allows the compiler to better reason about what optimizations\ncan be performed. Enabling LTO reduces the size of the final binary and improves\nperformance, but increases compile time. In testing on Android, the combination\nof LTO and CFI results in negligible overhead to code size and performance; in a\nfew cases both improved.\n\n\nFor more technical details about CFI and how other forward-control checks are\nhandled, see the [LLVM design\ndocumentation](https://clang.llvm.org/docs/ControlFlowIntegrityDesign.html).\n\nImplementation\n--------------\n\n\nThe kCFI patches are in all supported Android kernel versions. The `CONFIG_CFI_CLANG `\noption enables kCFI and is set by default in GKI.\n\n### Troubleshooting\n\n\nAfter enabling, work through any type mismatch errors that may exist with their\ndrivers. An indirect function call through an incompatible function pointer\ntrips CFI. When a CFI failure is detected, the kernel prints out a warning that\nincludes both the function that was called and the stacktrace that led to the\nfailure. Correct this by ensuring function pointers always have the same type as\nthe function that's called.\n\n\nTo assist in debugging CFI failures, enable `CONFIG_CFI_PERMISSIVE`,\nwhich prints out a warning instead of causing a kernel panic. Permissive mode\nmust not be used in production.\n\nValidation\n----------\n\n\nCurrently, there are no CTS test specifically for CFI. Instead, make sure that\nCTS tests pass with and without CFI enabled to verify that CFI isn't impacting\nthe device."]]