از 27 مارس 2025، توصیه می کنیم از android-latest-release
به جای aosp-main
برای ساختن و کمک به AOSP استفاده کنید. برای اطلاعات بیشتر، به تغییرات AOSP مراجعه کنید.
یکپارچگی جریان کنترل هسته
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
یکپارچگی جریان کنترل (CFI) یک مکانیسم امنیتی است که تغییرات در نمودار جریان کنترل اصلی یک باینری کامپایل شده را مجاز نمیداند و انجام چنین حملاتی را بهطور قابل توجهی سختتر میکند.
در اندروید 9، پیاده سازی CFI توسط LLVM را در اجزای بیشتر و همچنین در هسته فعال کردیم. سیستم CFI به طور پیش فرض روشن است، اما باید CFI هسته را فعال کنید.
CFI LLVM نیاز به کامپایل با بهینه سازی زمان لینک (LTO) دارد. LTO نمایش بیتکد LLVM فایلهای شی را تا زمان پیوند حفظ میکند، که به کامپایلر اجازه میدهد تا در مورد بهینهسازیهایی که میتوان انجام داد، استدلال بهتری داشته باشد. فعال کردن LTO اندازه باینری نهایی را کاهش می دهد و عملکرد را بهبود می بخشد، اما زمان کامپایل را افزایش می دهد. در آزمایش روی اندروید، ترکیب LTO و CFI منجر به سربار ناچیزی نسبت به اندازه و عملکرد کد می شود. در چند مورد هر دو بهبود یافتند.
برای جزئیات فنی بیشتر در مورد CFI و نحوه رسیدگی به سایر بررسیهای کنترل جلو، به مستندات طراحی LLVM مراجعه کنید.
پیاده سازی
وصلههای kCFI در تمام نسخههای هسته اندروید پشتیبانی میشوند. گزینه CONFIG_CFI_CLANG
kCFI را فعال می کند و به طور پیش فرض در GKI تنظیم شده است.
عیب یابی
پس از فعال کردن، هر نوع خطای عدم تطابق را که ممکن است با درایورهای آنها وجود داشته باشد، بررسی کنید. یک فراخوانی غیرمستقیم تابع از طریق یک نشانگر تابع ناسازگار، CFI را خاموش می کند. هنگامی که یک خرابی CFI شناسایی می شود، هسته یک هشدار چاپ می کند که هم تابعی را که فراخوانی شده و هم stacktrace را که منجر به شکست شده است، چاپ می کند. با اطمینان از اینکه نشانگرهای تابع همیشه از نوع تابعی هستند که فراخوانی می شود، این را تصحیح کنید.
برای کمک به اشکالزدایی خرابیهای CFI، CONFIG_CFI_PERMISSIVE
را فعال کنید، که به جای ایجاد وحشت در هسته، یک هشدار چاپ میکند. حالت مجاز نباید در تولید استفاده شود.
اعتبار سنجی
در حال حاضر، هیچ آزمایش CTS به طور خاص برای CFI وجود ندارد. درعوض، مطمئن شوید که تستهای CTS با و بدون فعال بودن CFI انجام میشوند تا تأیید شود که CFI روی دستگاه تأثیر نمیگذارد.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","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-29 بهوقت ساعت هماهنگ جهانی."],[],[],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."]]