The Chromium Chronicle מס' 8: GWP-ASan: זיהוי באגים בטבע

פרק 8: מאת ולאד טירקלוביץ' בסיאטל, וושינגטון (נובמבר 2019)
פרקים קודמים

ניפוי באגים בשגיאות בטיחות זיכרון, כמו use-after-free או buffer overflows, יכול להיות קשה. כלים כמו addressSanitizer (ASan) עוזרים לזהות שגיאות זיכרון בבדיקות יחידה וב-fuzzers, אבל הרבה באגים מופיעים רק אחרי הפריסה למשתמשים שבהם התקורה של ASan גבוהה מאוד.

GWP-ASan הוא מזהה שגיאות זיכרון בערימה בלבד (heap-only) שמיועד לשימוש בטבע. הוא מזהה שגיאות use-after-free, buffer overflows/underflows, ו-Double frees. בניגוד ל-ASan, היא לא מזהה שגיאות בערימה או ב-globals.

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

בדומה ל-ASan, גם דוחות הקריסה של GWP-ASan כוללים נתוני הקצאה ומעקבי מקבץ של מיקומים שעוזרים לנפות באגים בבעיות זיכרון. נביט בדוגמה (crbug/956230) של חלק מהנתונים הנוספים שמוצגים בממשק המשתמש לקריסה:

המקור של השימוש ושל העסקה הוא PDFiumEngine::ExtendSelection(). המקור מראה במהירות שהבאג הוא שימוש באיטרטור std::vector שלא תקין.

GWP-ASan מופעל בערוץ היציב להקצאות שבוצעו באמצעות malloc/new ו-PartitionAlloc ב-Windows וב-macOS. מתבצעת תמיכה ב-Android. עד כה דווחו יותר מ-60 באגים ב-GWP-ASan, וכ-70% תוקנו. קריסות של GWP-ASan הן בעיות אבטחה אפשריות שאפשר לנצל, לכן כדאי לטפל בהן במהירות ולבקש העברה לאחור במקרה הצורך.