幽靈漏洞:Visual Studio團隊釋出更全面的修復方案

蠍子

在之前的一篇文章中,我們官宣了可以通過[/Qspectre]編譯開關來緩解幽靈(Spectre)漏洞。這些緩解措施不會顯著地影響應用程序的性能,但是我們發現,它並不能抵禦所有利用幽靈漏洞的攻擊。為了解決這個問題,我們最近添加了兩個新的編譯開關[/Qspectre-load]和[/Qspectre-load-cf]來提供更加完整的幽靈漏洞防護。這兩個開關僅在x86和x64上可用。

這兩個開關在底層會做什麼?

[/Qspectre-load]編譯開關指示編譯器對每一條load指令生成序列化的指令。對於大多數load指令來說,這個開關會在每一條load指令後面添加一條[LFENCE]指令。然而,對於控制流類的指令,這種方法將不能預期的起作用。在大多數情況下,一條指令可以被分割為load指令和控制流指令,因此一條[LFENCE]指令可以插入到load指令之後。對於一些不適用的情況,例如jmp [rax]這類的指令,編譯器將會嘗試採取另外一種修復策略,具體就是:在插入[LFENCE]指令之前就以非析構式(non-destructively)的方式來加載目標。如下圖所示:

幽靈漏洞:Visual Studio團隊釋出更全面的修復方案

[/Qspectre-load-cf]開關則提供了以上行為的一個子集,即僅提供控制流指令的保護,例如JMP, RET和CALL指令。

對於一些性能攸關的代碼片段,可能它們不需要添加上述的保護,對於這種情況,你可以通過語句[__declspec(spectre(nomitigation))]來禁用編譯器添加的額外指令。因為這兩個編譯開關能阻斷所有對於load指令的幽靈漏洞攻擊,它帶來了顯著的性能降級,所以,這個修復措施並不是在所有情況下都適合。

什麼版本的MSVC支持這兩個開關?

自Visual Studio v16.5 Preview 3版本開始支持這兩個編譯開關。在將來的所有Visual Studio發佈版本中,這兩個開關將會在MSVC工具集中可用。

應該如何啟用這兩個開關?

可以在Visual Studio的工程屬性中設置此開關。具體路徑為,工程屬性頁面的[Code Generation]頁面的[Spectre Mitigation]設置項。如下圖所示:

幽靈漏洞:Visual Studio團隊釋出更全面的修復方案

總結

熔斷和幽靈這兩個漏洞告訴我們:

沒有十全十美的事物,包括CPU也是。

但是,我們可以日臻完善,就如同Visual Studio團隊所做的一樣。

還是,加油吧,騷年!


幽靈漏洞:Visual Studio團隊釋出更全面的修復方案


分享到:


相關文章: