不信任的程式碼緩解措施
2018 年初,Google Project Zero 的研究人員揭露 一類新的攻擊,這些攻擊 利用許多 CPU 使用的推測執行最佳化。由於 V8 使用最佳化即時編譯器 TurboFan,讓 JavaScript 執行得更快,因此在某些情況下,它會受到揭露中所述的側頻道攻擊影響。
如果您只執行可信賴的程式碼,則不會有任何變更 #
如果您的產品只使用 V8 的嵌入式執行個體來執行完全由您控制的 JavaScript 或 WebAssembly 程式碼,那麼您使用 V8 可能不受推測側頻道攻擊 (SSCA) 漏洞影響。執行您信任的程式碼的 Node.js 執行個體就是一個不受影響的範例。
為了利用此漏洞,攻擊者必須在您的嵌入式環境中執行精心製作的 JavaScript 或 WebAssembly 程式碼。如果您作為開發人員,完全控制在嵌入式 V8 執行個體中執行的程式碼,那麼這種情況發生的可能性很低。但是,如果您的嵌入式 V8 執行個體允許下載並執行任意或其他不可信的 JavaScript 或 WebAssembly 程式碼,甚至產生並隨後執行不在您完全控制之下的 JavaScript 或 WebAssembly 程式碼(例如,如果它使用其中一種作為編譯目標),您可能需要考慮緩解措施。
如果您執行不可信的程式碼… #
更新至最新的 V8 以受益於緩解措施並啟用緩解措施 #
從 V8 v6.4.388.18 開始,V8 本身提供此類攻擊的緩解措施,因此建議將您嵌入式的 V8 副本更新至 v6.4.388.18 或更新版本。較舊版本的 V8,包括仍使用 FullCodeGen 和/或 CrankShaft 的 V8 版本,沒有 SSCA 的緩解措施。
從 V8 v6.4.388.18 開始,V8 中引入了新的標記,以協助提供防範 SSCA 漏洞的保護。此標記稱為 --untrusted-code-mitigations
,預設在執行階段透過稱為 v8_untrusted_code_mitigations
的建置時間 GN 標記啟用。
這些緩解措施由 --untrusted-code-mitigations
執行階段標記啟用
- 在 WebAssembly 和 asm.js 中,在存取記憶體之前遮罩位址,以確保推測執行的記憶體載入無法存取 WebAssembly 和 asm.js 堆積區以外的記憶體。
- 在 JIT 程式碼中遮罩用於存取 JavaScript 陣列和字串的索引,以確保推測載入無法使用陣列和字串來存取 JavaScript 程式碼不應存取的記憶體位址。
嵌入程式設計人員應注意,緩解措施可能會影響效能。實際影響取決於您的工作負載。對於 Speedometer 等工作負載,影響可以忽略不計,但對於更極端的運算工作負載,影響可能高達 15%。如果您完全信任嵌入式 V8 執行個體執行的 JavaScript 和 WebAssembly 程式碼,您可以在執行階段指定旗標 --no-untrusted-code-mitigations
來停用這些 JIT 緩解措施。v8_untrusted_code_mitigations
GN 旗標可用於在建置階段啟用或停用緩解措施。
請注意,V8 預設會在假設嵌入程式設計人員會使用程序隔離的平台上停用這些緩解措施,例如 Chromium 使用網站隔離的平台。
在個別程序中沙盒化不受信任的執行 #
如果您在與任何敏感資料分開的程序中執行不受信任的 JavaScript 和 WebAssembly 程式碼,SSCA 的潛在影響將大幅降低。透過程序隔離,SSCA 攻擊只能觀察與執行程式碼一起在同一個程序中沙盒化的資料,而無法觀察其他程序的資料。
考慮調整您提供的精準計時器 #
精準計時器會讓觀察 SSCA 漏洞中的側頻道變得更容易。如果您的產品提供不受信任的 JavaScript 或 WebAssembly 程式碼可以存取的精準計時器,請考慮讓這些計時器更粗糙或為它們加入抖動。