התאמת טיימרים להגבלות בידוד ממקורות שונים

לפני גרסה 91, רזולוציות הטיימר ב-Chrome היו מוגבלות ל-5 מיקרו-שניות במחשב, שבהן הופעל בידוד אתרים, ול-100 מיקרו-שניות ב-Android (ב-Android).

החל מגרסה 91, בעקבות שינוי במפרט, Chrome יגביל את הרזולוציה של טיימרים מפורשים (performance.now(), performance.timeOrigin וממשקי API אחרים מבוססי-ביצועים שחושפים את DOMHighResTimestamps) ל-100 מיקרו-שניות בכל הפלטפורמות. הפעלת בידוד בין מקורות מאפשרת לאתרים להוריד את ההגבלה ל-5 מיקרו-שניות, בלי קשר לפלטפורמה.

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

יש צורך לעשות משהו בקשר לזה?

סביר להניח שלא. performance.now() הוגבל לרזולוציות גסות יותר באופן משמעותי בדפדפנים אחרים (לדוגמה, אלפית שנייה = 0.001 שניות), כך שלא היה צריך להסתמך על הרזולוציה הנוכחית בכל מקרה.

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

מה הקשר בין הטיימרים לבידוד בין מקורות?

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

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

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

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

תמונת השער של Linda Perez Johannessen ב-UnFlood.