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 程序的潜在幽灵攻击时,这些缓解措施才变得必要,这需要满足以下所有条件。首先,攻击者必须能够在与包含机密的受害者 Go 程序相同的 CPU 上运行任意代码。其次,攻击者必须能够对受害者 Go 程序发出某种 HTTP 或 RPC 请求。第三,这些请求必须触发潜在的漏洞代码片段,以推测攻击者选择的行为。最常见的情况是使用攻击者提供的任意整数对切片或数组进行索引。这三个条件同时成立的情况非常罕见。

示例

要在所有包中启用这两个缓解措施(以及任何未来的缓解措施),请使用

go build -gcflags=all=-spectre=all -asmflags=all=-spectre=all program

致谢

感谢 Andrea Mambretti 等人提前分享他们的论文(链接如下)。感谢他们、Chandler Carruth 和 Paul Turner 提供有益的讨论。

参考文献

幽灵攻击:利用推测执行
作者:Paul Kocher 等人(权威论文)。

推测缓冲区溢出:攻击和防御
作者:Vladimir Kiriansky 和 Carl Waldspurger。

Retpoline:一种用于防止分支目标注入的软件结构
作者:Paul Turner。

瞬态执行攻击和防御的系统评估
作者:Claudio Canella 等人(变体的良好总结)。

幽灵将继续存在:对旁路和推测执行的分析
作者:Ross McIlroy 等人(这些不会消失)。

幽灵归来!使用返回栈缓冲区的推测攻击
作者:Esmaeil Mohammadian Koruyeh 等人。(即使返回预测也不安全。)

推测性加载强化
作者:Chandler Carruth。(LLVM 为防止推测性越界访问所做的工作。)

通过推测性控制流劫持绕过内存安全机制
作者:Andrea Mambretti 等人。(对内存安全语言的影响检查。)


此内容是 Go Wiki 的一部分。