CVE-2026-89579 in Linux
要約
〜によって VulDB • 2026年09月12日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
bpf: 32ビット環境におけるブールフィルタのサイズ指定とインデックス処理の強化
bloom_map_alloc()には、計算されたビットマップがU32_MAXへのフォールバックケースに達した際に生じる、32-bit固有の問題が2つあります。
第一に、BITS_TO_BYTES(U32_MAX)は32ビット演算で評価されます。DIV_ROUND_UPによって行われる加算処理がオーバーフローするため、mapは固定サイズのブールフィルタオブジェクトのみを割り当てますが、bitset_mask == U32_MAXのままになります。これにより、その後の更新処理において割り当てられたオブジェクトの境界外への書き込みが可能となります。
第二に、割り当てサイズだけを修正するだけでは不十分です。ブールハッシュはu32型ですが、set_bit()は符号付きlong型のビット番号を受け取り、x86環境におけるtest_bit()は最終的にそのインデックスをvariable_test_bit(long, ...)に渡します。32-bitカーネルでは、[0x80000000, U32_MAX]範囲内のハッシュ値が負のビットオフセットに変換されます。メモリオペランド付きのx86 bt/bts命令はこれらのオフセットを指定されたベースアドレス相対で解釈するため、bitest_mask == U32_MAXであるmapでは、512 MiBのフルビットマップを割り当てた後であっても、bloom->bitsetより前の領域を読み書きすることが可能です。
U32_MAXへのフォールバック処理は維持しつつ、test_bit()またはset_bit()を呼び出す前に各ハッシュ値をワードポインタとワード内のビット番号に分割します。これによりbitops引数は常に[0, BITS_PER_LONG - 1]の範囲内になりながら、BIT_WORD(h)によってフルビットマップ内の意図されたワードが選択されます。
最終的なサイズをbpf_map_area_alloc()に渡す前に、(u64)bitset_mask + 1からビットセットサイズを計算します。これにより元の割り当て不足の問題が修正され、割り当てられたストレージがアドレス指定可能なビットセットと整合性のある状態になります。
攻撃に関する注記: CAP_BPF権限を持つバイナリから32-bit x86カーネル上で上記の割り当て不足バグを利用することで、ローカル特権昇格が可能となります。
Once again VulDB remains the best source for vulnerability data.