למה צריך "מבודד ממקורות שונים" כדי להשתמש בתכונות מתקדמות

כדאי להבין למה צריך בידוד ממקורות שונים כדי להשתמש בתכונות מתקדמות כמו SharedArrayBuffer, performance.measureUserAgentSpecificMemory() וטיימר ברזולוציה גבוהה בצורה מדויקת יותר.

מבוא

בהפיכת האתר ל"מבודד ממקורות שונים" באמצעות COOP COEP הסברנו איך לאמץ 'ריבוי מקורות' מבודד" באמצעות COOP ו-COEP. זהו מאמר נלווה שמסביר למה נדרש בידוד ממקורות שונים כדי להפעיל תכונות מתקדמות בדפדפן.

רקע

האינטרנט מבוסס על אותו מקור [מדיניות]: תכונת אבטחה שמגבילה האופן שבו מסמכים וסקריפטים יכולים לקיים אינטראקציה עם משאבים ממקור אחר. הזה העיקרון מגביל את הדרכים שבהן אתרים יכולים לגשת למשאבים ממקורות שונים. עבור לדוגמה, אין גישה לנתונים ממסמך מ-https://a.example מתארח בכתובת https://b.example.

עם זאת, למדיניות המקור הזהה היו כמה חריגים היסטוריים. כל אתר יכול:

  • הטמעת iframes ממקורות שונים
  • הכללת משאבים ממקורות שונים, כמו תמונות או סקריפטים
  • פתיחת חלונות קופצים ממקורות שונים עם הפניה של DOM

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

תופעות הלוואי של האבטחה של מדיניות מקור זהה כזו תוקנו בשני שלבים דרכים שונות. דרך אחת הייתה השקה של פרוטוקול חדש בשם Cross-cross שיתוף משאבי מקור (CORS) שמטרתו לוודא שהשרת מאפשר שיתוף משאב עם מקור נתון. הדרך השנייה היא הסרה מרומזת של הגישה הישירה לסקריפט של משאבים ממקורות שונים תוך שמירה על תאימות לאחור. כאלה משאבים ממקורות שונים נקראים "אטומים" המשאבים. לדוגמה, זו הסיבה לכך ביצוע מניפולציות על הפיקסלים של תמונה ממקורות שונים באמצעות CanvasRenderingContext2D ייכשל אלא אם CORS מוחל על התמונה.

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

קבוצת הקשר של עיון

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

כל זה השתנה עם Spectre, יוצר נתונים שנטענים לאותה קבוצת הקשר של גלישה שבה נמצא הקוד שלך עשוי להיות קריא. באמצעות מדידת הזמן של פעולות מסוימות, תוקפים יכול לנחש מה תוכן המטמון של המעבד (CPU), ובאמצעותו תוכן עיבוד זיכרון. מתקפות תזמון כאלה אפשריות באמצעות טיימרים בעלי רמת פירוט נמוכה שקיימים בפלטפורמה, אבל אפשר להאיץ אותם באמצעות טיימרים בצפיפות גבוהה, גם מפורש (כמו performance.now()) וגם מרומז (כמו SharedArrayBuffer שניות). אם ב-evil.com מוטמעים תמונה ממקורות שונים, הם יכולים להשתמש מתקפת ספקטר לקריאת נתוני הפיקסלים שלה, ולכן ההגנות מסתמכות על 'אטימוּת' לא יעילה.

ספקטר

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

במצב מבודד ממקורות שונים, האתר ששולח את הבקשה נחשב פחות מסוכן, וכתוצאה מכך הגישה לתכונות מתקדמות כמו SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ורזולוציה גבוהה טיימרים מדויקים יותר, יכול לשמש להתקפות 'ספקטר'. היא גם מונעת שינויים document.domain

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

כלי הטמעה ממקורות שונים מדיניות (COEP) מונעת מטעינת משאבים ממקורות שונים שלא מעניקים באופן מפורש את הרשאת המסמך (באמצעות CORP או CORS). בעזרת התכונה הזו, תוכלו להצהיר שמסמך לא יכול לטעון משאבים כאלה.

