鲁莽的修复导致 Linux 内核中的 Spectre 漏洞修复不完整

Grsecurity项目的开发商 共享的 一个警示性的故事,展示了轻率地消除编译器警告如何导致代码中的漏洞。 XNUMX 月底,有人提出了针对 Linux 内核的修复方案,以通过 ptrace 系统调用利用 Spectre 漏洞的新载体。

在测试补丁时,开发人员注意到,在构建时,编译器会显示有关混合代码和定义的警告(结构是在代码之后定义的,为现有变量赋值):

int 索引 = n;
if (n < HBP_NUM) { 索引 = array_index_nospec(索引, HBP_NUM); struct perf_event *bp = 线程->ptrace_bps[索引];

莱纳斯接受了 更正 到你的主分支, 已经摆脱了 通过将变量定义移动到 if 块来避免警告:

if (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = 线程->ptrace_bps[索引];

4.4 月,该修复程序也被移植到稳定内核分支 4.9、4.14、4.19、5.2 和 XNUMX。 稳定分支的维护者也遇到了这个警告,他们没有检查它是否已经在 Linus 的 master 分支中修复,而是自己修复了。 问题是,他们没有认真思考,就只是 感动 定义结构体,以便在定义结构体时不再使用直接提供漏洞保护的 array_index_nospec 调用,并且始终使用变量“n”而不是变量“index”:

int 索引 = n;
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
索引 = array_index_nospec(索引, HBP_NUM);

来源: opennet.ru

添加评论