הרגשה מוגנת/ספקטר

סקירה כללית

ב-3 בינואר, Project Zero חשף נקודות חולשה במעבדים מודרניים שבהן תהליך יכול להשתמש כדי לקרוא (במקרה הגרוע ביותר) זיכרון שרירותי – כולל זיכרון שלא שייך לתהליך הזה. נקודות החולשה האלה נקראות Spectre ו-Meltdown. מה אנחנו עושים ב-Chrome כדי לשמור על אבטחת האינטרנט, ומה מפתחי אתרים צריכים לעשות באתרים שלהם?

אמ;לק

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

מפתחי אתרים, הצוות של Chrome ממליץ:

  • אם אפשר, כדאי למנוע מקובצי cookie להיכנס לזיכרון של תהליך הרינדור באמצעות מאפייני קובצי ה-cookie SameSite ו-HTTPOnly, ולהימנע מקריאה מ-document.cookie.
  • כדי להפיק את המקסימום מחסימת קריאה בין מקורות (CORB) למשתמשים שהפעלתם אצלם את Site Isolation, חשוב לוודא שסוגי ה-MIME נכונים ולציין כותרת X-Content-Type-Options: nosniff לכל כתובות ה-URL עם תוכן רגיש או תוכן ספציפי למשתמש.
  • מפעילים את הבידוד של האתר ומדווחים לצוות Chrome אם הוא גורם לבעיות באתר.

אתם תוהים למה השלבים האלה עוזרים? כדאי להמשיך לקרוא.

הסיכון

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

גם Meltdown וגם Spectre עלולות לאפשר לתהליך לקרוא זיכרון שהוא לא אמור לקרוא. לפעמים, כמה מסמכים מאתרים שונים יכולים לשתף תהליך ב-Chrome. מצב כזה יכול לקרות כשדף אחד נפתח באמצעות הדף השני באמצעות window.open או <a href="..." target="_blank"> או באמצעות תגי iframe. אם אתר מכיל נתונים ספציפיים למשתמש, יש סיכוי שאתר אחר יוכל להשתמש בנקודות החולשה החדשות האלה כדי לקרוא את נתוני המשתמש האלה.

אמצעי מיטיגציה

צוות המהנדסים של Chrome ו-V8 פועל במספר דרכים כדי לצמצם את האיום הזה.

בידוד של אתרים

כדי לצמצם את ההשפעה של ניצול מוצלח של Spectre, אפשר למנוע מידע רגיש לשתף תהליך עם קוד שנמצא בשליטת תוקף. צוות Chrome עבד על תכונה שתעזור להשיג את המטרה הזו, שנקראת בידוד של אתרים:

עדיין לא הפעלנו את התכונה 'בידוד אתרים' כברירת מחדל כי יש כמה בעיות ידועות וצוות Chrome רוצה לבצע כמה שיותר בדיקות בשטח. אם אתם מפתחי אתרים, כדאי להפעיל את התכונה 'בידוד של אתר' ולבדוק אם האתר שלכם עדיין פועל. כדי להביע הסכמה עכשיו, מפעילים את האפשרות chrome://flags#enable-site-per-process. אם נתקלתם באתר שלא פועל, תוכלו לעזור לנו על ידי דיווח על באג ולציין שהפעלתם את Site Isolation.

חסימת מסמכים בין אתרים

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

אתר יכול לבקש משרת שני סוגים של נתונים: 'מסמכים' ו'משאבים'. במאמר הזה, 'מסמכים' הם קובצי HTML,‏ XML,‏ JSON וטקסט. אתר יכול לקבל מסמכים מהדומיין שלו או מדומיינים אחרים עם כותרות CORS מתירות. משאבים כוללים פריטים כמו תמונות, JavaScript, ‏ CSS וגופנים. אפשר לכלול משאבים מכל אתר.

מדיניות החסימה של מסמכים באתרים שונים מונעת מתהליך לקבל "מסמכים" ממקורות אחרים אם:

  1. יש להם סוג MIME מסוג HTML,‏ XML,‏ JSON או טקסט פשוט/רגיל, וגם
  2. יש להם כותרת תגובה מסוג X-Content-Type-Options: nosniff HTTP, או שניתוח תוכן מהיר (ניפוי) מאשר שהסוג נכון
  3. CORS לא מאפשר גישה למסמך באופן מפורש

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

