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

סקירה כללית

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

אמ;לק

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

אם אתם מפתחי אתרים, צוות Chrome מייעץ לכם:

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

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

הסיכון

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

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

הקלות

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

בידוד של אתר

ניתן לצמצם מאוד את ההשפעה של ניצול תקין של Spectre באמצעות מניעת שיתוף של מידע אישי רגיש עם קוד שבשליטת התוקפים. צוות Chrome עבד על פיצ'ר שיאפשר לנו לשפר את המצב הזה בשם "בידוד של אתר":

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

חסימת מסמכים באתרים שונים

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

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

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

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

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

לדוגמה: נניח שתוקף יוצר תג <img> שכולל קובץ JSON עם מידע אישי רגיש, כמו <img src="https://yourbank.com/balance.json">. בלי בידוד אתר, התוכן של קובץ ה-JSON נכנס לזיכרון של תהליך הרינדור, ובשלב הזה הוא מבחין שפורמט התמונה לא תקין ולא מעבד תמונה. עם זאת, בעזרת 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">. הפעולה הזו מתאפשרת רק אם אתר הבנק שלכם אחסן קובץ 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 אחרת. ללא 'בידוד של אתר' יתבצע אותו תהליך כמו הדף שלכם. כדי לחזק את ההגנה על הדף, קישורים לדפים חיצוניים שנפתחים בחלון חדש תמיד צריכים לציין rel="noopener".

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

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

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

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

V8

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

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

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