חלוקה למחיצות (partitioning) באחסון

כדי למנוע סוגים מסוימים של מעקב באתרים שונים בערוצים צדדיים, ב-Chrome חולקו למחיצות (partitioning) רוב ממשקי ה-API של האחסון והתקשורת בהקשרים של צד שלישי.

סטטוס ההטמעה

התכונה הופעל לכל המשתמשים ב-Chrome מגרסה 115 ואילך. הצעה לחלוקה למחיצות (partitioning) באחסון פתוחה לדיון נוסף.

מהי חלוקה למחיצות (partitioning) באחסון?

כדי למנוע סוגים מסוימים של מעקב באתרים שונים בערוצים צדדיים, ב-Chrome מתבצעת חלוקה למחיצות (partitioning) של ממשקי ה-API של האחסון והתקשורת בהקשרים של צד שלישי.

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

בעבר, המפתחות של האחסון היו מבוססים רק על המקור. כלומר, אם iframe מ-example.com מוטמע ב-a.com וב-b.com, הוא יכול ללמוד על הרגלי הגלישה שלכם בשני האתרים האלה על ידי שמירת מזהה באחסון ואחזור מוצלח שלו מהאחסון. כשהחלוקה למחיצות (partitioning) באחסון של צד שלישי מופעלת, האחסון של example.com נמצא בשתי מחיצות שונות, אחת ל-a.com והשנייה ל-b.com.

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

לפני

תרשים של ממשקי API לאחסון ללא חלוקה למחיצות.
לפני חלוקת האחסון, example.com יכול לכתוב נתונים כשהם מוטמעים ב-a.com, ואז לקרוא אותם כשהם מוטמעים ב-b.com.

אחרי

תרשים של ממשקי API לאחסון עם חלוקה למחיצות.
אחרי חלוקת האחסון, לדומיין example.com, שמוטמע ב-b.com, אין גישה לאחסון של example.com כשהוא מוטמע ב-a.com.

חלוקת האחסון למחיצות במסגרות iframe מקושרות

כש-iframe מכיל iframe, העניין מתחיל להיות מורכב יותר. זה נכון במיוחד כשאותו מקור נמצא ביותר ממקום אחד בשרשרת.

לדוגמה, A1 מכיל iframe של B שמכיל iframe של A2, וגם A1 וגם A2 נמצאים באותו אתר. אם נתייחס רק להקשרים ברמה העליונה וברמה הנוכחית במהלך חלוקת המשנה, אפשר להתייחס ל-iframe‏ A2 כאל צד ראשון כי הוא נמצא באותו אתר שבו נמצא ה-iframe ברמה העליונה (A1), למרות ה-iframe של הצד השלישי (B) שמפריד ביניהם. אם ל-A2 תהיה גישה לאחסון ללא מחיצות כברירת מחדל, זה עלול לחשוף את A2 לסיכוני אבטחה כמו clickjacking.

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

אם אין שרשרת של הקשרים בין אתרים, האחסון לא מחולק למחיצות. לדוגמה, האתר A1 שמכיל iframe של A2 שמכיל iframe של A3 לא יתחלק ל-A1, ל-A2 או ל-A3 כי כולם נמצאים באותו אתר.

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

ממשקי API מעודכנים

אפשר לחלק את ממשקי ה-API שמושפעים מהחלוקה לקבוצות הבאות:

