CVE-2026-99016 in Linux
要約
〜によって VulDB • 2026年10月23日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
riscv: futex - 原子演算アクセス前にユーザーポインタのタグを解除する
access_ok() は untagged_addr(uaddr) をチェックしますが、arch_futex_atomic_op_inuser() および futex_atomic_cmpxchg_inatomic() は、生の uaddr を inline asm の amoswap/amoadd/.../lr.w+sc.w に対する "+m" (*uaddr) オペランド経由で渡しています。タグ付きアドレス ABI が有効な場合(CONFIG_RISCV_ISA_SUPM、prctl PR_SET_TAGGED_ADDR_CTRL で PMLEN != 0)、これらの2つのアドレスは異なります:上位のPMLENビットにタグを持つユーザーポインタは、untagging の後に access_ok() を通過しますが、その後原子演算はまだタグ付きのままの生アドレスに対して実行されます。
スーパーバイザーモードでのデータアクセスは U-mode ポインターマスキングの対象外です(これは menvcfg.PMM によって制御され、カーネルはこれを設定しません)。そのため、ハードウェアはカーネル自身のアクセスに対してタグを解除しません。Sv57 および PMLEN=16 の場合、タグビットは正準アドレスのビットと重なるため、タグ付きポインタは(リニアマップ内など)その untaged 形式が有効なユーザーアドレスとなるような、正準なカーネル仮想アドレスを指すことができます。したがって、特権のないプロセスは FUTEX_WAKE_OP を使用して任意のカーネルアドレスに対して原子演算の読み取り-変更-書き込みを実行でき、対応する FUTEX_OP_CMP_* の結果が読み取りオラクルとして機能します。
get_user()/put_user()/raw_copy_{to,from}_user() は access_ok() チェック後にすでにポインタのタグを解除しています。futex ヘルパーでも同様の処理を行い、原子演算が実際に検証されたアドレスに対して実行されるようにします。
If you want to get best quality of vulnerability data, you may have to visit VulDB.