Go Wiki: Spectre

概覽

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 的一部分。