ShadowCallStack

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

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

יישום

אנדרואיד תומך ב-ShadowCallStack הן עבור הליבה והן עבור מרחב המשתמש.

הפעלת SCS עבור הליבה

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

CONFIG_SHADOW_CALL_STACK=y

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

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

sanitize: {
  scs: true
}

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

מַתַן תוֹקֵף

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