ממשקי API לאחסון

  • מערכת המכסות
    מערכת המכסות משמשת לקביעת נפח האחסון שיוקצה בדיסק. מערכת המכסות מנהלת כל מחיצה בתור קטגוריה נפרדת כדי לקבוע את נפח האחסון המותאם לכל מחיצה ומתי הוא ינוקה.
    ה-navigator.storage.estimate() מחזיר את המידע של המחיצה. ממשקי API ל-Chrome בלבד, כמו window.webkitStorageInfo ו-navigator.webkitTemporaryStorage, יוצאו משימוש.
    ב-
    IndexedDB וב-Cache storage נעשה שימוש במערכת המכסות החדשה המחולקת למחיצות.
  • Web Storage API
    Web Storage API מספק מנגנונים שבאמצעותם דפדפנים יכולים לאחסן צמדי מפתח/ערך. יש שני מנגנונים: אחסון מקומי ואחסון סשן. כרגע הן לא מנוהלות לפי מכסות, אבל עדיין מחולקות למחיצות.
  • Origin Private File System
    File System Access API מאפשר לאתר לקרוא או לשמור שינויים ישירות בקבצים ובתיקיות במכשיר אחרי שהמשתמש מעניק גישה. מערכת הקבצים הפרטית של המקור מאפשרת למקור לאחסן בדיסק תוכן פרטי שהמשתמש יכול לגשת אליו בקלות, והוא מחולק למחיצות.
  • Storage Bucket API
    ה-Storage Bucket API מפותח עבור Storage Standard, שמאגד ממשקי API שונים לאחסון, כמו IndexedDB ו-localStorage, באמצעות מושג חדש שנקרא קטגוריות (buckets). הנתונים שמאוחסנים בקטגוריות והמטא-נתונים שמשויכים לקטגוריות מחולקים למחיצות.
  • כותרת Clear-Site-Data
    הכללת הכותרת Clear-Site-Data בתגובה מאפשרת לשרת לבקש לנקות את הנתונים ששמורים בדפדפן של המשתמש. אפשר לנקות את המטמון, קובצי ה-cookie ואת האחסון של DOM. השימוש בכותרת מנקה רק את האחסון במחיצה אחת.
  • מאגר של כתובות URL של Blob
    blob הוא אובייקט שמכיל נתונים גולמיים לעיבוד, וניתן ליצור כתובת URL של blob כדי לגשת למשאב. מאגרים של כתובות URL מסוג Blob לא מחולקים למחיצות. כדי לתמוך בתרחיש לדוגמה של ניווט בהקשר ברמה העליונה לכל כתובת URL של blob (דיון), יכול להיות שמאגר כתובות ה-URL של ה-blob יתחלק לפי אשכול הסוכן במקום לפי האתר ברמה העליונה. התכונה הזו עדיין לא זמינה לבדיקה, וסביר להניח שמנגנון חלוקת המחיצות ישתנה בעתיד.

ממשקי API לתקשורת

בנוסף לממשקי API לאחסון, מתבצעת חלוקה למחיצות גם של ממשקי API לתקשורת שמאפשרים להקשר אחד לתקשר מעבר לגבולות המקור. השינויים משפיעים בעיקר על ממשקי API שמאפשרים לזהות הקשרים אחרים באמצעות שידור או מפגש באותו מקור (rendezvous).

בממשקי ה-API הבאים לתקשורת, תגי iframe של צד שלישי כבר לא יכולים לתקשר עם ההקשר של אותו מקור:

  • ערוץ שידור
    Broadcast Channel API מאפשר תקשורת בין הקשרי הגלישה (חלונות, כרטיסיות או iframe) לבין עובדים מאותו מקור.
    לא מוצע לשנות postMessage() מסוג iframe בין אתרים, שבו הקשר בין ההקשרים מוגדר בבירור.
  • SharedWorker
    SharedWorker API מספק עובד שאפשר לגשת אליו בהקשרים שונים של גלישה מאותו מקור.
  • נעילות אינטרנט
    Web Locks API מאפשר לקוד שפועל בכרטיסייה אחת או במכונה עובדת אחת באותו מקור לקבל נעילת משאב משותף בזמן ביצוע עבודה מסוימת.

Service Worker API

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

לכן, קובצי שירות (service workers) שנרשמו מהקשר של צד שלישי מחולקים למחיצות.

ממשקי API של תוספים

תוספים הם תוכנות שמאפשרות למשתמשים להתאים אישית את חוויית הגלישה שלהם.

אפשר להטמיע דפי תוספים (דפים עם סכימה chrome-extension://) באתרים שונים באינטרנט, ובמקרים כאלה תהיה להם גישה מתמשכת למחיצה ברמה העליונה. הדפים האלה יכולים גם לכלול הטמעה של אתרים אחרים. במקרה כזה, לאתרים האלה תהיה גישה למחיצה ברמה העליונה שלהם, כל עוד לתוסף יש הרשאות אירוח לאתר הזה.

מידע נוסף זמין במסמכי העזרה של התוספים.

הדגמה: בדיקת חלוקה למחיצות באחסון

אתר הדגמה: https://storage-partitioning-demo-site-a.glitch.me/

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

הדגמה כוללת שני אתרים: אתר א' ואתר ב'.

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

בשלב הזה, אפשר להשבית את חלוקת האחסון ב-Chrome באמצעות האפשרות בשורת הפקודה --disable-features=ThirdPartyStoragePartitioning.

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

יצירת מעורבות ושיתוף משוב