通俗/光譜

總覽

在 1 月 3 日,Project Zero 公開的安全漏洞,是指程序可用來讀取 (最差) 任意記憶體 (包括不屬於該程序的記憶體) 的現代 CPU 中的安全漏洞。這些安全漏洞已分別命名為 SpectreMeltdown。Chrome 採取哪些措施來維護網路安全?網頁開發人員應對自己的網站採取什麼行動?

重點摘要;直接回應

使用使用者瀏覽網頁時,請務必讓作業系統和瀏覽器保持在最新狀態。此外,Chrome 使用者可以考慮啟用網站隔離

如果您是網頁開發人員Chrome 團隊的建議如下:

  • 請盡可能使用 SameSiteHTTPOnly Cookie 屬性,並避免讀取 document.cookie,避免 Cookie 進入轉譯器程序的記憶體。
  • 請確認您的 MIME 類型正確無誤,並為所有包含使用者特定或機密內容的網址指定 X-Content-Type-Options: nosniff 標頭,以便為已啟用網站隔離功能的使用者充分運用跨來源讀取封鎖功能
  • 啟用「網站隔離」,如果對網站造成問題,請告知 Chrome 團隊

如果您不清楚這些步驟為何有幫助,請繼續閱讀下文!

風險

關於這些安全漏洞的原因有很多,我不會再新增一個。如果您有興趣瞭解如何運用這些安全漏洞,建議您參閱 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 類型遭到跨網站文件封鎖。

根據使用者指標,許多透過 text/htmltext/plain MIME 類型提交的 JavaScript 和 CSS 檔案。為避免封鎖不小心標示為文件的資源,Chrome 會嘗試擷取回應來確保 MIME 類型正確無誤。這種抽樣功能不完善,因此如果您確定網站的 Content-Type 標頭設定正確無誤,Chrome 團隊建議在所有回應中加入 X-Content-Type-Options: nosniff 標頭。

如果想嘗試跨網站文件封鎖功能,請按照上述說明選擇啟用網站隔離功能。

SameSite 個 Cookie

讓我們回到上方的範例:<img src="https://yourbank.com/balance.json">。只有在 yourbank.com 儲存的 Cookie 會自動讓使用者登入,才適用這個做法。系統通常會針對所有設定 Cookie 的網站傳送要求,即使要求是由第三方使用 <img> 標記提出要求,Cookie 仍會傳送至該網站。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 與我聯絡。