Chrome Chronicle מס' 9: ClusterFuzz

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

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

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

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

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

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 Testing ב-Chromium: איך מוסיפים fuzzers חדשים ל- ClusterFuzz לפורמטים חדשים של נתונים, או רק בגלל שאתם רוצים לקבל קרדיט למצוא ערשים מדהימים.
  • עדכון והדרכה ל-Chrome Fuzzer Program: גם Fzzers שנכתבו על ידי תורמי תוכן חיצוניים. אפשר לספר על החוויה שלהם וכמה הם פשוטים יכולה להיות להתחיל בעבודה.