通俗/光譜

總覽

1 月 3 日,Project Zero 揭露了新型 CPU 中的安全漏洞,程序可用來讀取 (最糟) 任意記憶體,包括不屬於該程序的記憶體。這些安全漏洞的名稱為 SpectreMeltdown。Chrome 採取了哪些做法保護網路安全?網頁程式開發人員該怎麼做?

重點摘要

當使用者上網時,請務必更新作業系統和瀏覽器。此外,Chrome 使用者可以考慮啟用網站隔離

如果你是網頁開發人員Chrome 團隊會提供下列建議:

  • 盡可能使用 SameSiteHTTPOnly Cookie 屬性,並避免從 document.cookie 讀取,以防止 Cookie 進入轉譯器程序的記憶體。
  • 請確認您的 MIME 類型正確無誤,並針對含有使用者特定或敏感內容的任何網址指定 X-Content-Type-Options: nosniff 標頭,以便針對已啟用網站隔離功能的使用者,充分發揮跨來源讀取封鎖的效益。
  • 啟用網站隔離功能,如果造成網站發生問題,請通知 Chrome 團隊

如果您想知道這些步驟為何,請繼續閱讀下文!

風險

這些漏洞有多種原因,因此我現在要不予新增。想瞭解 Google Cloud 團隊如何利用這些安全漏洞,建議您參閱 Google Cloud 團隊成員撰寫的網誌文章

Meltdown 和 Spectre 都允許程序讀取不應讀取的記憶體。有時候,來自不同網站的多份文件最後會導致 Chrome 共用處理程序。如果使用者使用 window.open<a href="..." target="_blank"> 或 iframe 開啟另一個檔案,就可能會發生這種情況。如果網站含有使用者特定資料,其他網站可能會使用這些新的安全漏洞讀取使用者資料。

因應措施

Chrome 和 V8 工程團隊正努力部署以降低這種威脅。

網站隔離

防止機密資料與攻擊者控制的程式碼共用程序,可以大幅降低遭到利用 Spectre 造成的影響。Chrome 團隊一直在努力實現一項名為「網站隔離」的功能:

根據預設,網站隔離功能尚未啟用,因為有一些已知問題,Chrome 團隊想要盡可能進行現場測試。如果您是網頁開發人員,建議您啟用網站隔離,並確認網站是否仍可正常運作。如果要立即啟用,請啟用「chrome://flags#enable-site-per-process」。如果您發現網站無法運作,請回報錯誤,並註明網站隔離功能已啟用,協助我們解決問題。

跨網站文件封鎖

即使所有跨網站頁面都分為不同的程序,網頁仍可正常要求某些跨網站子資源,例如圖片和 JavaScript。為防止機密資訊外洩,網站隔離功能提供「跨網站文件封鎖」功能,可限制傳送至轉譯器程序的網路回應。

網站可以從伺服器要求兩種類型的資料:「文件」和「資源」。以下是文件,包括 HTML、XML、JSON 和文字檔案。網站可以從自身網域或其他具有寬鬆 CORS 標頭的網域接收文件。資源包括圖片、JavaScript、CSS 和字型等資源可以涵蓋任何網站,

在下列情況下,跨網站文件封鎖政策會防止程序接收其他來源的「文件」:

  1. 其中包含 HTML、XML、JSON 或文字/純文字 MIME 類型,以及
  2. 用戶端具有 X-Content-Type-Options: nosniff HTTP 回應標頭或快速內容分析 (「探查」) 可確認類型正確無誤
  3. CORS 未明確允許存取文件

受這項政策封鎖的文件會顯示為空白,但要求仍會在背景中執行。

舉例來說,假設攻擊者建立 <img> 標記,其中包含含有機密資料的 JSON 檔案 (例如 <img src="https://yourbank.com/balance.json">)。如果沒有網站隔離,JSON 檔案的內容會提供給轉譯器程序的記憶體,此時轉譯器會發現其不是有效的圖片格式,因此不會轉譯圖片。不過,使用 Spectre 時,您現在可以讀取該區塊的記憶體區塊。由於跨網站文件封鎖功能會封鎖 MIME 類型,因此這個檔案的內容一律無法輸入轉譯器所執行程序的記憶體。

根據使用者指標,許多 JavaScript 和 CSS 檔案是透過 text/htmltext/plain MIME 類型傳送。為避免封鎖意外標示為文件的資源,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> 標記發出要求也一樣。SameSite Cookie 是新屬性,用於指定 Cookie 只能附加至來自相同網站 (因此名稱) 的要求。很抱歉,在撰寫本文時,只有 Chrome 和 Firefox 58 以上版本支援這項屬性

HTTPOnlydocument.cookie

如果您網站的 Cookie 只在伺服器端使用,而非用戶端 JavaScript,您可以禁止 Cookie 的資料進入轉譯器程序。您可以設定 HTTPOnly Cookie 屬性,以明確禁止在支援的瀏覽器 (例如 Chrome) 上透過用戶端指令碼存取 Cookie。如果無法設定 HTTPOnly,除非絕對必要,否則不要讀取 document.cookie,有助於限制載入 Cookie 資料至轉譯程序的曝光風險。

當您使用 target="_blank" 連結至另一個頁面時,已開啟的網頁可存取 window 物件,可在您的網頁前往其他網址,且不使用網站隔離功能進行網頁隔離。為進一步保護您的網頁,凡是在新視窗中開啟的外部網頁連結,都應一律指定 rel="noopener"

高解析度計時器

攻擊者需要測量從記憶體讀取特定值所需的時間,才能利用 Meltdown 或 Spectre。為了達成這個目標,我們需要一個可靠且準確的計時器。

網路平台提供的一個 API 是 performance.now(),精準度可達 5 毫秒。為緩解問題,所有主要瀏覽器都已降低 performance.now() 的解析度,導致難以掛接攻擊。

取得高解析度計時器的另一種方式是使用 SharedArrayBuffer。專屬工作站會使用這個緩衝區來調高計數器。主執行緒會讀取這個計數器,並將該計數器設為計時器。目前瀏覽器決定停用 SharedArrayBuffer,直到其他因應措施準備就緒為止。

V8

如要利用 Spectre,您必須特製一系列 CPU 指示。V8 團隊已針對已知的攻擊概念驗證採取緩解措施,並致力改善 TurboFan 中的變通機制,讓產生的程式碼即使觸發了這些攻擊,也能確保產生的程式碼安全無虞。不過,這些程式碼產生變更可能會對效能產生負面影響。

維護網路安全

對於「Spectre」和「Meltdown」的發現及其影響,許多不確定性。希望本文說明 Chrome 和 V8 團隊如何保護網路平台安全,以及網頁程式開發人員如何使用現有的安全性功能來提供協助。如有任何問題,歡迎透過 Twitter 與我聯絡。