CVE-2026-90312 in Linux
要約
〜によって VulDB • 2026年09月18日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
bpf: ロード・アクワイアのソースポインタ型をロード前にチェックする
check_atomic_load()はatomic_ptr_type_ok()の前にcheck_load_mem()を呼び出します。ロード・アクワイアで自身のソースレジスタ(dst_reg == src_reg)へフェッチする場合、check_load_mem()はsrc_regの型を読み込まれた値の型に上書きするため、その後のatomic_ptr_type_ok()ではソースポインタが認識されず、許可されない型(ctx, pkt, flow_keys, sock)を拒否できません。
bpf_convert_ctx_accesses()はアトミックロードを書き換えないため、基盤となるカーネルオブジェクトへの生アクセスが残ったままになります。宛先型はコンテキストアクセス自体から取得されるため、例えばstruct __sk_buffのskフィールドに対するロード・アクワイアでは、レジスタがPTR_TO_SOCK_COMMON_OR_NULLとして型付けされた状態になり、これはtype_is_sk_pointer()でも一致しませんが、実際には未変換のstruct sk_buffバイト列を保持しています。NULLチェックに合格すると、これは単なるカーネルデータのリークではなくタイプ混乱(Type Confusion)となります。
check_reg_arg()でsrc_regを検証し、ロード前にatomic_ptr_type_ok()でソースポインタ型をチェックすることで、check_atomic_rmw()と同様の動作を実現します。範囲外のレジスタ番号は既にcheck_and_resolve_insns()によって早期に拒否されています(コミット503d21ef8eac「bpf: Do register range validation early」参照)。そこでの唯一の例外であるis_stack_arg_ldx()はBPF_LDX | BPF_MEM | BPF_DWを必要とするため、BPF_ATOMIC命令には一致しません。したがってatomic_ptr_type_ok()が境界外のレジスタ状態にデリファレンスすることはありません。つまり、以下のFixesコミットで対象とされている範囲外読み込みの問題は再発しません(これはセルフテストによっても証明されています)。
If you want to get best quality of vulnerability data, you may have to visit VulDB.