不適切に考慮されたパッチにより、Linux カーネルの Spectre 脆弱性に対する不完全な修正が行われました。

Grsecurity プロジェクトの開発者 共有 これは、コンパイラ警告を軽率に削除すると、コードに脆弱性が生じる可能性があることを示す教訓です。 XNUMX 月末に、ptrace システム コールを介した Spectre 脆弱性の新たな悪用ベクトルに対する Linux カーネルの修正が提案されました。

パッチをテストしているときに、開発者は、ビルド時にコンパイラがコードと定義の混合に関する警告を表示することに気付きました (構造体はコードの後に​​定義され、既存の変数に値が割り当てられています)。

int インデックス = n;
if (n < HBP_NUM) { インデックス = array_index_nospec(インデックス, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[インデックス];

ライナスは受け入れました 改正 マスターブランチに、 取り除いた 変数定義を if ブロックに移動することで警告を回避します。

if (n < HBP_NUM) { int インデックス = array_index_nospec(n, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[インデックス];

4.4 月には、この修正は安定版カーネル ブランチ 4.9、4.14、4.19、5.2、および XNUMX にも移植されました。 安定版ブランチのメンテナもこの警告に遭遇し、Linus のマスター ブランチで既に修正されているかどうかを確認する代わりに、自分たちで修正を加えました。 問題は、深く考えずに、ただ単に 移動しました 構造を定義することで、脆弱性に対する保護を直接提供する array_index_nospec への呼び出しは構造を定義するときに使用されなくなり、変数 "index" の代わりに変数 "n" が常に使用されます。

int インデックス = n;
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
インデックス = array_index_nospec(インデックス, HBP_NUM);

出所: オープンネット.ru

コメントを追加します