הוצאה משימוש והסרה של ממשקי API ב-Chrome 56

ג'ו מדלי
ג'ו מדלי

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

הסרת התמיכה באישורי SHA-1

אלגוריתם הגיבוב הקריפטוגרפי SHA-1 הציג לראשונה סימנים לחולשה לפני יותר מ-11 שנים, ומחקרים שבוצעו לאחרונה מצביעים על אפשרות קרובה למתקפות שעלולות להשפיע ישירות על תקינות התשתית של מפתח ציבורי באינטרנט (PKI).

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

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

הסרה של הצפנות ECDSA במצב CBC ב-TLS

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

ל-TLS 1.2 נוספו הצפנים חדשים על סמך מפתחות הצפנה, שמאפשרים למנוע את הבעיות האלה, במיוחד AES_128_GCM, AES_256_GCM או CHACHA20_POLY1305. בשלב זה, הדרישה הזו תקפה רק לאתרים המבוססים על ECDSA, אבל היא מומלצת לכל האדמינים. הצפנות המבוססות על AEAD לא רק משפרים את האבטחה, אלא גם מהביצועים. ל-AES-GCM יש תמיכה בחומרה במעבדים (CPU) עדכניים, וב-ChaCha20-Poly1305 אפשר להטמיע תוכנה במהירות. בינתיים, לצפנות CBC נדרשת מיטיגציות מורכבות איטיות וגישה ל-PRNG בכל רשומה יוצאת. הצפנות המבוססות על AEAD הן גם דרישה מוקדמת לאופטימיזציות של HTTP/2 ו-False Start.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

הסרת תנועות המשתמש מגלילה באמצעות מגע

נתקלנו בדוגמאות רבות של מודעות שכתובות בצורה גרועה או מודעות זדוניות, שמפעילות ניווט בגלילות מגע ב-touchstart או בכל האירועים של touchend. אם אירוע 'גלגל' לא יכול לפתוח חלון קופץ, גם גלילה באמצעות מגע לא אמורה לפעול. הפעולה הזו עלולה לגרום לשיבושים מסוימים, כמו מדיה שלא פועלת במגע או חלונות קופצים שלא נפתחים במגע. בכל אחד מהתרחישים האלה, Safari לא מצליח לפתוח חלונות קופצים.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

השבתת כל האחזורים של סקריפטים עם מאפייני סוג/שפה לא חוקיים

נכון לעכשיו, סורק הטעינה מראש של Chrome מאחזר פריטים ברכיבי <scripts> ללא קשר לערך של המאפיין type או language, אבל הסקריפט לא יתבצע כשינותחו. כשמוציאים משימוש את האחזור, הסמנטיקה של הסורק של הטעינה מראש ושל המנתח תהיה זהה, ולכן לא נבצע אחזורים לסקריפטים שלא נשתמש בהם. הפעולה הזו נועדה לשמור נתונים למשתמשים שמנווטים לאתרים עם הרבה תגי סקריפט בהתאמה אישית שעברו עיבוד (כמו type="text/template", לדוגמה).

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

השינוי הזה מתאים את Chrome ל-Safari, למרות ש-Firefox עדיין מבקש סקריפטים ללא קשר לסוג או לשפה.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

הסרה של MediaStreamTrack.getSources()

השיטה הזו כבר לא חלק מהמפרט והיא לא נתמכת על ידי אף דפדפן ראשי אחר. היא הוחלפה ב-MediaDevices.enumerateDevices(), שנתמך ב-Blink ללא דגלים מאז גרסה 47, ונתמכת גם על ידי דפדפנים אחרים. למטה מוצגת דוגמה לכך. הפונקציה getCameras() ההיפותטית הזו משתמשת קודם בזיהוי תכונות כדי למצוא את enumerateDevices() ולהשתמש בו. אם ייכשל זיהוי התכונה, יתבצע חיפוש של getSources() ב-MediaStreamTrack. לבסוף, אם אין תמיכה ב-API מסוג כלשהו, מחזירים את מערך cameras הריק.

    function getCameras(camerasCallback) {
      var cameras = [];
      if('enumerateDevices' in navigator.mediaDevices) {
         navigator.mediaDevices.enumerateDevices()
          .then(function(sources) {
            return sources.filter(function(source) { 
              return source.kind == 'videoinput' 
            });
          })
          .then(function(sources) {
            sources.forEach(function(source) {
              if(source.label.indexOf('facing back') >= 0) {
                // move front facing to the front.
                cameras.unshift(source);
              }
              else {
                cameras.push(source);
              }
            });
            camerasCallback(cameras);
          });
      }
      else if('getSources' in MediaStreamTrack) {
        MediaStreamTrack.getSources(function(sources) {

          for(var i = 0; i < sources.length; i++) {
            var source = sources[i];
            if(source.kind === 'video') {

              if(source.facing === 'environment') {
                // cameras facing the environment are pushed to the front of the page
                cameras.unshift(source);
              }
              else {
                cameras.push(source);
              }
            }
          }
          camerasCallback(cameras);
        });
      }
      else {
        // We can't pick the correct camera because the API doesn't support it.
        camerasCallback(cameras);
      }
    };

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

הסרת הוראה של CSP ממוחזרת-xss

הטיוטות המוקדמות של המפרט של Content Security Policy Level 2 כללו הוראה reflected-xss שלא הציעה יותר מהכותרת X-XSS-Protection, מלבד תחביר שונה. ההוראה הזו הוסרה מהמפרט ב-2015, אבל לא לפני ההטמעה ב-Chrome. אנחנו מסירים את התמיכה בהוראה הזו.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

החלפת הוראת 'גורם מפנה' של CSP

ההוראה referrer של CSP אפשרה לבעלי אתרים להגדיר מדיניות לגורם מפנה מכותרת HTTP. מעבר לכך, שהשימוש בתכונה הזו נמוך מאוד, הוא גם כבר לא חלק ממפרט של W3C.

באתרים שעדיין נדרשת בהם הפונקציונליות הזו, צריך להשתמש ב-<meta name="referrer"> או בכותרת Referrer-Policy החדשה.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium

הסרת השדה PaymentAddress.careOf

בממשק PaymentAddress יש שדה careOf לא סטנדרטי (אין תמיכה בסטנדרטים ידועים של כתובות). גם השדה careOf לא נחוץ, כי השדות של הנמען והארגון תומכים במידה מספקת בכל התרחישים לדוגמה הנדרשים. ההוספה של careOf יוצרת בעיות משמעותיות מבחינת יכולת הפעולה ההדדית עם הסכימות הקיימות של כתובות למשלוח דואר וממשקי API. לדיון מקיף יותר, קראו את ההצעה להסרת המפרט ב-GitHub.

כוונה להסיר | באג ב-Chromium

הסרה של SVGViewElement.viewTarget

המאפיין SVGViewElement.viewTarget לא חלק מהמפרט של SVG2.0, והשימוש בו קטן או לא קיים. המאפיין הזה הוצא משימוש ב-Chrome 54 ועכשיו הוא הוסר.

כוונה להסיר | מעקב אחר הסטטוס של Chrome | באג ב-Chromium