ShadowCallStack

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

ב-aarch64, האינסטרומנטציה משתמשת ב-x18 להירשם כהפניה ל-shadowCallStack, כלומר שמפנה ל-shadowCallStack לא צריך להיות מאוחסנים בזיכרון. כך אפשר להטמיע סביבת זמן ריצה שתמנע חשיפה את הכתובת של ShadowCallStack לתוקפים שיכולים לקרוא זיכרון שרירותי.

הטמעה

מערכת Android תומכת ב-ShdowCallStack גם בליבה (kernel) וגם במרחב משתמשים.

הפעלת SCS לליבה (kernel)

כדי להפעיל את ShadowCallStack עבור הליבה, צריך להוסיף את השורה הבאה אל קובץ תצורת ליבה (kernel):

CONFIG_SHADOW_CALL_STACK=y

הפעלת SCS במרחב משתמשים

כדי להפעיל את ShadowCallStack ברכיבים של מרחב המשתמשים, צריך להוסיף את הפקודה את השורות הבאות לקובץ התוכנית של הרכיב:

sanitize: {
  scs: true
}

SCS מניח שהרישום x18 שמור לאחסון הכתובת של ShadowCallStack, ולא משמש לכל מטרה אחרת. למרות שכל המערכות מורכבת כמה ספריות כדי לשמור את הרישום של x18, בעייתית אם SCS מופעל לרכיבי מרחב משתמשים שפועלים באופן הדדי עם קוד מדור קודם שנמצא בתהליך עיבוד (לדוגמה, ספריות שצד שלישי יכול לטעון ), שעלולים לעכב את הרישום x18. לכן, מומלץ הפעלת SCS ברכיבים עצמאיים שלא ייטענו לגרסאות קודמות בינאריים.

אימות

אין בדיקת CTS ספציפית ל-SCS. במקום זאת, יש לוודא שבדיקות CTS עם ובלי SCS מופעל כדי לאמת ש-SCS לא משפיע על במכשיר.