שלמות זרימת בקרת ליבה

שלמות זרימת בקרה (CFI) היא מנגנון אבטחה שמונע שינויים בגרף זרימת הבקרה המקורי של קובץ בינארי מהידור, מה שמקשה משמעותית על ביצוע התקפות כאלה.

באנדרואיד 9 אפשרנו את הטמעת ה-CFI של LLVM ברכיבים נוספים וגם בקרנל. מערכת CFI מופעל כברירת מחדל, אך עליך להפעיל CFI של ליבה.

ה-CFI של LLVM דורש קומפילציה עם אופטימיזציה של זמן קישור (LTO) . LTO משמר את ייצוג ה-bitcode LLVM של קבצי אובייקט עד לזמן הקישור, מה שמאפשר למהדר לנמק טוב יותר לגבי האופטימיזציות שניתן לבצע. הפעלת LTO מקטינה את גודל הבינארי הסופי ומשפרת את הביצועים, אך מגדילה את זמן ההידור. בבדיקות באנדרואיד, השילוב של LTO ו-CFI מביא לתקורה זניחה לגודל הקוד ולביצועים; בכמה מקרים שניהם השתפרו.

לפרטים טכניים נוספים על CFI וכיצד מטפלים בבדיקות שליטה קדימה אחרות, עיין בתיעוד התכנון של LLVM .

יישום

תיקוני kCFI נמצאים בכל גרסאות ליבת אנדרואיד הנתמכות. האפשרות CONFIG_CFI_CLANG מאפשרת kCFI ומוגדרת כברירת מחדל ב-GKI.

פתרון תקלות

לאחר ההפעלה, עבדו על כל שגיאות אי התאמה מסוגים שעשויות להתקיים עם מנהלי ההתקן שלהם. קריאת פונקציה עקיפה דרך מצביע פונקציה לא תואם מפעילה את ה-CFI. כאשר מזוהה כשל CFI, הליבה מדפיסה אזהרה הכוללת גם את הפונקציה שנקראה וגם את ה-stacktrace שהוביל לכשל. תקן זאת על ידי הבטחת מצביעי הפונקציה תמיד באותו סוג כמו הפונקציה שנקראת.

כדי לסייע באיתור שגיאות ב-CFI, הפעל CONFIG_CFI_PERMISSIVE , שמדפיס אזהרה במקום לגרום לבהלת ליבה. אסור להשתמש במצב מתיר בייצור.

מַתַן תוֹקֵף

נכון לעכשיו, אין מבחן CTS במיוחד עבור CFI. במקום זאת, ודא שבדיקות CTS עוברות עם או בלי CFI מופעל כדי לוודא ש-CFI לא משפיע על המכשיר.