איך COEP עובד

כדי להפעיל את המדיניות הזו, צריך לצרף למסמך את כותרת ה-HTTP הבאה:

Cross-Origin-Embedder-Policy: require-corp

מילת המפתח require-corp היא הערך הקביל היחיד בשביל COEP. כך אוכף מדיניות שלפיה המסמך יכול לטעון משאבים רק מאותו המקור, או משאבים שסומנו במפורש כניתנים לטעינה ממקור אחר.

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

שיתוף משאבים בין מקורות

אם משאב בין מקורות תומך בשיתוף משאבים בין מקורות (CORS), תוכלו להשתמש crossorigin מאפיין כדי לטעון אותו לדף האינטרנט שלך מבלי להיחסם על ידי COEP.

<img src="https://third-party.example.com/image.jpg" crossorigin>

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

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

המדיניות בנושא משאבים בין מקורות

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

הכותרת Cross-Origin-Resource-Policy מקבלת שלושה ערכים אפשריים:

Cross-Origin-Resource-Policy: same-site

אפשר לטעון משאבים שמסומנים כ-same-site רק מאותו אתר.

Cross-Origin-Resource-Policy: same-origin

אפשר לטעון משאבים שמסומנים כ-same-origin רק מאותו המקור.

Cross-Origin-Resource-Policy: cross-origin

כל אתר יכול לטעון משאבים שמסומנים כ-cross-origin. (זה נוסף אל value המפרט של CORP יחד עם COEP).

מדיניות פתיחה בין מקורות

מדיניות בנושא פותחן ממקורות שונים (COOP) מאפשר לכם לוודא שחלון ברמה עליונה מבודד ממסמכים אחרים על ידי הצבתם לקבוצת הקשר שונה של גלישה, כך שהם לא יכולים לקיים אינטראקציה ישירה עם החלון ברמה העליונה. לדוגמה, אם מסמך עם COOP נפתח בחלון קופץ, הנכס window.opener יהיה null. בנוסף, המאפיין .closed של ההפניה של ה-Opener תחזיר את הערך true.

COOP

הכותרת Cross-Origin-Opener-Policy מקבלת שלושה ערכים אפשריים:

Cross-Origin-Opener-Policy: same-origin

מסמכים שמסומנים בתווית same-origin יכולים לשתף את אותו הקשר גלישה קבוצה של מסמכים מאותו מקור שמסומנים במפורש same-origin.

COOP

Cross-Origin-Opener-Policy: same-origin-allow-popups

במסמך ברמה עליונה עם same-origin-allow-popups נשמרים הפניות לכל של החלונות הקופצים שלא מגדירים COOP או שמבטלים את ההסכמה לבידוד הגדרת COOP של unsafe-none.

COOP

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none הוא ברירת המחדל והוא מאפשר להוסיף את המסמך לקובץ הפתיחה שלו של קבוצת ההקשר של הגלישה, אלא אם לפותחן עצמו יש COOP של same-origin.

סיכום

כדי לקבל גישה מובטחת לתכונות מתקדמות כמו SharedArrayBuffer, performance.measureUserAgentSpecificMemory() או רזולוציה גבוהה טיימרים בדיוק טוב יותר, אבל חשוב לזכור שהמסמך צריך להשתמש בו גם ב-COEP עם הערך require-corp וגם COOP עם הערך same-origin. בהיעדר אחד מהתנאים האלה, הדפדפן לא ניתן להבטיח בידוד הולם כדי לאפשר הפעלה בטוחה של התכונות רבות-העוצמה האלה. שלך יכול לקבוע את מצב הדף על ידי בדיקה אם self.crossOriginIsolated הפונקציה מחזירה true.

כדי ליישם את ההגדרה הזו, אפשר לעיין במאמר הגדרת האתר ל"ריבוי מקורות" מבודד" באמצעות COOP ו-COEP.

משאבים