החל מ-27 במרץ 2025, מומלץ להשתמש ב-android-latest-release
במקום ב-aosp-main
כדי ליצור תרומות ל-AOSP. מידע נוסף זמין במאמר שינויים ב-AOSP.
תקינות של זרימת הבקרה בליבה
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
שלמות של זרימת בקרה (CFI) היא מנגנון אבטחה שאוסר לבצע שינויים בתרשים המקורי של זרימת הבקרה של קובץ בינארי שעבר הידור, וכך מקשה מאוד לבצע התקפות כאלה.
ב-Android 9 הפעלנו את ההטמעה של CFI ב-LLVM ברכיבים נוספים וגם בליבה. System CFI מופעל כברירת מחדל, אבל צריך להפעיל את CFI של הליבה.
כדי להשתמש ב-CFI של LLVM, צריך לבצע הידור עם אופטימיזציה בזמן קישור (LTO). LTO שומר את ייצוג הביטקוד של LLVM בקובצי האובייקט עד לזמן הקישור, וכך מאפשר למהדר להבין טוב יותר אילו אופטימיזציות אפשר לבצע. הפעלת LTO מקטינה את הגודל של קובץ הבינארי הסופי ומשפרת את הביצועים, אבל מאריכה את זמן הידור הקוד. בבדיקות ב-Android, השילוב של LTO ו-CFI גורם לעומס יתר זניח על גודל הקוד ועל הביצועים. במקרים מסוימים, גם הגודל וגם הביצועים השתפרו.
פרטים טכניים נוספים על CFI ועל האופן שבו מטפלים בבדיקות אחרות של בקרה קדימה זמינים במסמכי התיעוד של LLVM.
הטמעה
התיקונים של kCFI נמצאים בכל הגרסאות הנתמכות של ליבה של Android. האפשרות CONFIG_CFI_CLANG
מפעילה את kCFI והיא מוגדרת כברירת מחדל ב-GKI.
פתרון בעיות
אחרי ההפעלה, עליכם לטפל בכל שגיאת אי-התאמה של סוגים שעשויה להיות במנהלי ההתקנים שלהם. קריאה עקיפה לפונקציה דרך מצביע פונקציה לא תואם מפעילה את CFI. כשזוהתה כשל ב-CFI, הליבה מדפיסה אזהרה שכוללת גם את הפונקציה שהוזמנה וגם את סטאק-טרייסינג שהוביל לכשל. כדי לתקן את הבעיה, צריך לוודא שקודי הפונקציות תמיד באותו סוג כמו הפונקציה שנקראת.
כדי לעזור בניפוי באגים של כשלים ב-CFI, מפעילים את CONFIG_CFI_PERMISSIVE
, שמציגה אזהרה במקום לגרום להתקף חרדה בליבה. אסור להשתמש במצב הרשאות רחבות בסביבת הייצור.
אימות
בשלב זה אין בדיקת CTS ספציפית ל-CFI. במקום זאת, צריך לוודא שבדיקות CTS עוברות גם עם CFI מופעל וגם בלי CFI מופעל, כדי לוודא ש-CFI לא משפיע על המכשיר.
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-27 (שעון UTC).
[[["התוכן קל להבנה","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 (שעון UTC)."],[],[],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."]]