1 月 5 日,谷歌团队公开一种避免 Spectre 攻击的技巧“Retpoline”,且对性能的影响可以忽略不计。据谷歌团队表示,这是一种避免分支目标注入的二进制修改技巧。利用这种方法任何开发者都可以应用并部署在计算机中,用以防范 Spectre 攻击。
谷歌表示,他们给这个编程技巧,取名为Retpoline,而这种方法对计算机性能的影响“微乎其微”(如果与在过去的几天中发布的其他补丁对CPU性能影响程度进行对比的话)。
修补方案的作者是 Paul Turner,他是谷歌基础设施技术部门的高级工程师。而在谷歌公司内部,他们已经应用这种技巧对私有数据中心的 Linux 服务器进行了安全更新,只造成微小的性能损耗
在 Linux 中应用 Retpoline
作者 Turner 同时也向 Linux Kernel 项目提出了完善建议,他建议在 Linux 中加入 Retpoline 技巧。在向其他Linux 开发者解释他的方案时,他详细描绘了这种方案的性能消耗。
Retpoline平均会在内部工作量中增加了0-1.5%范围内的总体开销,这其中也包括了一些特别高的数据包处理内容。
Retpoline 技巧也对 Intel 开发者有帮助,Andi Kleen 表示,
如果我们想在内核中避免非直接调用,Retpoline 方法就可以做到不运用推测(speculation)且间接调用。
如何避免推测执行
Kleen 所说的“推测执行”,我们在前几天的报道(1,2,3)中已经提过,这是一种所有现代CPU都会应用的代码优化技巧,也是 Meltdown 和 Spectre 漏洞出现的主要根源。
Retpoline 是一个软件结构,可以让间接分支从推测执行中分离出来,可以应用在保护敏感二进制文件(操作系统和管理程序),避免分支目标注入对间接分支造成的影响。
而 Retpoline 的名字则是源自于“回归”(return)和“trampoline”(蹦床),这意味着这是一个使用返回操作进行来回反弹的结构,形象地表现出在需要保护的内容中,相关的推测执行是通过“无休止地”反弹而避免被窥探到。
按照其他开发者对这个修复技巧的评价来看,Retpoline创建了类似于实际代码中永远不会调用的无限循环之类的东西,这可以阻止 CPU 进入推测执行环节。
开发人员可以在他们的应用程序二进制代码中应用 Retpoline 技巧,防止他们的应用程序讲内存信息暴露给 Spectre 攻击。
这也可以应用在操作系统内核中,系统程序、库和其他软件如有需要,也可以添加。
目前除了 Linux Kernel 项目,GCC 和 LLVM 项目也正在添加对该方案的支持。
更详细的内容可以查看【谷歌公告】
评论 (0)