חיטוי של גלישה שלמה

הצפת מספרים שלמים לא מכוונת יכולה לגרום לשחיתות זיכרון או פגיעויות בחשיפת מידע במשתנים הקשורים לגישה לזיכרון או להקצאות זיכרון. כדי להילחם בזה, הוספנו את ה- UndefinedBehaviorSanitizer (UBSan) של Clang עם חומרי ניקוי גלישה שלמים חתומים ולא חתומים כדי להקשיח את מסגרת המדיה באנדרואיד 7.0. באנדרואיד 9, הרחבנו את UBSan כדי לכסות רכיבים נוספים ושיפרנו את תמיכת מערכת הבנייה עבורו.

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

דוגמאות ומקור

Sanitization (IntSan) מסופק על ידי המהדר ומוסיף מכשור לבינארי במהלך זמן ההידור כדי לזהות הצפות אריתמטיות. הוא מופעל כברירת מחדל ברכיבים שונים ברחבי הפלטפורמה, למשל /platform/external/libnl/Android.bp .

יישום

IntSan משתמש בחומרי ניקוי הצפה במספרים שלמים חתומים ולא חתומים של UBSan. הפחתה זו מופעלת ברמת כל מודול. זה עוזר לשמור על רכיבים קריטיים של אנדרואיד מאובטחים ואין להשבית אותו.

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

תמיכה ב-IntSan ב-makefiles

כדי להפעיל IntSan בקובץ makefile, הוסף:

LOCAL_SANITIZE := integer_overflow
# Optional features
LOCAL_SANITIZE_DIAG := integer_overflow
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt
  • LOCAL_SANITIZE משתמשת ברשימה מופרדת בפסיקים של חומרי חיטוי, כאשר integer_overflow הוא קבוצה ארוזה מראש של אפשרויות עבור חומרי ניקוי הגלישה החתומים והלא חתומים בודדים עם רשימה שחורה של ברירת מחדל .
  • LOCAL_SANITIZE_DIAG מפעיל את מצב האבחון עבור חומרי החיטוי. השתמש במצב אבחון רק במהלך הבדיקה מכיוון שזה לא יבטל על הצפות, מה שפוסל לחלוטין את יתרון האבטחה של ההפחתה. ראה פתרון בעיות לפרטים נוספים.
  • LOCAL_SANITIZE_BLACKLIST מאפשר לך לציין קובץ רשימה שחורה כדי למנוע חיטוי של פונקציות וקובצי מקור. ראה פתרון בעיות לפרטים נוספים.

אם אתה רוצה שליטה פרטנית יותר, הפעל את חומרי החיטוי בנפרד באמצעות הדגל אחד או שניהם:

LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow
LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow

תמיכה ב-IntSan בקבצי שרטוט

כדי לאפשר חיטוי של גלישה שלמה בקובץ שרטוט, כגון /platform/external/libnl/Android.bp , הוסף:

   sanitize: {
      integer_overflow: true,
      diag: {
          integer_overflow: true,
      },
      blacklist: "modulename_blacklist.txt",
   },

בדומה לקובצי make, המאפיין integer_overflow הוא קבוצה ארוזה מראש של אפשרויות עבור חומרי ניקוי הצפה של מספרים שלמים בודדים חתומים ובלתי חתומים עם רשימה שחורה של ברירת מחדל .

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

מאפיין blacklist מאפשר מפרט של קובץ רשימה שחורה המאפשר למפתחים למנוע חיטוי פונקציות וקובצי מקור. ראה פתרון בעיות לפרטים נוספים.

כדי להפעיל את חומרי החיטוי בנפרד, השתמש ב:

   sanitize: {
      misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"],
      diag: {
          misc_undefined: ["signed-integer-overflow",
                           "unsigned-integer-overflow",],
      },
      blacklist: "modulename_blacklist.txt",
   },

פתרון תקלות

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

כדי למצוא, הפסקות שנגרמו על ידי חיטוי ב-builds של משתמשים, חפש קריסות SIGABRT עם הודעות ביטול המצביעות על הצפת יתר שנתפסה על ידי UBSan, כגון:

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/surfaceflinger <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: sub-overflow'

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

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

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:2188:32: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'size_t' (aka 'unsigned long')

לאחר איתור פעולת החשבון הבעייתית, ודא שהגלישה שפיר ומיועדת (לדוגמה, אין לה השלכות אבטחה). אתה יכול לטפל בהפסקת חומר החיטוי על ידי:

  • שחזור הקוד כדי להימנע מהצפת ( דוגמה )
  • הצפה במפורש באמצעות פונקציות ה -__builtin_*_ overflow של Clang ( דוגמה )
  • השבתת חיטוי בפונקציה על ידי ציון התכונה no_sanitize ( דוגמה )
  • השבתת חיטוי של פונקציה או קובץ מקור באמצעות קובץ רשימה שחורה ( דוגמה )

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

דפוסים נפוצים שעלולים לגרום להצפה שפירה כוללים:

  • העברות מרומזות שבהן מתרחשת הצפת ללא חתימה לפני ההעברה לסוג חתום ( דוגמה )
  • מחיקות רשימה מקושרת שמקטינה את אינדקס הלולאה בעת המחיקה ( דוגמה )
  • הקצאת סוג לא חתום ל-1 במקום לציין את הערך המקסימלי בפועל ( דוגמה )
  • לולאות שמפחיתות מספר שלם ללא סימן בתנאי ( דוגמה , דוגמה )

מומלץ למפתחים להבטיח שבמקרים שבהם חומר החיטוי מזהה הצפה שהוא אכן שפיר ללא תופעות לוואי או השלכות אבטחה לא רצויות לפני השבתת החיטוי.

השבתת IntSan

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

עיין בתיעוד Clang במעלה הזרם למידע נוסף על השבתת IntSan עם תכונות פונקציה ועיצוב קבצים ברשימה השחורה . יש להגדיר את הרשימה השחורה לחומר החיטוי המסוים על ידי שימוש בשמות סעיפים המציינים את חומר החיטוי היעד כדי למנוע השפעה על חומרי חיטוי אחרים.

מַתַן תוֹקֵף

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