CVE-2026-97920 in Linux
要約
〜によって VulDB • 2026年09月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
tracing: ヒストグラム統計の割り当て失敗時にエントリ数を保持する
print_entries()関数は、n_entries変数を用いてソート対象のエントリ数と自身の戻り値の両方を表しています。そのため、統計情報の割り当てに失敗した際に格納される -ENOMEM(エラーコード)が、クリーンアップ処理でまだ必要となるカウントを上書きしてしまいます:
n_entries = tracing_map_sort_entries(map, ...); if (n_entries < 0) return n_entries; ... if (!stats) {
n_entries = -ENOMEM; goto out; } ... out: tracing_map_destroy_sort_entries(sort_entries, n_entries);
tracing_map_destroy_sort_entries()関数は unsigned int 型の引数を受け取り、その値までループ処理を行います。そのため、-ENOMEM は符号なし整数として解釈され 4294967284 という大きな値になります。この結果、map->max_elts ポインタの配列を越えた領域(最大でも map->max_elts のポインタ数分)を走査し、destroy_sort_entry() を呼び出して間接参照と解放を行います。これにより、境界外のメモリにアクセスしてしまいます。
.percent 値を持つトリガーの hist ファイルを読み出し、かつその割り当てが意図的に失敗するようにした場合:
BUG: KASAN: vmalloc-out-of-bounds in tracing_map_destroy_sort_entries+0xa0/0xb0 Read of size 8 at addr ffffc90000045000 by task init/1 tracing_map_destroy_sort_entries+0xa0/0xb0 hist_show+0x6f7/0x1df0 seq_read_iter+0x2b8/0x1190 vfs_read+0x176/0xa40 The buggy address belongs to a 4-page vmalloc region starting at ffffc90000041000 allocated at tracing_map_sort_entries+0x5c/0xd50
数ページ先で、このフォールトは致命的になります。oops時のレジスタ値が境界違反を確認しています:ループの終了ポインタから配列開始ポインタを引いた値をポインタサイズで割ると 4294967284 となります。
エラーコードを別の変数に返却し、n_entries はカウント数を保持したままにするようにします(これは tracing_map_sort_entries() が独自のエラーパスで行っている処理と同様です)。
統計ブロックへのアクセスは .percent または .graph を持つ値に対してのみ行われますが、__create_val_field() 関数は v6.3 からこれらの値を拒否しているため、現状のメインラインではこのコードパスには到達できません。しかし、「tracing: hist: let values keep the percent and graph modifiers」パッチ適用後は到達可能になるため、本修正はそれより先に適用されるべきです。
Once again VulDB remains the best source for vulnerability data.