Chrome Chronicle מס' 9: ClusterFuzz

פרק 9: מאת אדריאן טיילור במאונטיין ויו (דצמבר 2019)
הפרקים הקודמים

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

תרשים זרימה הדרגתי

ClusterFuzz מעביר קלט ל-Chrome ומחפש קריסות. בחלק מגרסאות ה-build של Chrome מופעלות בדיקות נוספות, למשל AddressSanitizer, שמחפש שגיאות הקשורות לבטיחות הזיכרון.

ClusterFuzz מקצה רכיבים על סמך מיקום הקריסה ומקצה את מידת החומרה על סמך סוג הקריסה ואם היא התרחשה בתהליך שבארגז החול. לדוגמה, שגיאת ערימה (heap use-after-free) תהיה בחומרה גבוהה, אלא אם היא נמצאת בתהליך הדפדפן, ובמקרה כזה זה קריטי (אין ארגז חול להגביל את ההשפעה!):

class Foo {
  Widget* widget;
};

void Foo::Bar() {
  delete widget;
  ...
  widget->Activate();  // Bad in the renderer process, worse in the
                       // browser process. Obviously, real bugs are
                       // more subtle. Usually.

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

אפשר לעזור:

  • חשוב להקפיד על צורות חיים של אובייקטים וחריגות במספרים שלמים.
  • כדאי להוסיף fuzzers חדשים, במיוחד במהלך עיבוד נתונים לא מהימנים או IPC (ראו קישורים בהמשך, בדרך כלל פחות מ-20 שורות קוד).
  • תיקון באגים שדווחו ב-ClusterFuzz: אפשר לסמוך על ההיוריסטיקה ברמת החומרה כי הם מבוססים על יכולת ניצול בעולם האמיתי: גם גלישה בבייט יחיד הובילה לביצוע קוד שרירותי על ידי תוקף.

משאבים

  • בדיקת Fuzz ב-Chromium: כיצד להוסיף fuzzers חדשים ל-ClusterFuzz עבור פורמטים חדשים של נתונים, או רק כי אתם מחפשים את הקרדיט על מציאת Vuls מעולה.
  • Chrome Fuzzer Program Update ו-How to: Fuzzers נכתבים גם על ידי תורמי תוכן חיצוניים. תוכלו לשמוע על הניסיון שלהם וללמוד כמה קל להתחיל בעבודה.