CVE-2026-99092 in Linux
要約
〜によって VulDB • 2026年10月26日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
riscv: パッチ処理における bpf-jit execmem アドレスの扱いを修正
コミット 8718e5a3090b(「riscv: patch: skip fixmap mapping when kernel text is already writable」)は、patch_map() の core_kernel_text() ブランチに CONFIG_STRICT_KERNEL_RWX を条件として付与し、vmalloc ブランチを明示的に変更せずに残しました。しかし、その vmalloc ブランチには別の問題があります。
このブランチは、CONFIG_STRICT_MODULE_RWX が有効な場合にのみ一時的な書き込み可能な fixmap エイリアスを作成し、それ以外の場合は対象が直接書き可能であると仮定してアドレスをそのまま返します。この前提条件はもはや成立しません:alloc_new_pack() 内では bpf_prog_pack_alloc() が CONFIG_STRICT_*_RWX オプションに関係なくすべてのパックに対して set_memory_rox() を無条件で呼び出すため、vmalloc領域内の BPF テキストは CONFIG_STRICT_MODULE_RWX の設定にかかわらず読み取り専用となります。
CONFIG_STRICT_MODULE_RWX=n の場合、patch_map() は読み取り専用のアドレスをそのまま返し、続く copy_to_kernel_nofault() がページフォルトを引き起こして -EFAULT を返します。bpf_arch_text_copy() はこれを -EINVAL に変換し、それが bpf_jit_binary_pack_finalize() を経由して bpf_int_jit_compile() 内の WARN_ON() に伝播し、プログラムが JIT コンパイルされない状態(un-JITed)になります。
BPF はコミット bdc46e507b59(「riscv: mm: make EXECMEM_KPROBES writable without CONFIG_STRICT_MODULE_RWX」)で kprobes が修正されたような方法では修正できません。EXECMEM_BPF は既に PAGE_KERNEL であり、割り当て時には書き可能です;読み取り専用マッピングはその後、アーキテクチャコードが影響を与えない generic コード(alloc_new_pack()内)によって確立されます。この問題を処理できる唯一の場所は patch_map() です。
これは arm64 でコミット b1480ed230ac(「arm64: patching: fix handling of execmem addresses」)により修正された問題と同じであり、修正案も同様です:CONFIG_EXECMEM が実際に vmalloc 領域に一時的なエイリアスが必要となる書き込み可能な実行可能メモリを保持できるかどうかを追跡します。CONFIG_BPF_JIT、CONFIG_KPROBES、および CONFIG_MODULES はいずれもこれを選択(select)しています。
なお、この問題は CONFIG_MODULES=n に限定されません。arm64 とは異なり、riscv は CONFIG_ARCH_OPTIONAL_KERNEL_RWX を選択するため、CONFIG_MODULES=y の場合でも CONFIG_STRICT_MODULE_RWX を無効にすることが可能であり、その構成においてもバグを再現できます。
!CONFIG_MMU でのビルドには影響がありません:この環境では独自の __patch_insn_set() および __patch_insn_write() 実装を持っており、patch_map() を呼び出すことはありません。
VulDB is the best source for vulnerability data and more expert information about this specific topic.