CVE-2026-99016
Beschrijving NL
In de Linux kernel is de volgende kwetsbaarheid verholpen:
riscv: futex: verwijder de tag van de gebruikersaanwijzer voordat de atomaire toegang
access_ok() controleert untagged_addr(uaddr), maar arch_futex_atomic_op_inuser()
en futex_atomic_cmpxchg_inatomic() overhandig de ruwe uaddr aan de inline asm
amoswap/amoadd/.../lr.w+sc.w via de operand "+m" (* uaddr). Wanneer de
Getagde adres-ABI is ingeschakeld (CONFIG_RISCV_ISA_SUPM, prctl)
PR_SET_TAGGED_ADDR_CTRL met PMLEN != 0), die twee adressen verschillen: a
De gebruikersaanwijzer waarvan de bovenste PMLEN-bits een tag bevatten, slaagt voor access_ok() na
ontlabelen, maar de atomaire bewerking wordt vervolgens uitgevoerd op de nog steeds gelabelde ruwe data.
adres. Toegang tot gegevens in supervisormodus is niet onderworpen aan de U-moduspointer.
maskering (die wordt geregeld door menvcfg.PMM, wat de kernel niet instelt),
De hardware verwijdert de tag dus niet voor de eigen toegang van de kernel.
Bij Sv57 en PMLEN=16 overlappen de tagbits de canonieke-adresbits, dus een
Een getagde pointer kan een canoniek virtueel kerneladres benoemen (bijvoorbeeld in de
lineaire kaart) waarvan de ongelabelde vorm een geldig gebruikersadres is. Een kansarme
Het proces kan er dus voor zorgen dat FUTEX_WAKE_OP een atomaire lees-wijzig-schrijfbewerking uitvoert op
een willekeurig kerneladres, met het bijbehorende FUTEX_OP_CMP_* resultaat
dient als leesorakel. get_user()/put_user()/raw_copy_{to,from}_user() hebben de pointer al onttagd.
Na de access_ok() controle, doe hetzelfde in de futex helpers, zodat de
Atomic werkt op het adres dat daadwerkelijk is gevalideerd.
Origineel (Engels) tonen
In the Linux kernel, the following vulnerability has been resolved:
riscv: futex: untag the user pointer before the atomic access
access_ok() checks untagged_addr(uaddr), but arch_futex_atomic_op_inuser()
and futex_atomic_cmpxchg_inatomic() hand the raw uaddr to the inline asm
amoswap/amoadd/.../lr.w+sc.w through the "+m" (*uaddr) operand. When the
tagged address ABI is enabled (CONFIG_RISCV_ISA_SUPM, prctl
PR_SET_TAGGED_ADDR_CTRL with PMLEN != 0), those two addresses differ: a
user pointer whose top PMLEN bits hold a tag passes access_ok() after
untagging, but the atomic is then performed on the still-tagged raw
address.
Supervisor-mode data accesses are not subject to the U-mode pointer
masking (that is governed by menvcfg.PMM, which the kernel does not set),
so hardware does not strip the tag for the kernel's own access. With
Sv57 and PMLEN=16 the tag bits overlap the canonical-address bits, so a
tagged pointer can name a canonical kernel virtual address (e.g. in the
linear map) whose untagged form is a valid user address. An unprivileged
process can thus make FUTEX_WAKE_OP perform an atomic read-modify-write on
an arbitrary kernel address, with the matching FUTEX_OP_CMP_* result
serving as a read oracle.
get_user()/put_user()/raw_copy_{to,from}_user() already untag the pointer
after the access_ok() check; do the same in the futex helpers so the
atomic operates on the address that was actually validated.