לדוגמה: נניח תוקף יוצר תג <img> שכולל קובץ JSON עם מידע אישי רגיש, כמו <img src="https://yourbank.com/balance.json">. ללא Site Isolation, תוכן קובץ ה-JSON יגיע לזיכרון של תהליך ה-renderer, ובשלב הזה ה-renderer יזהה שזה לא פורמט תמונה תקין ולא יבצע עיבוד תמונה. עם זאת, בעזרת Spectre יש עכשיו אפשרות לקרוא את מקטע הזיכרון הזה. חסימה של מסמכים בין אתרים תמנע את כניסת התוכן של הקובץ הזה לזיכרון של התהליך שבו הנגן פועל, כי סוג ה-MIME חסום על ידי חסימה של מסמכים בין אתרים.

לפי מדדי המשתמשים, יש הרבה קובצי JavaScript ו-CSS שנשלחים עם סוגי MIME מסוג text/html או text/plain. כדי למנוע חסימה של משאבים שמסומנים בטעות כמסמכים, Chrome מנסה לרחרח את התגובה כדי לוודא שסוג ה-MIME נכון. הניטור הזה לא מושלם, לכן אם אתם בטוחים שהגדרתם את כותרות ה-Content-Type הנכונות באתר, צוות Chrome ממליץ להוסיף את הכותרת X-Content-Type-Options: nosniff לכל התשובות שלכם.

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

SameSite קובצי cookie

נחזור לדוגמה שלמעלה: <img src="https://yourbank.com/balance.json">. הפעולה הזו פועלת רק אם באתר yourbank.com נשמר קובץ cookie שמתחבר את המשתמש באופן אוטומטי. בדרך כלל, קובצי cookie נשלחים לכל הבקשות לאתר שמגדיר את קובץ ה-cookie – גם אם הבקשה נשלחת על ידי צד שלישי באמצעות תג <img>. קובצי cookie מסוג SameSite הם מאפיין חדש שמציין שקובץ cookie צריך להיות מצורף רק לבקשה שמקורה באותו האתר, ומכאן השם. לצערנו, נכון למועד כתיבת המאמר, רק דפדפני Chrome ו-Firefox בגרסה 58 ואילך תומכים במאפיין הזה.

HTTPOnly וגם document.cookie

אם קובצי ה-cookie של האתר משמשים רק בצד השרת, ולא על ידי JavaScript של הלקוח, יש דרכים למנוע מהנתונים של קובץ ה-cookie להיכנס לתהליך העיבוד. אפשר להגדיר את מאפיין קובץ ה-cookie HTTPOnly, שמונעת באופן מפורש גישה לקובץ ה-cookie באמצעות סקריפט בצד הלקוח בדפדפנים נתמכים, כמו Chrome. אם אי אפשר להגדיר את HTTPOnly, אפשר להגביל את החשיפה של נתוני קובצי ה-cookie של הטעינה לתהליך העיבוד על ידי הימנעות מקריאה של document.cookie, אלא אם זה הכרחי.

כשמקשרים לדף אחר באמצעות target="_blank", לדף שנפתח יש גישה לאובייקט window, הוא יכול לנווט בדף לכתובת URL אחרת, ובלי Site Isolation הוא נמצא באותו תהליך כמו הדף. כדי להגן טוב יותר על הדף, תמיד צריך לציין את הערך rel="noopener" בקישורים לדפים חיצוניים שנפתחים בחלון חדש.

טיימרים ברזולוציה גבוהה

כדי לנצל את Meltdown או Spectre, תוקף צריך למדוד את משך הזמן שלוקח לקרוא ערך מסוים מהזיכרון. לשם כך, נדרש טיימר אמין ומדויק.

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

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

V8

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

שמירה על בטיחות האינטרנט

הייתה הרבה אי-ודאות לגבי הגילוי של Spectre ו-Meltdown וההשלכות שלהם. אני מקווה שהמאמר הזה עזר לכם להבין מה הצוותים של Chrome ו-V8 עושים כדי לשמור על בטיחות פלטפורמת האינטרנט, ואיך מפתחי אינטרנט יכולים לעזור באמצעות שימוש בתכונות אבטחה קיימות. אם יש לך שאלות, אפשר לפנות אליי בTwitter.