魯莽的修復導致 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

添加評論