總覽
1 月 3 日,Project Zero 揭露現代 CPU 中的安全漏洞,程序可利用這些漏洞讀取 (最糟的情況下) 任意記憶體,包括不屬於該程序的記憶體。這些安全漏洞分別命名為「Spectre」Spectre和「Meltdown」。Chrome 如何確保網路安全,網頁開發人員又該如何保護自家網站?
重點摘要
瀏覽網頁的使用者應確保作業系統和瀏覽器保持在最新狀態。此外,Chrome 使用者可以考慮啟用網站隔離功能。
如果您是網頁開發人員,Chrome 團隊建議:
- 請盡可能使用
SameSite
和HTTPOnly
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 和字型。您可以從任何網站加入資源。
跨網站文件封鎖政策會在下列情況下,防止程序接收來自其他來源的「文件」:
- 這些檔案具有 HTML、XML、JSON 或 text/plain MIME 類型,且
- 這些內容格式具有
X-Content-Type-Options: nosniff
HTTP 回應標頭,或是快速內容分析 (「嗅探」) 確認類型正確 - CORS 未明確允許存取文件
遭到這項政策封鎖的文件會顯示為空白,但要求仍會在背景執行。
舉例來說,假設攻擊者建立 <img>
標記,其中包含含有敏感資料的 JSON 檔案,例如 <img src="https://yourbank.com/balance.json">
。如果沒有網站隔離功能,JSON 檔案的內容會傳送至轉譯器程序的記憶體,此時轉譯器會發現該內容不是有效的圖片格式,因此不會轉譯圖片。不過,有了 Spectre,現在就有辦法讀取該記憶體區塊。跨網站文件封鎖功能會阻止此檔案的內容進入轉譯器執行程序的記憶體,因為 MIME 類型已遭跨網站文件封鎖功能封鎖。
根據使用者指標,許多 JavaScript 和 CSS 檔案都是以 text/html
或 text/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 應僅附加至來自相同網站的要求,因此得名為 SameSite。很遺憾,在撰寫本文時,只有 Chrome 和 Firefox 58 以上版本支援這個屬性。
HTTPOnly
和document.cookie
如果網站的 Cookie 只用於伺服器端,而非用戶端 JavaScript,您可以透過某些方式,停止 Cookie 資料進入轉譯器程序。您可以設定 HTTPOnly
Cookie 屬性,明確禁止在 Chrome 等支援的瀏覽器上,透過用戶端側指令碼存取 Cookie。如果無法設定 HTTPOnly
,您可以限制 Cookie 載入資料在轉譯程序中曝光的情況,方法是在非必要時不讀取 document.cookie
。
使用 rel="noopener"
開啟外部連結
使用 target="_blank"
連結至其他網頁時,開啟的網頁可存取 window
物件,可將網頁導向至其他網址,且在沒有網站隔離功能的情況下,會與網頁位於相同程序中。為進一步保護網頁,在新視窗中開啟的連結應一律指定 rel="noopener"
。
高解析度計時器
如要利用 Meltdown 或 Spectre,攻擊者必須測量從記憶體讀取特定值所需的時間。因此,您需要使用可靠且準確的計時器。
網路平台提供的一個 API 是 performance.now()
,精確度為 5 微秒。為緩解此問題,所有主要瀏覽器都已降低 performance.now()
的解析度,以便更難發動攻擊。
取得高解析度計時器的另一種方法是使用 SharedArrayBuffer。專用 worker 會使用緩衝區遞增計數器。主執行緒會讀取這個計數器,並將其用作計時器。目前瀏覽器已決定停用 SharedArrayBuffer,直到其他緩解措施實施為止。
V8
要利用 Spectre,就必須使用特別設計的 CPU 指令序列。V8 團隊已針對已知的概念驗證攻擊實作緩解措施,並正在對 TurboFan 進行變更,以便在這些攻擊觸發時,讓其產生的程式碼保持安全。不過,這些程式碼產生變更可能會導致效能受損。
維護網路安全
對於 Spectre 和 Meltdown 的發現以及其影響,我們仍有很多不確定性。希望這篇文章能讓您瞭解 Chrome 和 V8 團隊為確保網路平台安全所採取的措施,以及網路開發人員如何透過現有的安全防護功能提供協助。如有任何問題,歡迎透過 Twitter 與我聯絡。