Go Wiki:幽靈
概觀
Go 1.15 新增支援,可啟用程式碼產生調整,以減輕 Spectre 系列 CPU 漏洞中兩個變體的影響。編譯器和組譯器都有新的旗標 -spectre
,會提供要啟用的 Spectre 緩解措施清單,例如 -spectre=index
或 -spectre=index,ret
。特殊情況 -spectre=all
會啟用所有可用的緩解措施。
index
緩解措施可在編譯器中啟用,並變更程式碼產生,以發出針對 Spectre 變體 1(「邊界檢查繞過」)的防護。此緩解措施可確保 CPU 不會存取任意記憶體,方法是在錯誤推測時將索引遮罩為零。此變更通常會使執行速度降低約 5-10%;確切的減速取決於工作負載。
ret
緩解措施可在編譯器和組譯器中啟用,並變更程式碼產生,以發出針對 Spectre 變體 2(「分支目標注入」)的防護。此緩解措施會使用 retpoline 小工具取代每個間接呼叫指令。此變更通常會使執行速度降低約 10-15%;同樣地,確切的減速取決於工作負載。
適用性
在撰寫本文時,我們並未對在 Google 執行的 Go 程式使用任何一種緩解措施,我們也不預期會這麼做。它們包含在 Go 工具鏈中,作為一種「深度防禦」,供有非常特殊使用案例(或極度偏執)的使用者使用。
這些緩解措施僅在針對 Go 程式發動潛在 Spectre 攻擊時才需要,這需要符合以下所有條件。首先,攻擊者必須能夠在與包含機密的受害者 Go 程式相同的 CPU 上執行任意程式碼。其次,攻擊者必須能夠對受害者 Go 程式發出某種 HTTP 或 RPC 要求。第三,這些要求必須觸發潛在的易受攻擊程式碼片段,以推測攻擊者選擇的行為。最常見的情況是使用攻擊者提供的任意整數來索引切片或陣列。這三個條件同時為真的情況非常罕見。
範例
若要在所有套件中啟用這兩個緩解措施(以及任何未來的緩解措施),請使用
go build -gcflags=all=-spectre=all -asmflags=all=-spectre=all program
致謝
感謝 Andrea Mambretti 等人。在發表之前分享他們的論文(連結如下)。感謝他們、Chandler Carruth 和 Paul Turner 提供有益的討論。
參考資料
“Spectre 攻擊:利用推測執行”
由 Paul Kocher 等人撰寫。(明確的論文。)
“推測性緩衝區溢位:攻擊與防禦”
由 Vladimir Kiriansky 和 Carl Waldspurger 撰寫。
“Retpoline:用於防止分支目標注入的軟體結構”
由 Paul Turner 撰寫。
“暫時執行攻擊和防禦的系統性評估”
由 Claudio Canella 等人撰寫。(變體的良好摘要。)
“Spectre 將持續存在:旁路通道和推測執行的分析”
由 Ross McIlroy 等人撰寫。(這些不會消失。)
“Spectre 回來了!使用回傳堆疊緩衝區的推測攻擊”
作者 Esmaeil Mohammadian Koruyeh 等人。(即使回傳預測也不安全。)
「推測載入強化」
作者 Chandler Carruth。(LLVM 如何防止推測性越界存取。)
「透過推測性控制流程劫持繞過記憶體安全機制」
作者 Andrea Mambretti 等人。(探討對記憶體安全語言的影響。)
此內容是 Go Wiki 的一部分。