Grsecurity專案的開發商 一個警示性的故事,展示了輕率地消除編譯器警告如何導致程式碼中的漏洞。 XNUMX 月底,有人提出了針對 Linux 核心的修復方案,以透過 ptrace 系統呼叫利用 Spectre 漏洞的新載體。
在測試補丁時,開發人員注意到,在建置時,編譯器會顯示有關混合程式碼和定義的警告(結構是在程式碼之後定義的,為現有變數賦值):
int 索引 = n;
如果 (n < HBP_NUM) { index = array_index_nospec(index, HBP_NUM);結構 perf_event *bp = 線程->ptrace_bps[索引];
萊納斯接受了 到你的主分支, 透過將變數定義移動到 if 區塊來避免警告:
如果 (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM);結構 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;
如果 (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
索引 = array_index_nospec(索引, HBP_NUM);
來源: opennet.ru
